Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
Intl オブジェクトは、 ECMAScript Internationalization API の名前空間であり、ロケールや文化を考慮した幅広いデータや操作を提供します。
Intl オブジェクトは、使い道に強く依存しています。ロケール固有のロジックが要求されるそれぞれの用途に対して、個別のオブジェクトを提供します。現在、以下の機能を提供しています。
ほとんどの Intl API は同様の設計を採用しています(Intl.Locale のみが例外です)。まず、目的のロケールとオプションを指定してインスタンスを作成します。これにより、目的の操作(書式化、照合、区切りなど)を行うための一連のルールが定義されます。その後、format()、compare()、segment() などのメソッドをインスタンスに対して呼び出すと、オブジェクトは渡されたデータに指定されたルールを適用します。
コンストラクターの一般的な形式は次のとおりです。
BCP 47 言語タグ、Intl.Locale のインスタンス、またはそれらのロケール識別子の配列を含む文字列です。undefined が渡された場合、または指定されたロケール識別子のいずれにも対応していない場合は、ランタイムのデフォルトのロケールが使用されます。locales 引数の一般的な方法と解釈については、Intl のメインページにある引数の説明を参照してください。
options 省略可操作の特定の側面をカスタマイズするプロパティが含まれているオブジェクトであり、それぞれの Intl オブジェクトを使用する上で重要な要素です。
ロケールは、Intl のあらゆる動作の基盤となります。ロケールとは一連の慣習の集合であり、Intl API では Intl.Locale オブジェクトによって表されます。言語タグを受け入れるすべての Intl コンストラクターは、Intl.Locale オブジェクトも受け入れます。
それぞれのロケールは、主に 4 つの要素で定義されます。それは、言語 (language)、文字体系 (script)、地域 (region)、そして場合によってはいくつかのバリアント (variants) です。これらを - でその順序でつなぐと、BCP 47 言語タグを形成します。
ロケールには、その具体的な文化圏で使用されている一連の慣習も含まれています。
| 日付や時刻の書式化 | calendar | 日を年、月、週に分け、それらに名前を割り当てるために使用されます。例えば、gregory 暦の "2022-01-01" は、hebrew 暦では "28 Tevet 5782" となります。 | ca |
| hourCycle | 時刻を 12 時間制で表示させるか 24 時間制で表示させるか、また、最小の時の数字を 0 にするか 1 にするかを決定します。 | hc | |
| 数値の書式化、日付、時刻、期間なども含む | numberingSystem | 数値をロケール固有の表記に変換します。通常の 0123456789 システムは、 latn(ラテン)と呼ばれます。多くの場合、それぞれの文字体系には桁ごとの対応による数値表記法がありますが、複数の数値表記法を持つ文字体系もあれば、その文字体系で通常は数字を書かないものもあります(例えば、中国語には独自の hanidec 数値表記法がありますが、ほとんどのテキストでは標準の latn システムが使用されています)。また、特別な変換アルゴリズムが要求されるもの (例えば、ローマ数字 — roman)もあります。 | nu |
| 照合順序 | collation | 一般的な照合順序アルゴリズムを定義します。例えば、ドイツ語の phonebk 照合順序が使用されている場合、"ä" は "ae" として扱われ、"ad" と "af" の間にソートされます。 | co |
| caseFirst | 大文字と小文字のどちらを先に並べ替えるか、あるいは大文字・小文字を区別しないかを決定します。 | kf | |
| numeric | 数値を数値としてソートするか、文字列としてソートするかを決定します。例えば、true に設定すると、"10" は "2" の後にソートされます。 | kn |
Intl.Locale を生成する際、あるいは他の Intl コンストラクターに言語タグを渡す際に、このプロパティを明示的に指定することができます。これを行うのが最適な方法は、言語タグに追加するか、オプションとして指定するかの 2 つです。
Intl.DateTimeFormat を例にとると、以下の 2 つの行はどちらも、ヘブライ暦で日付を書式化するフォーマッターを作成します。
認識されないプロパティは無視されるため、Intl.NumberFormat でも上記とまったく同じ構文を使用することができますが、数値の書式化では calendar プロパティが使用されないため、単に en-US を渡すのと何ら変わりはありません。
これらのロケール設定のデフォルト値を取得するのは少し厄介です。new Intl.Locale("en-US").calendar は undefined を返します。これは、Locale オブジェクトには、渡された情報しか含まれていないためです。デフォルトのカレンダーは、理論的にはそれを使用する API によって異なります。したがって、Intl.DateTimeFormatで使用される en-US のデフォルトカレンダーを取得するには、その resolvedOptions() メソッドを使用することができます。それ以外にも、他のプロパティについても同様です。
Intl.Locale オブジェクトは、2 つの役割を同時に果たします。すなわち、(以上のように)構文解析済みの BCP 47 言語タグを表すことと、そのロケールに関する情報を提供することです。calendar などのすべてのプロパティは、デフォルト値についてデータソースに問い合わせることなく、入力データからのみ抽出されます。一方、このオブジェクトには、ロケールに関する実際の情報を取得するためのメソッド群が用意されています。例えば、getCalendars()、getHourCycles()、getNumberingSystems()、getCollations() の各メソッドは calendar、hourCycle、numberingSystem、collation の各プロパティを補完するものであり、それぞれ、そのプロパティの推奨値の配列を返します。
Intl.Locale のインスタンスには、getTextInfo()、getTimeZones()、getWeekInfo() など、有用な情報を取得するためのメソッドも含まれています。
国際化に関して多くの人が抱く共通の懸念は、「使用するロケールをどのように知るのか」という点です。
最も明白な答えは「ユーザーが推奨するもの」です。ブラウザーは、navigator.languages プロパティを通じて、ユーザーの言語設定を公開しています。これは言語識別子の配列であり、フォーマッターのコンストラクターに直接渡すことができます(これについては後述します)。ユーザーはこのリストをブラウザーの設定で変更できます。空の配列や undefined を同時に渡すことも可能で、いずれもブラウザーのデフォルトのロケールが使用されます。
しかし、これが常に望ましい結果になるとは限りません。Intl フォーマッターで書式化された文字列は、サイトに表示されるテキストのごく一部に過ぎません。ローカライズされたコンテンツの大部分は、サイト開発者であるあなた自身が指定しているものです。例えば、あるサイトが英語とフランス語の 2 言語のみに対応しているとします。日本語圏のユーザーがサイトを訪れ、英語でサイトを利用しようとした場合、英語のテキストの中に日本語の数値や日付が混在していると、戸惑ってしまうでしょう。
通常、ブラウザーのデフォルト言語を使用するのは避けたいところです。サイト全体で提供されているのと同じ言語を使用したいでしょう。もしサイトに、ユーザーの選択を格納するために言語切り替え機能を持っているなら、それを直接使用することができます。
サイトのバックエンドで、ユーザーの Accept-Language ヘッダーに基づいて動的に言語を選択し、それに応じて異なる HTML を返す仕組みになっている場合は、HTML 要素の HTMLElement.lang プロパティを new Intl.NumberFormat(document.documentElement.lang) の形で使用することもできます。
サイトが 1 つの言語でしか提供されていない場合は、new Intl.NumberFormat("en-US") のようにコード内でロケールを同時にハードコーディングすることも可能です。
前述の通り、コンストラクターにロケールの配列を渡して、代替候補のリストを指定することも可能です。navigator.languages を使用した最初の例がこれに該当します。ユーザーが設定した最初のロケールが特定の操作で対応していない場合、次のロケールが試され、ランタイムがデータを保持している要求されたロケールが見つかるまで、この処理が繰り返されます。この処理は手動で行うことも可能です。下記例では、香港中国語の話者が理解できる可能性の高い言語を表すロケールを、詳細度の高い順にリストとして指定しています。これにより、フォーマッターは対応している中で最も具体性の高いロケールを選択します。
対応してすべてのロケールを一覧表示する API はありませんが、ロケール一覧を処理するためのメソッドはいくつかあります。
すべてのオブジェクトに共通する 2 つ目の懸念事項は、「メソッドは何を返すのか?」という点です。返値の構造や型を超えてこの問いに答えるのは困難です。なぜなら、正確に何を返すべきかを定めた規範的な仕様が存在しないからです。多くの場合、メソッドの結果は一貫しています。しかし、出力は実装によって異なることがあり、同じロケール内でも異なる場合があります。このような出力のばらつきは設計上の意図によるものであり、仕様上も許容されています。また、期待した通りの結果にならない可能性もあります。例えば、format() によって返される文字列には、非改行スペースが含まれていたり、双方向制御文字で囲まれていたりする場合があります。Intl メソッドの結果をハードコードされた定数と比較してはならず、ユーザーに表示させるためだけに使用すべきです。
もちろん、この答えでは物足りないと感じるでしょう。ほとんどの開発者は、出力の見た目を制御したいと考えているからです。少なくとも、意味不明な出力によってユーザーが混乱するような事態は避けたいはずです。自動テストであれ手動テストであれ、実際にテストを実施したい場合のためのガイドラインを以下に示します。
Intl の主な用途は、構造化データを表すロケール固有のテキストを出力することです。これは翻訳ソフトに似ていますが、任意のテキストを翻訳させるのではなく、日付、数値、リストなどのデータを受け取り、ロケール固有のルールに従って書式化を行います。
Intl.DateTimeFormat、Intl.DurationFormat、Intl.ListFormat、Intl.NumberFormat、Intl.RelativeTimeFormat の各オブジェクトは、それぞれ 1 種類のデータを書式化します。それぞれのインスタンスは 2 つのメソッドを提供します。
例えば、Intl.NumberFormat オブジェクトの典型的な使用例は次のとおりです。
文字列の書式化を行うために、常にフォーマッターオブジェクトを構築する必要はありません。日常的な使用では、ロケールとオプションを引数として渡して、データに対して同時に toLocaleString() メソッドを呼び出すこともできます。toLocaleString() メソッドは、 Temporal.PlainDate.prototype.toLocaleString()、Temporal.Duration.prototype.toLocaleString()、Number.prototype.toLocaleString() などに実装されています。書式化するデータのドキュメントを参照し、toLocaleString() が対応しているかどうか、またどのフォーマッターオプションに対応しているかを確認してください。
toLocaleString() は、フォーマッターオブジェクトを直接使用するよりも効率が悪い可能性があることに注意してください。toLocaleString が呼び出されるたびに、ローカライズ文字列の巨大なデータベース内を検索する必要があるためです。同じ引数でこのメソッドを何度も呼び出す場合は、フォーマッターオブジェクトを作成し、その format() メソッドを使用する方が適切です。フォーマッターオブジェクトは渡された引数を記憶しており、データベースの一部をキャッシュする可能性があるため、その後の format 呼び出しでは、より制約されたコンテキスト内でローカライズ文字列を検索できるようになるからです。
Intl.DateTimeFormat は、日付と時刻、および日付と時刻の範囲を書式化します。DateTimeFormat オブジェクトは、Date、Temporal.PlainDateTime、Temporal.PlainTime、Temporal.PlainDate、Temporal.PlainYearMonth、Temporal.PlainMonthDay のいずれかの形で日付/時刻の入力を受け取ります。
メモ:> Temporal.ZonedDateTime オブジェクトは、タイムゾーンがすでにオブジェクト内で固定されているため、直接渡すことはできません。Temporal.ZonedDateTime.prototype.toLocaleString() を使用するか、事前に Temporal.PlainDateTime に変換するかしてください。
日付と時刻の形式を地域に合わせて調整する一般的な用途には、次のようなものがあります。
書式化文字列の表示形式を決定するには、まずカレンダー(年、月、週、日の計算に影響します)とタイムゾーン(正確な時刻や、場合によっては日付にも影響します)を選択します。これは、前述の calendar オプション(またはロケール識別子内の -ca- 拡張キー)と、timeZone オプションを使用して行います。
ここでは、calendar と timeZone の設定を組み合わせることで、同じ瞬間がどのように異なる形式で表現されるかを示します。
出力結果は次のようになります。
| 'gregory' | 'America/New_York' | '2021年12月31日金曜日 10時00分00秒 米国東部標準時' |
| 'gregory' | 'Asia/Tokyo' | '2022年1月1日土曜日 0時00分00秒 日本標準時' |
| 'hebrew' | 'America/New_York' | 'AM5782年4月27日金曜日 10時00分00秒 米国東部標準時' |
| 'hebrew' | 'Asia/Tokyo' | 'AM5782年4月28日土曜日 0時00分00秒 日本標準時' |
日付と時刻は、weekday、era、year、month、day、dayPeriod、hour、minute、second、fractionalSecondDigits、timeZoneNameという成分で構成されています。次に、出力にどの要素を含めるか、またそれらをどのような形式で表示するかを決定する必要があります。選択肢は 2 つあります。
これら 2 つの方法のうち、どちらか一方を選択してください。これらは互いに排他的であるため、両方を同時に使用するとエラーが発生します。
基本的に、要素の組み合わせをリクエストすると、DateTimeFormat オブジェクトはリクエストされた要素に一致する「テンプレート」を見ていき、値を一つずつ埋めていくだけで済みます。ただし、すべての要素の組み合わせに事前定義されたテンプレートを持つわけではありません。DateTimeFormat には formatMatcher オプションがあり、これによって、要素をリクエストされたものより詳しくしたり短くしたり、あるいは要素を省略したり追加したりすることで、どのように交渉するかを決定します。かなり技術的な内容になるため、この処理方法をより深く理解するには、Intl.DateTimeFormat() のリファレンスを参照することをお勧めします。
ここでは、要素の書式化を行う一般的な方法をいくつか紹介します。
それ以外にもカスタマイズオプションがあります。例えば、hourCycle オプションを使用すると、時間を 12 時間制または 24 時間制で表示させたり、真夜中や正午を 12:00 または 0:00 と表示させたりすることができます。また、numberingSystem オプションを使用すると、任意の数値を別の表記法で表示させることも可能です。
format() のほかにも、日付や時刻の範囲を書式化する重要なメソッドがもう一つあります。formatRange() です。このメソッドは、同じ型の日付・時刻を 2 つ受け取り、それぞれを書式化した後、区切り文字(ハイフンなど)で結合し、重複する部分を削除します。
数値の書式化は、Intl.NumberFormat オブジェクトを使用して行います。NumberFormat オブジェクトは、数値、文字列、長整数型の値を受け入れます。数値の代わりに文字列や長整数を渡すことで、JavaScript で正確に表せないほど大きすぎる、あるいは小さすぎる数値の書式化を行うことができます。
数値の書式化のローカライズにおける一般的な用途は、次のようなものです。
書式付き文字列の外観を決めるには、まず記数法を選択します(これは数字に使用されている文字に影響します)。記数法の目的については、ロケール情報ですでに説明しています。 もう 1 つ決定する必要があるオプションは style です。これは数値が何を表すかのコンテキストを設定し、他のオプションのデフォルト値に影響を与える可能性があります。値は "decimal"、"percent"、"currency"、"unit" のいずれかです。通貨の書式化を行う場合は、currency オプションも提供する必要があります。単位の書式化を行う場合は、unit オプションも提供する必要があります。
出力結果は次のようになります。
| 'decimal' | '1,234,567.89' |
| 'percent' | '123,456,789%' |
| 'currency' | '$1,234,567.89' |
| 'unit' | '1,234,567.89 m' |
次のグループのオプションは、すべて数値部分の表示形式を指定するものです。まず、非常に大きな値を、より読み取り可能な形で表したい場合があるでしょう。notation オプションを "scientific" または "engineering" に設定すると、どちらも 1.23e+6 のような表記が使用されます。両者の違いは、後者が指数に3の倍数を使用し、仮数(e 記号より前の部分)を 1 から 1000 の範囲に収めるのに対し、前者は指数に任意の整数を使用することができますが、仮数を 1 から 10 の範囲に収めます。同時に、notation を "compact" に設定すると、より人間が読み取り可能な表記を使用することもできます。
出力結果は次のようになります。
| 'scientific' | '1.2E4' |
| 'engineering' | '12E3' |
| 'compact-short' | '12K' |
| 'compact-long' | '12 thousand' |
次に、数値が長くなりすぎないように、数値を丸めることをお勧めします(notation を指定している場合は、仮数部のみが対象となります)。以下に、桁数の設定オプションを記載します。
これらのオプションの正確な相互作用はかなり複雑であり、ここでは網羅する価値はありません。詳細については、桁オプションのリファレンスを参照してください。とはいえ、基本的な仕組みは単純です。まず、保持したい小数点以下の桁数を探し、その後、最後の桁の値に応じて切り捨てまたは切り上げを行い、余分な小数点を丸めます。
出力結果は次のようになります。
| { minimumFractionDigits: 4, maximumFractionDigits: 4 } | '1,234.5679' |
| { minimumSignificantDigits: 4, maximumSignificantDigits: 4 } | '1,235' |
| { minimumFractionDigits: 0, maximumFractionDigits: 0, roundingMode: "floor" } | '1,234' |
| { minimumFractionDigits: 0, maximumFractionDigits: 0, roundingMode: "floor", roundingIncrement: 10 } | '1,230' |
それ以外にもカスタマイズオプションがあります。例えば、useGrouping や signDisplay オプションを使用することができます。これにより、グループ区切り文字("1,234,567.89" の "," など)や符号を表示させるかどうか、またその表示方法をカスタマイズできます。ただし、グループ区切り文字、小数点、符号に使用される文字はロケールに依存するため、直接カスタマイズすることはできない点にご注意ください。
format() の他に、数値の範囲を書式化するためにもう一つ重要なメソッド、formatRange() があります。このメソッドは 2 つの数値表現を受け取り、それぞれを書式化した後、区切り文字(ハイフンなど)で結合し、共通部分を重複排除する場合もあります。
すでに次のようなコードを書いたことがあるかもしれません。
このコードは国際化対応していません。言語によっては、リストの区切り文字がカンマではない場合があります。ほとんどの言語(英語を含む)では、最後のアイテムの前に接続詞が必要です。しかし、単に手動で "and" を追加しただけでは、すべての英語話者にとって正しいとは限りません。なぜなら、英語にはオックスフォードカンマに関する議論があるからです。"apple, banana, and cherry" と "apple, banana and cherry" のどちらが正しいかという問題です。
Intl.ListFormat オブジェクトはこの問題を解決します。このオブジェクトは文字列の配列を受け取り、ロケールに応じた方法でそれらを連結し、結果が結合 (and)、選択 (or)、単位のリストを表すようにします。
それ以外のレイヤオプションについては、 Intl.ListFormat() を確認してください。
Intl.RelativeTimeFormat は、時間差を書式化します。RelativeTimeFormat オブジェクトは、2 つの引数、(符号を問わない)数値と、"day"、"hour"、"minute" などの時間単位の形で相対時間を指定します。
これは複数のことを一度に行います。
その他の例やオプションについては Intl.RelativeTimeFormat() を参照してください。
Intl.DurationFormat は、「3 時間 4 分 5 秒」のような期間の書式化を提供します。これは独自のフォーマッターを持つ単独の操作ではなく、内部で Intl.NumberFormat および Intl.ListFormat を使用してそれぞれの期間の要素を書式化し、リスト区切り文字でそれらを結合します。DurationFormat オブジェクトは、Temporal.Duration オブジェクト、または同じプロパティを持つ単純なオブジェクトの形で期間を受け取ります。
番号付け方式のカスタマイズに加え、期間の書式化オプションでは、それぞれの要素を表示させるかどうか、およびその長さをどのように設定するかを決定します。
それ以外の例やオプションは Intl.DurationFormat() を参照してください。
Intl.Collator オブジェクトは、文字列の比較やソートに役立ちます。このオブジェクトは 2 つの文字列を受け取り、Array.prototype.sort メソッドの compareFn 引数と同様に、それらの相対的な順序を示す数値を返します。
ユーザー向けの文字列を比較する際に、=== や > といった JavaScript の演算子を使用すべきでない理由が数多くあります。
照合には、ソートと検索という 2 つの明確な用途があります。ソートとは、文字列のリストがあり、何らかのルールに従ってそれらを並べ替える場合を指します。検索とは、文字列のリストがあり、問い合わせに一致する文字列を探したい場合を指します。検索を行う際は、比較結果が 0(等しい)かどうかだけに注意を払い、結果の符号には注意を払う必要はありません。
同じロケール内でも、並べ替えの方法にはさまざまなものがあります。例えば、ドイツ語には実際、「電話帳順」と「辞書順」という 2 つの異なるソート順があります。電話帳順では音が強調され、ソート前に "ä", "ö" などの文字が "ae", "oe" などのように展開されたかのように表示されます。
ドイツ語にはウムラウト付きで活用する単語があるため、辞書ではウムラウトを無視して並べ替えるのが合理的です(schon と schön のような、ウムラウトのみが異なる単語を並べる場合を除く)。
Intl.PluralRules オブジェクトは、単語の正しい複数形を選択するのに有用です。このオブジェクトは自動的に単語を複数形に変換するわけではありませんが(例えば、"apple" を渡して "apples" が返ってくることを期待することはできません)、数値に基づいてどの複数形を使用すべきかを指示してくれます。すでに次のような使い方をされているかもしれません。
しかし、この規則をすべての言語に一概に当てはめるのは難しく、特に複数形が多数存在する言語ではなおさらです。複数形の規則に関する一般的な概要については、Intl.PluralRules を参照してください。ここでは、いくつか一般的な用途を紹介するにとどめます。
Intl.Segmenter オブジェクトは、文字列をセグメントに分割するのに有益です。Intl を使用しなくても、UTF-16 コード単位および Unicode コードポイントに基づいて文字列を分割することは可能です。
しかし、お分かりのように、Unicode コードポイントは、人間のユーザーが個別の文字として認識するものと一致するわけではありません。これは絵文字で多くの場合現れる現象であり、単一の絵文字が複数のコードポイントで表されることがあります。ユーザーがテキストを操作する際、書記素とは、削除や選択など、ユーザーが操作できるテキストの最小単位のことです。Segmenter オブジェクトは、書記素単位の区切りができるようにし、文字数のカウントやテキストの幅の測定などで役立ちます。このオブジェクトは文字列を受け取り、反復可能オブジェクト segments を返します。このオブジェクトのそれぞれの要素には、その区間のテキストを表す segment プロパティがあります。
このセグメンターは、単語単位や文単位の分割など、より高レベルの分割処理も行うことが可能です。これらの場合、必然的に言語に依存します。例えば、以下は単語カウントの非常に拙い実装例です。
この問題にはいくつかの問題があります。すべての言語が単語の区切りとして空白を扱うわけではなく、すべての空白が単語の区切りであるわけでもなく、またすべての単語が空白で区切られているわけでもないからです。これを解決するには、granularity: "word" を指定して Segmenter を使用します。その結果、入力文字列が単語と非単語の区間に分割されます。単語数をカウントする場合は、それぞれの区間の isWordLike プロパティを調べて、非単語を除外する必要があります。
単語の区切り機能は、文字ベースの言語でも利用できます。例えば、中国語では複数の文字が 1 つの単語を表しますが、それらの間には空白が挿入されません。この区切り機能は、単語をダブルクリックすることでブラウザーの標準的な単語区切り機能と同じ動作を発生させます。
文の区切りも同様に複雑です。例えば、英語には文の終わりを示す区切り文字が数多くあります("."、"!"、"?" といった具合に)。
なお、このセグメンターは文字を除去することはありません。単に文字列を区間に分割するだけで、それぞれの区間は 1 つの文となります。必要に応じて、その後で句読点を除去することができます。また、現在のセグメンターの実装では、文の分割抑制("Mr." や "Approx." のようなピリオドの後に文が分割されないようにする機能)は対応していないのですが、この機能の対応状況は改善されています。
これほど多くのオプションや動作を紹介したところで、それらをユーザーにどのように提示すればよいか迷うかもしれません。Intl には、ユーザーインターフェイスを構築するための 2 つの便利な API が用意されています。それは、Intl.supportedValuesOf() と Intl.DisplayNames です。
Intl.supportedValuesOf() 関数は、指定されたオプションに対して対応している値の配列を返します。例えば、この関数を使用することで、ユーザーが日付を表示するために選択できる、対応している暦のドロップダウンリストを作成することができます。
しかし、多くの場合、これらの識別子はユーザーフレンドリーではありません。例えば、暦をユーザーの言語で示したり、略語を展開したりしたい場合があります。Intl.DisplayNames オブジェクトは、こうした用途に有益です。これはフォーマッターに似ていますが、テンプレートベースではありません。その代わりに、言語に依存しない識別子からローカライズされた名称への直接的な対応付けを行います。言語、地域、文字体系(BCP 47 言語タグの 3 つのサブフィールド)、通貨、暦、日時フィールドの書式化に対応しています。
次のデモを試してみてください。
This page was last modified on 2026年3月21日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.