三语页面必须按内容边界逐层声明lang属性,不可仅依赖根标签;中文用zh-cn、英文用en-us、日文用ja-jp,均须符合bcp 47标准,嵌套时就近生效,css :lang()和屏幕阅读器均依赖显式声明。

三语页面不是简单堆叠三个 lang 值,而是要按内容边界逐层声明语言归属——否则屏幕阅读器会读串、标点会错乱、CSS :lang() 选择器会失效。
每个语言片段必须有独立的 lang 属性
不能只在 上写 lang="zh-CN" 就完事。中文段落、英文术语、日文引用各自独立,就得各自加 lang:
<p lang="zh-CN">这是中文正文,其中夹杂<span lang="en">API</span>和<span lang="ja">エラー</span>。</p>- 嵌套时优先级由最近的
lang决定:外层lang="zh-CN",内层<blockquote lang="en"></blockquote>,则整块引文按英文规则断行、标点悬挂、语音合成 - 避免用
<div lang="en"> 包裹大段混排内容——如果里面又插了中文人名或日文片假名,必须再进一层加 <code>lang,否则会被当作英文上下文里的“外来词”错误处理lang值必须严格符合 BCP 47 标准写
lang="zh"或lang="jp"是无效的,浏览器不识别,后果包括 Safari 渲染直角引号、Chrome 语音读错轻声、阿拉伯语方向反向——三语场景下这类问题会叠加放大。- 中文用
zh-CN(简体)、zh-TW(繁体)或zh-Hans(通用简体),不用zh或chinese - 英文统一用
en-US,避免en;日文必须用ja-JP,不是jp或ja - 如果某段是“中文界面里显示的英文按钮文字”,仍应设
lang="en",而不是迁就父容器语言——语义归属看内容本身,不是看 UI 语言
三语切换时,
document.documentElement.lang只能反映主语言用户点“切换为日语”,不是把整个页面变成日语,而是把主导航、标题、说明文字等主干内容切到日语,其余语言片段仍保留原
lang。这时候只改document.documentElement.lang = 'ja-JP',其他所有子lang属性保持不变。- 千万别在切换时批量重写所有
lang属性——那会把原本正确的英文术语、中文专有名词全错标成日语 - 如果页面结构支持动态语言包(如用
data-i18n加载翻译),更新文案后,必须同步检查并修正对应元素的lang值,比如把<h2 data-i18n="title">首页</h2>切成日语后,得补上lang="ja-JP" -
:lang(ja)这类 CSS 选择器只匹配显式声明了该语言的元素,不会穿透继承——所以别指望靠根节点lang控制全局字体链,每个语言块得自己配font-family
表格与 flex 容器里混排三语,布局容易崩
“Settings” → “设置” → “設定” 长度差异极大,三语同页时,一个单元格里可能同时出现三种长度的词,
table-layout: auto或默认flex-shrink会直接失控。- 表格必须设
table-layout: fixed+ 显式<col width="20%">,否则一列日文长词撑开整行,其他列被压缩到看不见 - flex 项目里放三语文本,务必加
flex: 1 1 0(即flex-basis: 0),否则中文“设置”比英文“Settings”短,但容器拒绝收缩,留出大片空白 - 所有含三语文本的
<img>必须带max-width: 100%,否则它会绕过 flex 或 table 的宽度控制,把布局顶破
最容易被忽略的是:三语页面里,
lang不是装饰属性,它是浏览器渲染引擎的指令开关——标点怎么挂、断行从哪切、语音用哪种音调、甚至搜索引擎怎么索引,全取决于它有没有、对不对、套得准不准。 - 中文用











