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/