如何设置HTML页面的内容语言?
本文描述了如何通过标记HTML页面来提供有关页面语言的信息。首先是一个总体概述,并在后续章节中提供更多详细信息。
始终在html
标签上使用语言属性来声明页面中文本的默认语言。这会被所有其他元素继承,例如:
<html lang="en">
注意,你应该使用html
元素而不是body
元素,因为body
元素覆盖不了head
元素内的文本。
当页面包含其他语言的内容时,在围绕该内容的元素上添加语言属性。这让你以不同的方式添加样式或处理这个元素。比如:
<p>The title is "<span lang="fr">Le Bon Usage</span>".
对于作为HTML提供的页面,使用lang
属性。(对于作为XML提供的页面,包括XHTML 1.x和HTML5多语言文档,请参见选择正确的属性。)
使用来自IANA语言子标签注册表的语言标签。你可以用非官方的语言子标签查找工具来寻找子标签。(更多)
在代码的某些部分你可能会遇到问题。如果你在title
元素中有多语言文本,你无法标记不同部分的语言,因为title
属性里不能包含标签。属性值中的多语言文本也是这种情况。目前对此没有好的解决方案。
使用嵌套元素来处理同一元素上不同语言的内容和属性值。(更多)
你不能用http-equiv
属性设置为Content-Language
的meta
元素来指示页面的语言,但在某些情况下,你可能希望通过HTTP标头提供语言信息来指示页面的目标受众。无论你是否使用HTTP标头,你都应该用html
标签上的语言属性来声明页面中文本的语言。有关更多信息,请参见配套文章HTTP标头、meta
元素和语言信息。
本章提供了在HTML中声明语言的的详细信息。
有时,属性中的文本语言和元素内容的语言不同。比如,在本文的右上角有指向页面翻译版本的链接。链接文本使用目标页面的语言,但title
属性使用的是当前页面的语言:
如果你的代码如下所示,语言属性会指示内容和title
属性文本都是西班牙语。这显然是不正确的。
<a lang="es" title="Spanish"
href="qa-html-language-declarations.es">Español</a>
你应该将包含不同语言文本的属性移动到另一个元素,如下所示,其中a
元素继承html
元素的默认en
设置。
<a title="Spanish" href="qa-html-language-declarations.es"><span lang="es">Español</span></a>
如果你想指定某些内容的语言但周围没有标签,请在内容周围使用如span
、bdi
或div
之类的元素。比如:
<p>You'd say that in Chinese as <span lang="zh-Hans">中国科学院文献情报中心</span>.</p>
为了确保所有用户代理都能识别你的语言,你需要在提供语言属性值时遵循标准的方法。你还需要考虑如何以标准方式引用方言差异,比如美式英语和英式英语在拼写和发音方面存在显著的差异。
创建语言属性值的规则由名为BCP 47的IETF规范描述。除了如何使用简单的语言标签(如英语的en
或法语的fr
)外,BCP 47还描述了如何组合语言标签,让你指定与语言相关的地区方言、文字和其他变体。
BCP 47包含ISO的语言和国家代码集,以及其他内容。要查找相关代码,你应该查阅IANA语言子标签注册表。
想了解BCP 47标签的语法,请阅读HTML和XML中的语言标签。如果你想从众多可能的标签和组合中选择正确的语言标签,请参见选择语言标签。
如果你的文档是HTML(即作为text/html
提供),请用lang
属性来设置文档或文本范围的语言。比如,以下将默认语言设置为法语:
<html lang="fr">
当将XHTML 1.x或多语言页面作为text/html
提供时,你需要同时使用lang
属性和xml:lang
属性。xml:lang
属性是在XML中识别语言信息的标准方式。确保两个属性的值相同。
<html lang="fr" xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml">
如果你将文件作为HTML处理,xml:lang
是没有用的,但在你将文档作为XML处理或提供时是有用的。lang
属性被XHTML的语法允许,也可能被浏览器识别。但是,当使用其他XML解析器时(例如XSLT中的lang()
函数),你不能依赖lang
属性被识别。
如果你将页面作为XML提供(即使用诸如application/xhtml+xml
之类的MIME类型),你不需要lang
属性。xml:lang
属性就足够了。
<html xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml">
本节中的信息不太可能有用,但为了完整性而提供。
除了在html
标签上包含页面内语言属性(你应该始终这样做)外,你可能还遇到过HTTP标头中的语言声明(与页面一起提供)或作为meta
元素。
重要的是,在确定文本的实际语言时,页面内语言声明始终覆盖HTTP信息,但HTTP信息可能提供有关资源预期用途的更通用的信息。不建议在HTML页面中用meta
元素来声明语言。
有关HTTP和meta
元素中的Content-Language
的信息,请参见HTTP标头、meta
元素和语言信息。
为了谨慎起见,也为了彻底性,也许值得提及一些与此讨论不相关的其他要点。
首先,我们无法用CSS声明文本的语言。
其次,应该开始任何HTML文件的DOCTYPE
可能包含一些人看起来像语言声明的内容。下面示例中的DOCTYPE
包含文本EN,代表"英语"。但是,这表示与此文档关联的模式的语言。它与文档本身的语言无关。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
第三,有时人们假设可以从字符编码推断自然语言的信息。但字符编码不能明确识别自然语言:要使这种推断起作用,编码和语言之间必须有一对一的映射,但没有。例如,单个字符编码可以用于多种语言,例如Latin 1(ISO-8859-1)可以编码法语和英语,以及许多其他语言。此外,字符编码可以在单一语言上变化,例如阿拉伯语可以使用诸如"Windows-1256"或"ISO-8859-6"或"UTF-8"之类的编码。
但是,所有这些编码示例现在都没有意义,因为所有内容都应该用UTF-8编写,它在单个字符编码中涵盖了除了一些非常罕见的语言之外的所有语言。
文本方向也是如此。与编码和语言一样,语言和文字之间并不总是有一对一的映射,因此方向性也是如此。例如,阿塞拜疆语可以使用从右到左(阿拉伯语)和从左到右(拉丁语或西里尔语)文字编写,语言代码az
可以与任一相关。此外,与行内文本一起使用的文本方向标记对文本应用一系列不同的值,而语言是一个简单的开关,不能胜任所需的任务。