跨地区访问的企业与服务网站,常遇到同一个页面里多语言内容表达不一致的问题。本篇围绕如何准确声明语言信息展开,让浏览器和辅助技术正确识别并处理文本:包括设置页面默认语言、处理页内混合语言内容、选择合适的 BCP 47 语言标签,以及区分文本语言与面向受众的元数据。

搭建多语言页面结构

这是一个假设示例。设想一位作者负责一家小型咨询公司的公开网站,正准备加入第二种语言。她桌上放着一摞英文页面:一个服务概览页、三个服务详情页、一张价格表、一个关于页面,以及一个带简短表单的联系页面。她为新增语言起草的站点地图在服务栏目下列出了四个候选方案:把所有服务合并成一个翻译页面;在语言文件夹下建立三个一一对应的详情页;建立一个中心页,再加一组被各区域栏目共享引用的服务卡片;以及把价格表与服务描述分开的两层结构。

这些方案叫什么并不重要,重要的是每个方案意味着什么。合并成单一页面保留了一个入口,却把价格与服务详情挤在一起,浏览者比较服务时可能一扫而过,错失作者本想呈现的区别。镜像详情页与英文结构保持一一对应,日后修改容易追踪,但每新增一项服务,就需要在每种语言里配一个对应页面。中心页加共享卡片的做法在各区域之间共用一组服务卡片,减少了重复的描述文字,却没有说明区域特有的措辞,比如服务可用性或服务时间,应该放在哪里。分离方案把价格单独隔开,可这样一来,每个服务页面都必须横向链接到价格表,而作者还没决定是否在每个区域栏目里重复这个链接。

有一个尚未解决的取舍是:共享片段,也就是服务卡片的简短描述,算作翻译内容,还是算作固定模板?这个决定会影响两个语言版本多久出现一次偏差。第二个问题是导航命名:基于文件夹的路径暗示语言体现在地址里,而中心页加卡片的做法可以把语言放进选择器,作者还没有确定哪种对从搜索结果进入的浏览者更清楚。她还留了一条占位笔记,写着“仅短表单标签”,因为联系表单引出了一个问题:字段标签是翻译一次,还是按区域分别翻译。

这些例子是虚构的,用来框定结构问题。下一步是在写任何翻译文字之前,先为服务栏目选定一种可以套用到其他页面类型上的形态。

声明默认语言属性

始终在 html 元素上放一个语言属性,用来声明页面的默认语言;这个设置会被其他所有元素继承。请使用 html 元素而不是 body 元素,因为 body 不覆盖文档 head 里的文字。1

当页面中包含另一种语言的内容时,在那个内容外层的一个元素上加语言属性,这样它就能以不同方式被样式化或处理。如果内容周围没有任何标记,就在它外面放一个 span、bdi 或 div 这样的元素。1

使用来自 IANA Language Subtag Registry 的语言标签。对于以 text/html 提供的 HTML,使用 lang 属性。避免使用 http-equiv 设为 Content-Language 的 meta 元素;在判断文本的实际语言时,页面内的声明优先。1

你可以先看当前首页在未选择任何区域版本之前实际向大多数访客提供什么语言,据此决定默认语言属性。把它作为基准:在无痕窗口中打开线上页面、不保存任何偏好,记录出现的语言。如果未表明身份的访客看到的是英文,html 元素的 lang 值可以合理地以英文开头;如果第一屏是某个区域版本,你也可以改用该语言,并把另一种视为备选。

一项实用的作者操作是:先在自己内容记录里把属性改动写成简短的改前改后说明,暂不编辑已发布文件——记下当前值、拟改的值,以及一句说明为什么默认值反映的是未设定偏好访客的体验。然后检查该页上是否有任何标题或导航标签已经用了另一种语言,因为不一致会让首次访问的读者觉得这个声明不对。

你也可以在那份记录里并排比较两个候选值,为草稿选定一个。把这次比较标注为工作假设,而不是研究结论。如果之后要准备区域页面,这份记录就能给你一个起点,用来判断默认值是保持不变,还是按版本变化。

处理页内混合语言内容

在同一页面内,用不同语言写成的部分可以各自携带自己的lang属性。MDN把lang全局属性描述为单个BCP47语言标签,用于定义元素的语言;其示例把一段设为英式英语,另一段设为法语。MDN还指出,WCAG成功准则3.1.2要求含有不同语言部分的页面也要指明这些部分各自的语言,并称lang属性是正确机制。2

对于未另行声明的语言,MDN描述了继承关系:没有lang或xml:lang的元素继承其父元素的语言。如果没有任何祖先元素设定语言,也可以来自meta元素的http-equiv content-language或HTTP Content-Language响应头。如果无法确定单一内容语言,MDN表示默认值是空字符串,内容语言为unknown。2

从你已经在两种语言下发布的页面中挑一个,把两个版本并排打开。选出一个混合语言的区块,例如一段翻译后的服务描述上方压着一个英文标题,并标出读者需要转换理解语言的位置。然后你可以判断这个区块应作为一个整体,还是应拆成各自独立的语言小节。

一项具体的作者操作是把该区块改写两遍:一遍保留混合搭配,一遍把两种语言分成并行的短段落。比较时问自己:哪一种能让浏览者不必费力查找就能看懂价格和服务详情。为你决定保留的版本写一句理由,并将其标注为工作假设,而不是结论。

你还可以记下共享片段中哪些短语应保持固定、哪些可以随区域变化,再把这些取舍作为待核查问题记录下来。目标是在考虑改动线上内容之前,先让页面的语言边界对你清晰可见。

选择准确的 BCP 47 语言标签

BCP 47 定义了语言标签的语法,其最新规范是 RFC 5646,它取代了 RFC 4646、3066 和 1766。多数标签以一个两字母或三字母的主语言子标签开头,这个子标签必须放在最前面。示例包括表示英语的 en 和表示阿斯图里亚语的 ast;后者之所以采用三字母代码,是因为 ISO 列表中不存在对应的两字母代码。3

该文给出的黄金法则是:标签应尽可能短,只有区域子标签或文字子标签能补充有用的区分信息时才加入。文中举例说,应使用 ja 而不是 ja-JP,除非你需要说明这是日本所说的日语;同理,除非必须强调是在意大利所说的意大利语,否则应避免使用 it-IT。3

找一篇你已经用两种语言发布的页面,把两个版本并排打开。标出方块内语言真正发生变化的每一处,例如中文句子里保留英文的产品名,或者未翻译的服务标签。这样你在动手改任何标签之前,就有一个具体的样本可供推敲。

对于每一处标记,你可以考虑两个标签中哪个更准确:是周围文本的标签,还是片段自身语言的标签。一个简单的作者做法是,给每处标记写下一个简短猜测,即“段落的语言”或“片段的语言”,并记下一条理由。例如,你有意保持原样的型号名,可以记为固定片段;而翻译过的服务描述,显然属于周围语言的一部分。

随后你可以在草稿中选一个区块改写两次:一次把混合片段当作周围语言的一部分,一次单独给它标注。比较哪个版本在各地读者那里更容易被正确解析,并保留与之相符的标签选择。把这一步标注为工作假设,而不是研究结论。如果某个片段的标签仍然含糊,就把它记为待你自行复核的未决问题,而不是填入一个你无法说明理由的值。

区分文本语言与受众元数据

HTTP 的 Content-Language 标头与 html 元素上的 lang 属性服务于不同目的。按来源的解释,该标头承载的是关于文档预期受众的元数据,而不是文本本身的实际语言,可用于返回正确的语言版本、工作流管理、分类或搜索。与元素级的 lang 属性不同,该标头可以用逗号分隔列出多种语言,适合面向多语言受众的文档。4

至于文本本身,来源指出应使用 lang 属性,让浏览器能正确显示或处理内容,例如断词、样式或拼写检查。它应始终用在 html 元素上,也应用在任何包裹不同语言内容片段的元素上。作者的动作由此直接得出:给每个混合语言的片段标上它自己的语言值,而不是让受众元数据来代替它。4

从你为首页起草的语言说明开始,检查紧挨着它的受众标签是否描述同一组人。在我虚构的示例中,页面带有英式英语的语言标签,而区域标签指向爱尔兰的读者。你可以把这种不一致当作做一次小修改的提示:重写这条说明,让两个标签回答不同的问题,一个关于文本本身,一个关于读者预期所在的地方。

一个具体做法是补上一句平实的话把两者分开,例如:“本页以英语撰写;区域版本面向爱尔兰的访客。”然后把这一版与更早的草稿对照,后者只写了“英语,爱尔兰”,并记下读者现在多知道了什么、以前并不知道。这是作者的演示,不是经过测试的结果,所以你也许更愿意换一种措辞。

你还可以检查其他页面,找出语言标签悄悄吸收了受众信息的地方,例如只有文本语言变了,标签却写上了某个国家。为自己保留一份简短的记录,写明哪些页面需要这种分离,并选定你想修订它们的顺序。

一致使用标签的实践建议

对于HTML页面,先从html元素入手:来源要求作者始终在html标签上添加lang属性,用来设定页面的默认语言,并给出的示例值是“en”。如果文档是XHTML 1.x,或是作为XML提供的HTML5多语言混写文档,还应同时使用取值相同的xml:lang属性;如果页面只作为XML提供,就只用xml:lang。至于取值,应从IANA子标签注册表中选择标签,在使用的不只是语言子标签时遵循BCP 47的语法,并让标签尽量简短。来源还指出,不要使用http-equiv设为Content-Language的meta元素,并可在CSS中使用:lang伪类实现依赖语言的样式。5

可以拿一张服务卡片上的语言标签来考虑:它应该跟随卡片自身的片段,还是跟随它周围的页面。你可以在改写任何内容之前,把这一决定套用到其他区域版本上。这是一个可着手的第一步,因为它解决了一个反复出现的问题,而不必重新打开整个页面结构。

作者可以采取的一个具体做法是:为同一张卡片写两份简短草稿,一份让标签与周围页面一致,另一份让标签跟随片段。然后选择那份让浏览服务列表的访客读起来更清楚的版本。把自己的选择当作一个可以再回看的假设,而不是最终标准。

你还可以在自己的笔记里把现有标签分成两栏:描述语言的,和描述受众的。如果某个标签看起来两者兼有,就在旁边写一句平实的替换句。如果周围文本是英文,而区域版本面向爱尔兰的访客,那么“本页用英文撰写;区域版本面向爱尔兰访客”这样的句子就把两个概念分开了。你可以在编辑任何已发布文字之前,先决定每个现有标签属于哪一栏。

常见问题

在选定任何地区变体之前,怎样确定默认语言属性?

可以看当前首页在未做地区变体选择前实际主要服务哪些访客,以此作为基准:在无保存偏好的隐私窗口中打开线上页面,记下出现的是哪种语言。

怎样在自己笔记里给每处混合语言的标注写下它所属语言的猜测?

对每处标注,可以比较两个标签哪个更准确:周围文本的标签,还是片段自身语言的标签。一个简单的作者做法是给每处标注写下简短猜测,是段落语言还是片段语言,并记一条理由。

怎样在自己笔记里按语言与受众把现有标签分组?

也可以在自己笔记里把现有标签分成两栏:描述语言的,和描述受众的。遇到似乎两者兼有的标签,在旁边写一句平实的替换说法。


  1. Declaring language in HTML . 采集日期:2026-11-09. ↩︎ ↩︎ ↩︎

  2. lang HTML global attribute - HTML | MDN . 采集日期:2026-11-09. ↩︎ ↩︎

  3. Language tags in HTML and XML . 采集日期:2026-11-09. ↩︎ ↩︎

  4. HTTP headers, meta elements and language information . 采集日期:2026-11-09. ↩︎ ↩︎

  5. Working with language in HTML (tutorial) . 采集日期:2026-11-09. ↩︎