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

lang属性必须写在标签上才能生效
日语和韩语的页面主语言声明,必须直接写在<html>标签上,例如<html lang="ja">或<html lang="ko">。写在<body>、<div>甚至用 JS 动态设置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>或<tr>继承语言,哪怕整张表都是日文,也必须每个<td>或<th>显式写lang="ja"。
立即学习“前端免费学习笔记(深入)”;
- 正确:
<td lang="ja">ユーザー登録</td>、<blockquote lang="ko">사용자 인터페이스</blockquote> - 错误:
<table lang="ja"><td>ユーザー登録</td></table>(<table>无语言语义) - 错误:
<td><span lang="ja">ユーザー登録</span></td>(<span>不传递语言意图,读屏只认<td>自身) - 代码注释含日韩文时,
<pre lang="en">比<pre lang="ja">更稳妥——因为lang不是语法高亮开关,而是发音/翻译依据;注释语言应按其实际内容设,而非代码类型
CSS中用:lang(ja)或:lang(ko)匹配样式要小心
:lang()是精确字符串匹配,<html lang="ja">能命中:lang(ja),但<td lang="ja-JP">不会。
- 如果混用
ja和ja-JP,建议改用属性选择器前缀匹配:td[lang^="ja"]或[lang|="ja"] -
:lang(ja) em这类组合,要求<em>自身或某个祖先元素有lang="ja";如果只在<td>上写了lang="ja",而<em>里是中文,那em:lang(ja)不会触发 - 字体设置建议:
:lang(ja) { font-family: "Hiragino Kaku Gothic Pro", "Meiryo", sans-serif; },避免用中文字体硬撑日文假名
真正容易被忽略的是:一旦页面动态切换语言(比如 SPA 多语言),仅更新文案不改<html lang>,读屏会继续用旧语言引擎朗读新内容,用户听到的是“中文文本被日语 TTS 强行发音”——这种错位无法靠 CSS 或 JS 补救,必须在首屏 HTML 中就输出正确的lang值。



















