IETF语言标签

**語言標籤**是語言代碼的縮寫表示，例如 _en_ 表示英語，_pt-BR_ 表示巴西葡萄牙語。由網際網路工程任務組（IETF）的「BCP 47」文檔系列定義。現在標準化為 RFC 5646（引用了相關的 RFC 5645）與 RFC 4647，_IANA 語言子標籤登記_。使用的各成分來自 ISO 639、ISO 15924、ISO 3166-1 以及 UN M.49。

這種語言標籤用於許多現代的計算標準，包括 IETF 的網際網路協議如 HTTP、XML 以及 PNG、SGML、Unicode、ANSI 以及 ECMA。Microsoft 的 Windows 作業系統使用它代替過時的 LCID，來表示 locale。

## 歷史

IETF 語言標籤的最早版本是 1995 年 3 月發布的 RFC 1766。使用 ISO 639 的 2 字母語言代碼，ISO 3166 的 2 字母國家地區代碼，允許登記的標籤攜帶 variant 或書寫文字子標籤。

2001 年 1 月發布 RFC 3066, 使用 ISO 639-2 的 3 字母語言代碼。

2006 年 9 月發布 RFC 4646 (規範的主體) 與 RFC 4647 (處理匹配行為)。RFC 4646 增加了使用 ISO 15924 的 4 字母書寫文字代碼與 UN M.49 的 3 數字地理分區碼。

2009 年 9 月發布 RFC 5646，引入了 3 字符碼的 ISO 639-3 與 639-5 作為語言子標籤。

## 語言標籤的語法

語言標籤由一個或多個子標籤（subtags）組成，用連字號 (-) 分隔。子標籤只能由基本拉丁字母或數字組成。子標籤出現順序：

* 一個主語言子標籤（primary language subtag），ISO 639-1 (2002) 的 2 字母語言代碼，ISO 639-2 (1998) 或 ISO 639-3 (2007) 或 ISO 639-5 (2008) 的 3 字母語言代碼，BCP 47 登記的 5 到 8 個字母的語言代碼。應保持同樣的大小寫。
* 最多 3 個可選的 _extended language subtags_，每個由 3 字母組成。實際上還沒有使用。
* 1 個可選的文字子標籤（script subtag），ISO 15924 的 4 字母書寫文字代碼，通常是 title case。
* 1 個可選的地區子標籤（region subtag），ISO 3166-1 alpha-2 的 2 字母地區代碼 (通常大寫)，或 UN M.49 的 3 數字地理區代碼。
* 可選的 _variant subtags_，每個為 5 至 8 個字母，或者 4 字母後跟 1 個數字。由 IANA 登記。
* 可選的 _extension subtags_，每個為單字符（不允許「x」）開始（這稱為 singleton），後跟連字符與 2 至 8 個字符組成的文本。,
* 1 個可選的 _private-use subtag_, 每個為 _x-_後跟 1 至 8 個字符組成文本。

例外情況是 _x-_前綴開頭的私用語言標籤，向後兼容的 grandfathered 語言標籤（包括 _i-_前綴與以前登記的老的語言標籤）。

上述未指明的子標籤應該小寫。實際上整個語言標籤是大小寫無關的。

可選的 script 與 region 子標籤如果沒有提供可辨識信息，則將被忽略。例如拉丁字母拼寫的西班牙語 _es-Latn_，日本的日語 _ja-JP_。

並不是所有語言區域都有有效的區域子標籤：主語言的國內方言區被登記為 variant 子標籤。例如，_valencia_ variant 子標籤用於加泰隆尼亞語的巴倫西亞語方言。由於該方言幾乎只用於西班牙國內，區域子標籤 _ES_ 通常忽略。

宏語言（macrolanguage）中的語言代碼或者直接用語言子標籤表示，如普通話 _cmn_；或者用語言 - 擴展子標籤的組合，如 _zh-cmn_。

手語用擴展子標籤，前綴為 _sgn_。

## 與其他國際標準的關係

雖然源自 ISO 或 UN 的標準，但並不是嚴格遵循。特別是 ISO 639, ISO 15924, ISO 3166, UN M.49 等標準撤回某些編碼，甚至改變某些編碼所指的時候，RFC 4646 規定語言標籤仍然保持最初含義不變。

### ISO 639-3 與 ISO 639-1

RFC 4646 之前登記的語言標籤現在分為 "grandfathered" 或 "redundant"，視其是否滿足目前的語法而定。並且是過時的。現在採用 ISO 639-3 語言子標籤。例如，_nan_ 取代了 _zh-min-nan_ 表示閩南語；_hak_ 取代了 _i-hak_、_zh-hakka_ 表示客家話；_ase_ 取代了 _sgn-US_ 表示美國手語。

### ISO 639-5 與 ISO 639-2

ISO 639-5 使用 3 字母表示一個語言群中所有的語言。而 ISO 639-2 使用 3 字母表示一個語言群中沒有獨立語言標籤的那些語言。例如，ISO 639-2 代碼 _afa_ 表示 "Afro-Asiatic (Other)"，不包含阿拉伯語。而 ISO 639-5 中的這個代碼表示 "Afro-Asiatic languages"，包含亞非語系所有語言。這一變化發生在 2009 年。

ISO 639-5 為了向後兼容 ISO 639-2，對於這些老的代碼，定義了 grouping type attribute。

BCP 47 定義了 "Scope" 屬性用於語言集子標籤的辨別。但是沒有定義任何 inclusive 或 exclusive 屬性，也沒有使用 ISO 639-5 的 grouping type attribute。

ISO 639-5 沒有定義哪些語言屬於某個語言集。因此 RFC 5646 不建議使用語言集，除非是那些非特定的語言集，如 "Multiple languages" 與 "Undetermined"。

### ISO 15924, ISO/IEC 10646 與 Unicode

某些主語言子標籤攜帶了屬性 "Suppress-Script"，通常某個書寫系統適用於該語言。因此會忽略 script 子標籤。例如，_yi_ 取代了 _yi-Hebr_ ，因為意地緒語總是使用希伯來字母書寫。

另一個例子，_zh-Hans-SG_ 可被認為等價於 _zh-Hans_，因為新加坡簡體中文與其他簡體中文幾乎一樣。但是，這裡的 script 子標籤顯然是有意義的。

### ISO 3166-1 與 UN M.49

當語言的地區方言有專門的子標籤，這比使用地區子標籤更優。例如，_ar-DZ_ 應該被 _arq_ 代替來表示阿爾及利亞阿拉伯語。

## 擴展

_Extension_ 子標籤（不要與 _extended_ 語言子標籤混淆）允許附加額外的信息，如 locale，calendar，currency。

至 2014 年 1 月已經分配了兩種擴展。

### Extension T

2012 年 2 月，Unicode Consortium 在 RFC 6497 發布了 Extension T 用於語言標籤包含信息關於音譯（transliterated），轉寫（transcribed），變換（transformed）。例如，_en-t-jp_ 用於從日語翻譯到英語。

### Extension U (Unicode Locale)

2010 年 12 月，統一碼聯盟在 RFC 6067 發布了 Extension U，允許在通用當地數據儲存庫中嵌入了寬屬性，表示很多區域設置數據集。

例如：

* _ar-u-nu-latn_ 表示阿拉伯語使用阿拉伯數字 (0 至 9) 代替阿拉伯文數字 (٠至٩)
* _he-IL-u-ca-hebrew-tz-jeruslm_ 表示以色列的希伯來語，使用希伯來曆，時區信息資料庫中的 "Asia/Jerusalem" 時區。

## Windows 作業系統的使用

Windows Vista 及以後版本，採用 RFC 4646 作為 locale 標籤，字符串最大長度 85，包含了結尾的零字符。

只有語言子標籤，稱為中立 locale（neutral locale）。加上地區子標籤，稱為 specific locale。格式為 <language>-<Script>-<REGION>，例如 "uz-Latn-UZ" 表示烏茲別克斯坦的使用拉丁字母的烏茲別克語。

排序規則應寫為 <language>-<Script>-<REGION>\_<sort order>

## 參見

* 國際化與本地化
* Locale
* 語言代碼

## 參考文獻

## 外部連結

* BCP 47 Language Tags（頁面存檔備份，存於網際網路檔案館） – current specification (contains two RFCs, RFC 5646 and RFC 4647 published separately at different dates, but concatenated in a single document)
  * (also referencing the related informational RFC 5645, which complements the previous informational RFC 4645, as well other individual registration forms published separately by others for each language added or modified in the Registry between these BCP 47 revisions)
* Language Subtag Registry（頁面存檔備份，存於網際網路檔案館） – maintained by IANA
* Language Subtag Registry Search（頁面存檔備份，存於網際網路檔案館） – find subtags and view entries in the Registry
* Language tags in HTML and XML（頁面存檔備份，存於網際網路檔案館） – from the W3C
* http://www.langtag.net/（頁面存檔備份，存於網際網路檔案館）