Intl

Baseline 廣泛可用 *

此功能已成熟,可跨多種裝置和瀏覽器版本使用。自 2017 年 9 月以來,它已在瀏覽器中提供。

* 此特性的某些部分可能存在不同級別的支援。

Intl 名稱空間物件包含幾個建構函式以及國際化建構函式和其他語言敏感函式共有的功能。總而言之,它們構成了 ECMAScript 國際化 API,該 API 提供了語言敏感的字串比較、數字格式化、日期和時間格式化等功能。

描述

與大多數全域性物件不同,Intl 不是建構函式。您不能使用 new 運算子 來使用它,也不能將 Intl 物件作為函式呼叫。Intl 的所有屬性和方法都是靜態的(就像 Math 物件一樣)。

國際化建構函式以及其他建構函式(在 另請參閱 下列出)的幾個語言敏感方法使用一種通用模式來識別 locale 並確定實際使用的 locale:它們都接受 localesoptions 引數,並使用 options.localeMatcher 屬性中指定的演算法來協商請求的 locale(s) 與其支援的 locale(s)。

locales 引數

locales 引數用於確定給定操作中使用的 locale。JavaScript 實現會檢查 locales,然後計算出它所理解的、最接近滿足所表達偏好的 locale。locales 可以是:

  • undefined(或省略):將使用實現的預設 locale。
  • 一個 locale:一個 locale 識別符號或一個包裝了 locale 識別符號的 Intl.Locale 物件。
  • 一個 locale 列表:任何其他值,它將被轉換為一個物件,然後被視為一個 locale 陣列。

在後兩種情況下,實際使用的 locale 是透過 locale 協商 確定的最佳支援 locale。如果 locale 識別符號不是字串或物件,則會丟擲 TypeError。如果 locale 識別符號是語法無效的字串,則會丟擲 RangeError。如果 locale 識別符號格式正確但實現不識別它,則會忽略它,並考慮列表中的下一個 locale,最終回退到系統的 locale。但是,您不應依賴某個特定的 locale 名稱被忽略,因為實現將來可能會新增任何 locale 的資料。例如,new Intl.DateTimeFormat("default") 僅因為 "default" 在語法上有效但未被識別為任何 locale,所以使用了實現的預設 locale。

locale 識別符號是一個由以下部分組成的字串:

  1. 一個 2-3 或 5-8 個字母的語言子標籤
  2. 一個 4 個字母的指令碼子標籤 可選
  3. 一個 2 個字母或 3 個數字的地區子標籤 可選
  4. 一個或多個變體子標籤(所有這些子標籤都必須是唯一的),每個子標籤由 5-8 個字母數字字元組成,或者是一個數字後跟 3 個字母數字字元 可選
  5. 一個或多個 BCP 47 擴充套件序列 可選
  6. 一個私有使用擴充套件序列 可選

每個子標籤和序列都由連字元分隔。Locale 識別符號是區分 ASCII 大小寫的。但是,習慣上對指令碼子標籤使用標題大小寫(首字母大寫,其餘字母小寫),對地區子標籤使用大寫,對其他所有部分使用小寫。例如:

  • "hi":印地語(語言)
  • "de-AT":在奧地利(地區)使用的德語(語言)
  • "zh-Hans-CN":在 China(地區)使用的簡體漢字(指令碼)
  • "en-emodeng":古英語(語言)的“中古英語”方言(變體)

標識語言、指令碼、地區(包括國家)和(很少使用)變體的子標籤在 IANA Language Subtag Registry 中註冊。此登錄檔會隨著時間定期更新,實現可能並非始終是最新的,因此不要過度依賴子標籤的普遍支援。

BCP 47 擴充套件序列由單個數字或字母(“x”除外)和一或多個由連字元分隔的 2-8 個字母數字子標籤組成。每個數字或字母只允許一個序列:"de-a-foo-a-foo" 是無效的。BCP 47 擴充套件子標籤在 Unicode CLDR Project 中定義。目前只有兩個擴充套件具有定義的語義:

  • "u"(Unicode)擴充套件可用於請求對 Intl API 物件的額外自定義。示例:

    • "de-DE-u-co-phonebk":使用德語排序的電話簿變體,該變體將帶變音符號的母音解釋為相應的字元對:ä → ae, ö → oe, ü → ue。
    • "th-TH-u-nu-thai":在數字格式化中使用泰語數字(๐, ๑, ๒, ๓, ๔, ๕, ๖, ๗, ๘, ๙)。
    • "ja-JP-u-ca-japanese":在日期和時間格式化中使用日本歷,這樣 2013 年就表示為平成 25 年,即平成 25。
    • "en-GB-u-ca-islamic-umalqura":使用英式英語和 Umm al-Qura(回曆)歷,其中公曆日期 2017 年 10 月 14 日是回曆日期 1439 年 1 月 24 日。
  • "t"(transformed)擴充套件表示轉換後的內容:例如,從另一種 locale 翻譯過來的文字。目前沒有 Intl 功能考慮 "t" 擴充套件。但是,此擴充套件有時包含巢狀的 locale(無擴充套件):例如,"de-t-en" 中的轉換擴充套件包含英語的 locale 識別符號。如果存在巢狀的 locale,則它必須是有效的 locale 識別符號。例如,因為 "en-emodeng-emodeng" 無效(因為它包含重複的 emodeng 變體子標籤),所以 "de-t-en-emodeng-emodeng" 也無效。

最後,可能出現一個私有使用擴充套件序列,使用字母 "x",後跟一或多個由連字元分隔的 1-8 個字母數字子標籤。這允許應用程式為其自己的私有使用編碼資訊,而這些資訊將被所有 Intl 操作忽略。

options 引數

options 引數必須是一個物件,其屬性因建構函式和函式而異。如果未提供 options 引數或其值為 undefined,則所有屬性都使用預設值。

所有語言敏感的建構函式和函式都支援一個屬性:localeMatcher 屬性,其值必須是字串 "lookup""best fit",它選擇以下介紹的 locale 匹配演算法之一。

Locale 識別和協商

locales 引數指定的 locale 列表,在從中刪除 Unicode 擴充套件後,被解釋為應用程式的優先順序請求。執行時將其與可用 locale 進行比較,並選擇最佳可用 locale。存在兩種匹配演算法:"lookup" 匹配器遵循 BCP 47 中指定的查詢演算法;"best fit" 匹配器允許執行時提供一個至少與請求匹配,甚至可能更適合請求的 locale,而不是查詢演算法的結果。如果應用程式未提供 locales 引數,或者執行時沒有與請求匹配的 locale,則使用執行時的預設 locale。可以使用 options 引數的屬性來選擇匹配器(見下文)。

如果選定的 locale 識別符號具有 Unicode 擴充套件序列,則該擴充套件現在用於自定義構造的物件或函式的行為。每個建構函式或函式僅支援 Unicode 擴充套件定義鍵的子集,並且支援的值通常取決於 locale 識別符號。例如,"co"(排序)鍵僅被 Intl.Collator 支援,並且其 "phonebk" 值僅對德語有效。

靜態屬性

Intl.Collator

用於排序器的建構函式,這些物件允許語言敏感的字串比較。

Intl.DateTimeFormat

用於允許語言敏感的日期和時間格式化的物件的建構函式。

Intl.DisplayNames

用於允許一致翻譯語言、地區和指令碼顯示名稱的物件的建構函式。

Intl.DurationFormat

用於允許 locale 敏感的時長格式化的物件的建構函式。

Intl.ListFormat

用於允許語言敏感的列表格式化的物件的建構函式。

Intl.Locale

用於表示 Unicode locale 識別符號的物件的建構函式。

Intl.NumberFormat

用於允許語言敏感的數字格式化的物件的建構函式。

Intl.PluralRules

用於允許複數敏感的格式化以及複數的特定語言規則的物件的建構函式。

Intl.RelativeTimeFormat

用於允許語言敏感的相對時間格式化的物件的建構函式。

Intl.Segmenter

用於允許 locale 敏感的文字分段的物件的建構函式。

Intl[Symbol.toStringTag]

[Symbol.toStringTag] 屬性的初始值為字串 "Intl"。此屬性用於 Object.prototype.toString()

靜態方法

Intl.getCanonicalLocales()

返回規範化的 locale 名稱。

Intl.supportedValuesOf()

返回一個包含實現支援的唯一日曆、排序、貨幣、編號系統或單位值的排序陣列。

示例

格式化日期和數字

您可以使用 Intl 將日期和數字格式化為特定語言和地區的慣用形式。

js
const count = 26254.39;
const date = new Date("2012-05-24");

function log(locale) {
  console.log(
    `${new Intl.DateTimeFormat(locale).format(date)} ${new Intl.NumberFormat(
      locale,
    ).format(count)}`,
  );
}

log("en-US"); // 5/24/2012 26,254.39

log("de-DE"); // 24.5.2012 26.254,39

使用瀏覽器的首選語言

而不是將硬編碼的 locale 名稱傳遞給 Intl 方法,您可以使用由 navigator.language 提供的使用者的首選語言。

js
const date = new Date("2012-05-24");

const formattedDate = new Intl.DateTimeFormat(navigator.language).format(date);

或者,navigator.languages 屬性提供使用者首選語言的排序列表。此列表可以直接傳遞給 Intl 建構函式,以實現基於首選項的回退 locale 選擇。 locale 協商 過程用於選擇最合適的可用 locale。

js
const count = 26254.39;

const formattedCount = new Intl.NumberFormat(navigator.languages).format(count);

規範

規範
ECMAScript® 2026 國際化 API 規範
# intl-object

瀏覽器相容性

另見