如何设置网页头部的语言声明

39 sec read

们经常需要用缩写的代码来表示一种语言,比如用en表示英语,用de表示德语。ISO 639就是规定语种代码的国际标准。最早的时候,ISO 639规定的代码是,用两个拉丁字母表示一种语言,这被称为ISO 639-1。但是,两个拉丁字母最多只有26^2=676种组合,而世界上已知的语言总数可能有六七千种,因此明显是不够的。所以,后来又规定了ISO 639-2,用三个拉丁字母的组合表示一种语言。

常见语言的ISO 代码如下表:

iso-639

完整的语言代码表请看这里
但是只规定语种代码还不够,在同一种语言中,往往还包括许多种变体,比如中文分为简体中文和繁体中文两种,因此还必须规定子代码。
以往,人们常用zh-CN表示在中国大陆地区使用的中文,也就是简体中文,用zh-TW表示在台湾地区使用的中文,也就是繁体中文。但是,这种表示法很不完善,试问中国大陆地区出版的繁体中文书籍,应该如何用代码表示呢?
于是就有了语言的标签表示法的国际标准RFC 4646,名称是《Tags for Identifying Languages》。
简单说,这个文件规定,一种语言的标签应该按照如下方式排列:
language-script-region-variant-extension-privateuse
  • language:这部分就是ISO 639规定的代码,比如中文是zh。
  • script:表示变体,比如简体汉字是zh-Hans,繁体汉字是zh-Hant。
  • region:表示语言使用的地理区域,比如zh-Hans-CN就是中国大陆使用的简体中文。
  • variant:表示方言。
  • extension-privateus:表示扩展用途和私有标识。

一般约定,language标签全部小写,region标签全部大写,script标签只有首字母大写。不同标签之间用连字号-链接。下面列出一些与中文有关的语言标签。

  • zh-Hans 简体中文
  • zh-Hans-CN 大陆地区使用的简体中文
  • zh-Hans-HK 香港地区使用的简体中文
  • zh-Hans-MO 澳门使用的简体中文
  • zh-Hans-SG 新加坡使用的简体中文
  • zh-Hans-TW 台湾使用的简体中文
  • zh-Hant 繁体中文
  • zh-Hant-CN 大陆地区使用的繁体中文
  • zh-Hant-HK 香港地区使用的繁体中文
  • zh-Hant-MO 澳门使用的繁体中文
  • zh-Hant-SG 新加坡使用的繁体中文
  • zh-Hant-TW 台湾使用的繁体中文

zh 是中文,代表的是宏语言(Macrolanguage),zh 单独用表示中文整体,可以是方言、文言文、简繁体等混合内容,毕竟大陆地区大部分人都能认识不少繁体字,台湾地区大部分人也能认识很多简体字。理论上 zh-CN 表示的是中国大陆中文,包含方言和简繁体,但默认指简体普通话,局限性就体现出来了,没法表达繁体普通话,这时为了精准性,应该用独立语种替换,包括但不仅限于普通话和七大方言:

  • cmn 普通话(官话、国语)
  • wuu 吴语(江浙话、上海话)、czh 徽语(徽州话、严州话、吴语-徽严片)
  • hak 客家语
  • yue 粤语(广东话)
  • nan 闽南语(福建话、台语)、cpx 莆仙话(莆田话、兴化语)、cdo 闽东语、mnp 闽北语、zco 闽中语
  • gan 赣语(江西话)
  • hsn 湘语(湖南话)
  • cjy 晋语(山西话、陕北话)

目前,最新的语言标签标记法的国际标准是IETF的BCP 47(Best Current Practice),也就是RFC 5646取代了之前的RFC 4646

RFC 5646和之前版本的区别:

  • 所有子标签都在IANA registry查询。
  • 所有子标签有固定的位置和长度。
  • 描述更具灵活性。

RFC 5646规定语言标签按以下形式排列:

  • language-extlang-script-region-variant-extension-privateuse
  • 语言文字种类-扩展语言文字种类-书写格式-国家和地区-变体-扩展-私有
所有语言标签都是大小写无关的,但是依照惯例 language 标签小写,region 标签大写,script 标签首字大写。

bcp47中语言tag的BNF语法定义在的第三、四页:

规范的语言tag必须是符合3种情况其中的一种。第二种的私有定义我们就不讨论了,而第三种为了兼容和过渡,比如zh-xiang。我们只关注第一种情况:看看langtag的定义:

“ langtag”定义中很明确:“language”是必须的,后面“script”,“region”,“variant”都为可选,且必须使用-分隔,“varient”可以出现0次或无数次,而“script”等只能出现0或1次。

这个最重要的“language”的定义有三种情况:使用最短ISO 639代码2个或3个字符(注意这个最短!!)加可选的“extlang”(3个字符长度的ISO 639-3代码)。language必须优先考虑ISO 639-1中的代码,如果没有则选择639-2中三位的,如果有extlang,那extlang必须使用ISO 639-3中的代码和扩展预留。

另外两种“language”的定义,一个是必须4个字符长度保留,另一个是5到8个字符的subtag。subtag其实就是一个符合language的定义,因为extlang的扩展可以出现0到2次,所以subtag的字符长度可能是5-8之间。

语言文字标签示例:

附注:

  1. 以下写法已于 2009 年废弃,请勿使用,cmn、wuu、yue、gan 等已由 2005 年的 extlang 升级到 2009 年的 language,请直接去掉 zh- 前缀即可:
  2. 以下写法已于 2009 年废弃,不推荐使用,请用 cmn 替代 zh 即可:
  3. 以下两种写法均正确,使用时更推荐后者,但目前浏览器和操作系统都只支持前者,前端和码农为了兼容性请使用前者:
  4. 同是简体中文页面, 默认或书面语均标记为 cmn 普通话,全文使用地方方言表达时,使用相应语言文字标签标记,例:
  5. 一般情况不用 region 选项,但如果要针对特定地区特定用语的友好性,则应设置区域,例 :
打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

C语言学习:size_t

在学习C语言的时候,遇到了一个新的数据类型size_t,截止目前也没有完全理清这个类似的具体场景及出现的原因。
44 sec read

C语言学习:main()函数的正确写法

C语言虽然是一门古老的语言,但是其标准一直在完善,所以很多以前支持的语法在到当前已经不能在使用了。 C语言的版
41 sec read

Scipy数学函数的Scala实现

最近在推进项目的时候,遇到需要将线下的Python代码转化成线上的集群代码,由于机器代码环境是Scala,所以
4 min read

发表评论

电子邮件地址不会被公开。 必填项已用*标注