lang属性必须直接写在标签上,日语用lang="ja"、韩语用lang="ko",不可加地域后缀或使用非法格式;表格单元格、引文等需单独声明lang;动态切换语言时必须同步更新值。

lang属性必须写在html>标签上才能生效
日语和韩语的页面主语言声明,必须直接写在标签上,例如或。写在、<div>甚至用 JS 动态设置<code>document.documentElement.lang,对屏幕阅读器(VoiceOver/NVDA)和浏览器翻译入口都无效——它们只读初始 HTML 字符串里的根标签值。
日语用ja,韩语用ko,别加地域后缀
BCP 47 规范中,日语标准代码是ja,韩语是ko;不需要也不建议加-JP或-KR后缀。
-
ja✅ 兼容性最稳,所有主流读屏、Chrome 翻译、Google Search Console 都能正确识别并加载日语 TTS 和分词规则 -
ja-JP⚠️ 合法但冗余,IANA 推荐使用最短有效形式;部分旧版 Safari 可能因子标签过长导致:lang(ja)匹配失败 -
ja_JP❌ 下划线非法,会被静默忽略,等同于没写 -
Japanese❌ 非 BCP 47 标准,完全不被识别
韩语同理:ko是唯一推荐写法,ko-KR没必要,ko_KR或Korean一律失效。
表格单元格、引文、代码块里的日韩文要单独标lang
浏览器和读屏软件不会从<table>或<code><tr>继承语言,哪怕整张表都是日文,也必须每个<code><td>或<code><th>显式写<code>lang="ja"。
- 正确:
<td lang="ja">ユーザー登録</td>、<blockquote lang="ko">사용자 인터페이스</blockquote> - 错误:
<table lang="ja"><td>ユーザー登録</td></table>(<table>无语言语义) <li>错误:<code><td><span lang="ja">ユーザー登録</span></td>(<span></span>不传递语言意图,读屏只认<td>自身) <li>代码注释含日韩文时,<code><pre class="brush:php;toolbar:false;" lang="en"></pre>比<pre class="brush:php;toolbar:false;" lang="ja"></pre>更稳妥——因为lang不是语法高亮开关,而是发音/翻译依据;注释语言应按其实际内容设,而非代码类型 -
:lang(ja) em这类组合,要求<em></em>自身或某个祖先元素有lang="ja";如果只在<td>上写了<code>lang="ja",而<em></em>里是中文,那em:lang(ja)不会触发 - 字体设置建议:
:lang(ja) { font-family: "Hiragino Kaku Gothic Pro", "Meiryo", sans-serif; },避免用中文字体硬撑日文假名
CSS中用:lang(ja)或:lang(ko)匹配样式要小心
:lang()是精确字符串匹配,能命中:lang(ja),但<td lang="ja-JP">不会。
<ul>
<li>如果混用<code>ja和ja-JP,建议改用属性选择器前缀匹配:td[lang^="ja"]或[lang|="ja"]
真正容易被忽略的是:一旦页面动态切换语言(比如 SPA 多语言),仅更新文案不改,读屏会继续用旧语言引擎朗读新内容,用户听到的是“中文文本被日语 TTS 强行发音”——这种错位无法靠 CSS 或 JS 补救,必须在首屏 HTML 中就输出正确的lang值。











