IETF 语言标签

单一的 zh-CN(也是 BCP 47 的写法) 写法已经被废弃,比如 zh-SG 使用简体中文但是不能匹配到。需要加地区代码的情况一般比较少,除非为了强调不同地区汉语使用差异

語言标签是语言代码的缩写表示。由互联网工程任务组 (IETF)的"BCP(Best Current Practice) 47"文档系列定义。现在标准化为RFC 5646 (引用了相关的RFC 5645)与RFC 4647, IANA语言子标签登记。使用的各成分来自ISO 639, ISO 15924, ISO 3166-1, UN M.49.

语言标签由一个或多个子标签(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个字符组成的文本。[10],[11]
  • 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