选择语言标签

IANA语言子标签注册中心

子标签搜索工具

BCP 47

问题

哪种语言标签适合我?如何选择语言和其他子标签?

在HTML和XML里,语言标签用于指示内容的语言。

语言标签由一个或多个用连字符分隔的子标签组成。子标签有多种类型。

BCP代表“当前的最佳实践”(Best Current Practice),是一系列RFC的永久名称,这些RFC的编号可能会更新。描述语言标签语法的最新RFC是RFC 5646,《用于识别语言的标签》(Tags for Identifying Languages),该版本废弃了较旧的RFC 464630661766

语言标签语法由IETFBCP 47定义。过去你需要查阅各种ISO标准中的代码列表才能找到正确的子标签,而现在只需查看IANA语言子标签注册中心即可。下面我们会描述新的语言子标签注册中心。

本文提供了如何选择语言标签的建议。有关BCP 47中定义的概念的概述,请参阅HTML和XML中的语言标签

回答

访问子标签注册中心

创建语言标签所需的所有子标签都在一个位置,即IANA语言子标签注册中心。这个注册中心包含了一个很长的文本文件,有近八千个条目。

语言标签中的第一个(通常是唯一的)子标签永远都是指定语言的,在BCP 47中被称为主要语言子标签(primary language subtag)。我们在本文档中使用这个术语来表示说明语言的子标签,以区别于“语言标签”,因为后者指的是整个标签。

要查找主要语言子标签,请在IANA语言子标签注册中心中搜索该语言的名称。例如,如果你想把某些内容标记为法语,可以在注册中心查找“French”,结果将显示如下所示的记录:

%%
Type: language
Subtag: fr
Description: French
Added: 2005-10-16
Suppress-Script: Latn
%%

你的搜索将和Description字段相匹配。你需要检查该记录的类型是否为language。最终,你要找的是Subtag字段中的值,也就是fr

本文剩下的部分将提供有关选择主要语言子标签和(如果需要的话)其他类型的子标签的建议。请注意,并非所有有关语言标签的决定都是直截了当的。在某些情况下,用法将决定你应该遵循各种可能性中的哪一种。

有一些工具可以在搜索注册中心时提供额外的帮助,比如语言子标签查找工具

决策一:主要语言子标签

你首先应该选择主要语言子标签,因为通常这就是语言标签所需的全部内容。

阅读BCP 47了解更多信息:

2.2.1 Primary Language Subtag

4.1 Choice of Language Tag

永远记住,黄金法则是让语言标签尽可能短。只有在将语言与上下文中的其他内容区分开来时,才需要向语言标签添加更多的子标签。

在寻找主要语言子标签时,需要记住几件事:

过去,在处理ISO代码列表时,有时一个语言有多个代码,可能有一个双字母代码和一个或两个三字母代码。IANA子标签注册中心里没有这种歧义:每种语言只有一个代码。(如果有ISO双字母代码,就使用这个代码,否则使用三字母代码。)注册中心的维护者会根据ISO标准的进展来协调注册中心的更新。

决策二:扩展语言子标签

BCP 47规范允许在主要语言子标签之后添加一个三字母子标签,称为扩展语言子标签(extended language subtag)(缩写为extlang)。扩展语言子标签的数量较少,而且每个扩展语言子标签都需要与特定的主要语言子标签一起使用(在扩展语言子标签条目的Prefix字段中给出)。

目前只有7种主要语言子标签可以和扩展语言子标签一起使用。其中6个的Scope字段在注册中心中是macrolanguagearkokmsswuzzh),另一个是sgn

要考虑的包括:

作为一个例子,Unicode的CLDR数据库使用宏语言zh表示官话(现代标准汉语),使用ku表示库尔德语。因此,对于官话,你将使用zh,而不是cmn;对于北库尔德语,你将使用ku-Latn而不是kmr-Latn。不过CLDR数据库不支持扩展语言子标签,所以需要用yue而不是zh-yue来表示广州话。

决策三:文字子标签

只有在标签中标明文种会添加一些有用的区分信息时,才应该在语言标签中使用文字子标签。通常这是因为一种语言是用多种文字编写的,或者因为内容被改写成了该语言不常见的文字(人们可能会用ru-Latn标签来表示用拉丁字母写的俄语)。

阅读BCP 47了解更多信息:

2.2.3 Script Subtag

4.1 Choice of Language Tag

文字子标签始终为4个字母,并且必须位于语言或扩展语言子标签之后,其他子标签之前。

选择文字子标签时需要注意如下事项。

决策四:地区子标签

地区子标签将你选择的语言子标签和某一个特定的地区相关联。地区子标签必须位于语言子标签和文字子标签的后面。

和文字子标签一样,只有当地区子标签在特定上下文中提供的信息可以区分该语言标签和其他语言标签时,才应该使用。

阅读BCP 47了解更多信息:

2.2.4 Region Subtag

4.1 Choice of Language Tag

例如,en-GB对于拼写检查来说可能有用,但ja-JP中的地区子标签没有太大的用处,除非你想将其与世界其他地区使用的日语进行对比。

地区子标签有两种类型:双字母代码和三数字代码。三数字代码主要用于表示包含多个国家的地区,而不是某个国家。比如,es-ES表示西班牙使用的西班牙语,而es-419表示拉丁美洲使用的西班牙语。

决策五:变体子标签

同样,只有在内容上下文中需要将此语言标签和另一个类似标签区分开来时,才应使用变体子标签。

阅读BCP 47了解更多信息:

2.2.5 Variant Subtags

4.1 Choice of Language Tag

变体子标签包含其他子标签没有包含的区别,通常包括方言、书面变体(例如拼写改革)、标音等等。变体子标签通常为5到8个字符长,可以包含字母和/或数字,但也有一些4位数字的子标签(通常代表年份)。变体子标签必须位于语言、文字和地区子标签之后。

使用变体子标签时要注意的关键点是它们的使用顺序。

决策六:扩展子标签

阅读BCP 47了解更多信息:

2.2.6 Extension Subtags

4.1 Choice of Language Tag

扩展子标签是扩展语言标签的单字符子标签。迄今为止,只有一个扩展子标签:子标签u由Unicode联盟注册,用于添加有关语言(language)或区域设置(locale)行为的信息。许多区域设置标识符需要针对语言、文化、地区或其他因素进行额外“定制”。该扩展提供了一种在语言标签内使用这些附加定制并进行一般交换的机制。

例如,以下内容表示应用应该使用电话本中的排序规则。

u-扩展在RFC 6067中定义,而RFC 6067指向Unicode联盟的公共区域设置数据存储库(Common Locale Data Repository, CLDR),以获取有关其后面的子标签的详细信息,BCP 47并未定义它。

决策七:私用子标签

阅读BCP 47了解更多信息:

2.2.7 Private Use Subtags

4.1 Choice of Language Tag

私用子标签不会出现在注册中心,而是由使用它们的各方之间的私人协议制定和维护。它们由单字符子标签(singleton)x引入。请注意,单字符子标签之后的任何子标签的长度都不能超过8个字符,但可以使用多个子标签。

旧版标签

阅读BCP 47了解更多信息:

4.1 Choice of Language Tag

旧版标签(grandfathered tag)是为了向后兼容而提供的特殊标签。它们是在RFC 4646之前注册的标签,无法完全由当前注册中心中的子标签组成,或者不符合当前为语言标签定义的语法。

几乎所有旧版标签都已经被注册中心中的子标签或一系列子标签所取代。此类旧版标签现已弃用,通常有一个Preferred-Value字段,指示用户该如何表示这个语言。比如,注册中心中的旧版标签art-lojban条目中提到你应该使用jbo语言子标签。

请注意,旧版标签的前面和后面不应附加其他子标签。