IETF語言標籤

語言標籤是語言代碼的縮寫表示，例如en表示英語，pt-BR表示巴西葡萄牙語。由網際網路工程任務組（IETF）的「最佳當前實踐 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）中的語言可使用 ISO 639-3 拆分出來的語言代碼來區分，如漢語官話 cmn（Chinese Mandarin）而非漢語族 zh 或 zho（Zhōngwén）。或者用語言和擴展子標籤的組合，如 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。格式為--，例如"uz-Latn-UZ"表示烏茲別克斯坦的使用拉丁字母的烏茲別克語。

排序規則應寫為--_

## 外部連結

- 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/