在进行国际化多语言切换时, 区域中的元数据往往是最容易被忽略的关键环节。许多开发者认为只需修改 document.documentElement.lang 即可完成语言切换,然而 仍显示英文, 在搜索引擎结果中也未同步更新 —— 原因是这些内容属于独立的 DOM 文本节点,并不会随 lang 属性自动变化。必须显式地更新这些节点,并为所有可翻译的元数据添加 data-i18n 或 data-i18n-content 标记。同时,lang 属性需严格遵循 BCP 47 规范(例如 zh-Hans),并确保服务端渲染与前端更新的逻辑保持一致。

document.documentElement.lang 已更改,但 meta 描述却未同步更新
根本原因非常直接: 和 中的文本内容并不会随根节点 lang 属性的变化而自动刷新 —— 它们各自是独立的 DOM 文本节点,必须通过手动方式进行替换。仅修改 document.documentElement.lang,对 SEO 元数据完全没有实际效果。常见的踩坑场景包括:切换到中文后 仍然显示 "Welcome"; 在百度搜索结果中依然呈现为英文摘要。
- 所有需要翻译的元数据都必须添加
data-i18n标记:例如首页 标签本身不渲染可见文本,因此无法直接使用data-i18n;必须通过 JavaScript 更新其content属性,对应的键名使用data-i18n-content(例如)- 对于
、这类技术性元数据,无需翻译,也不应添加任何 i18n 属性
lang 属性必须同步写入 head 中的语义化标签
浏览器和爬虫在解析 时,会独立读取每个元素的 lang 属性,并不会自动继承 上的值。如果 或 未设置 lang,页面默认语言仍为旧语言,但实际文案已切换为日文 —— 这会导致标点错位、字体回退异常以及语音朗读混乱等问题。
✅ 显式声明,确保屏幕阅读器正确识别中文标点,搜索引擎准确索引简体中文内容首页 ✅ 同样需要设置,尤其在页面混排多语言时(例如英文站点中包含一段中文摘要)- 已有
lang属性的标签不应删除 —— 比如是合法且必要的
动态切换语言时,meta 标签容易遗漏更新
大多数 i18n 工具默认仅遍历 body 下的元素, 中的 和 经常被跳过,导致语言切换后 SEO 信息仍停留在旧语言上。这个问题非常隐蔽,但影响却十分显著。
- 翻译函数必须显式处理
document.head:例如专门调用translateElement(document.querySelector('title'))和translateMetaTags() 和虽然不翻译内容,但 URL 需要随语言变化(例如/zh/home→/en/home),否则 Google 会将其视为重复内容- 在服务端渲染(SSR)场景下,
内容必须在服务端就按目标语言生成,前端 JavaScript 不应覆盖 SSR 已输出的lang值,否则会引发 hydration mismatch 错误
BCP 47 格式错误会导致 meta 失效
使用 或 lang="zh_CN" 这类写法时,浏览器会直接忽略,相当于未设置。搜索引擎和辅助技术只识别标准的 BCP 47 标签,一个字符的错误就会使其失去语义作用。
- 简体中文必须使用
zh-Hans(虽然zh-CN兼容但不推荐;更不能使用zh-chs或zh-simplified) - 繁体中文使用
zh-Hant,地区变体如zh-HK、zh-MO可用于区分用词差异(例如“软件” vs “软体”) - 所有
lang值必须采用小写字母,连字符分隔,无空格或下划线;lang="en-us"是错误的,正确写法是lang="en-US"
从工程角度来看,最复杂的并非添加属性,而是确保 中的每一处语言声明,都与当前语言包键值、BCP 47 语言码以及 DOM 更新时机三者对齐 —— 任何一环出现遗漏,SEO 和无障碍体验都会受到影响。
