日期:2013-11-18  浏览次数:20926 次

当我开始XHTML 1.1的时候,我不断不知道应该在xml:lang上写什么好,我想使用中文,它的值是zh、zh-cn/zh-CN还是gb2312/gbk/gb18030或者utf8?通常遇到问题我都优先Google中文,无法也是找不到答案。看到一些权威的网站上使用gb2312,我还差点置信了,但依据我使用Linux中设置言语的经验,我直觉通知我这是错误的。于是开始了把范围缩小到W3C中去Google,找到了Tutorial: Using language information in XHTML, HTML and CSS (DRAFT),细阅,终于走出误区,愿将经验与大家分享。

照旧是翻译,但这篇文章太长了,而且还有许多我们用不着的信息,这次我只选择了部分,希望能把问题说清楚就好。

声明文档与文本言语

为什么要声明言语

关于文档言语的信息对于屏幕阅读器和易用性都极为重要,从一开始就有利。这些程序需求了解它们能否能从文本中生成输出,或者能否需求转到不同的言语模式。

标记言语信息也对使用恰当的款式变更有好处。比如,需求改变字体来调理不同字符,依据言语来生成不用的引号等等。

有的浏览器使用言语信息为中文简体,中文繁体,日文和韩文来侦测适合的字体。但是,在一个使用Unicode编码的页面中,这些言语可能共享相反的表意字符内码。操这些言语的人可能在使用这些字符上的一些小细节上有所不同。下面的插图演示了仅仅改变言语标签,在Mozilla上的文本的效果:

同一表一字符在不同言语中的外形

标记言语信息也允许你使用脚本提取指定言语的元素。举个例子,使用XSLT lang()函数可以从一个文件中提取指定言语的文本,或者在XSL-FO转换的时候使用言语指定款式。

在许多的案例中,第一次开发内容时,你可能不会认识到这些使用的重要性,虽然它们在创建的时候普通非常容易添加,这就会在需求款式翻新时遇上麻烦。

另外,一些为言语标签标记的程序还在晚期开发或者缺乏中,但是,从如今起你就应该为你的内容添加言语信息,以便在技术成熟的时候收获未来的好处。
总体上一直为文档在<html>标签中声明言语

HTML文档总体上应该声明文档的言语,可以通过在html标签中添加lang属性来实现。比如,下面声明了一个使用加拿大法语(Canadian French)的文档:

<html lang="fr-CA">

稍后我们会更具体地讲述如何为言语属性指定值。

当把XHTML伺服为text/html,你应该在html元素中都使用lang属性和xml:lang属性。xml:lang属性是在XML中确定言语信息的标准用法。以下演示你应该如何标记先前以text/html伺服的XHTML 1.0的例子:

<html lang="zh-CN" xml:lang="zh-CN" xmlns="http://www.w3.org/1999/xhtml">

xml:lang属性在处理HTML文件时并没有实际用途,但从lang属性承继过来意味着你要使脚本或校验器把该文档当作XML。

如果你以XML(比如,使用像applications/xhtml+xml的MIME类型)或者XHTML 1.1来伺服XHTML的话,你不再需求lang属性,由于它曾经跟HTML言语分离了。单独的xml:lang属性就已足够。

<html xml:lang="zh-CN" xmlns="http://www.w3.org/1999/xhtml">

一直声明文本的言语变更

在与内容次要言语不同的文本中,应该指出该文本的言语。方法跟与总体上一直为文档在<html>标签中声明言语这一节相反——使用lang或者xml:lang属性。例如,在HTML中你可以写作:

<p>The French for <em>Cat</em> is <em lang="fr">chat</em>.</p>

lang属性可以用在除applet、base、basefont、br、frame、frameset、iframe、param和script之外的任何HTML元素上。

又,以text/html伺服的XHTML 1.0,可以一同使用两个属性,比如:

<p>The title in Chinese is <span lang="zh"
xml:lang="zh-CN">中国科学院文献情报中心</span>.</p>

留意了,在最后一个例子中,在中文文本的四周没有让我们可以附加言语信息的标记,为达到目的所以引入了span元素。(请查看该段的源代码——译者注)

如果以XML伺服XHTML,像上节所描述的那样,你应该只使用xml:lang属性。

指定言语属性的值

使用RFC 3066规则

RFC 3066是定义如何使用言语标签来识别言语的标准。

言语标签由一个次要的subtag,尾随零个或更多附属的subtag,由连字符分开。

主subtag代表一种言语(有两种例外,i-和x-,在下面会讨论),任意尾随的subtag服务于修饰该言语的方言或用法。后面的subtag普通代表国家,方言或文字体系。

下面的例子表明了该文档不只使用英语而且还是英式英语,就是说,跟美式英语绝对的英语写成的。

<html lang="en-GB">

subtag对大小写是敏感的,包括从A到Z,a到z,0到9的字母和数字,而且不能多于8个字符。

需求留意的是HTML规范仍然推荐使用RFC 1766来确定言语。RFC 3066是RFC 1766的升级并且大大超越,而在HTML规范中有一个计划勘错表,因此你应该使用RFC 3066不管HTML规范的现阶段如何解说。

主subtag

所有的初始subtag必须是1,2或者3个字母的长度。所有2和3字母的subtag都是定义代码来代表言语的ISO 639 part 2中的言语代码。1个字母的subtag是一个i-或x-前缀,稍后我们会描述。

虽然代码是大小写敏感,它们经常小写,但这仅仅是一个惯例而已。

又留意,ISO提供2字母和3字母代码的选择时,你应该选择2字母的。这就确保了为每一种言语尽快地使用一个独一无二的代码,稍过时的使用2字母代码(基于 RFC 1766,不允许3字母长度的代码)数据也就不用更改了。同时,哪些3字母代码应避免的问题不是问题,由于所有的有两种不同的3字母代码的少数言语同时也会有2字母代码。

附subtag

添加附subtag可以表示地理区域,方言,文字体系,或者其他对次要(言语)subtag的改进。主subtag可以尾随任意数目的subtag,虽然多于一个的并不常见。

RFC 3066指出,任何位于次位置的2字母subtag都是ISO 3166国家代码。在任何第三位置或接下来的位置使用subtag都没有规则。

2字母的用以表示国家的ISO代码通常大写,但这也仅仅是一个惯例。

特殊的主subtag

RFC 3066定义了一些在可能不会从ISO言语代码开始的例子。

以i-开始的言语标签是为IANA注册言语标签(IANA-registered language tags)保留的。举些例子:

* i-mingo
* i-klingon
* i-tao

以x-开始的言语标签为用户自定义言语标签提供了构件。次位置上的标签必须多于一个字母,并且不能为以下的保留subtag:AA, QM-QZ, XA-XZ, and ZZ。

当然,在基于2字母或3字母的ISO代码可用的时候,这些识别言语的方法都不需求使用。这些方法用于限制或者防止可互用言语的混淆。


IANA注册言语标签

可以通过在RFC 3066提到的email提交程序来注册IANA言语标签。这些标签