西里尔字母语言的lang属性必须写为小写字母加短横线的bcp 47格式并包含地区子标签,如ru-ru、bg-bg、uk-ua;仅写ru等iso 639-1代码或大小写错误、下划线分隔均无效。

lang属性值该写成什么格式
西里尔字母语言不能只写ru、bg或uk——必须补全地区子标签,否则部分屏幕阅读器(如 NVDA)可能 fallback 到英文 TTS 引擎,把俄语词读成英语音节。BCP 47 要求严格使用小写字母 + 短横线,且地区码不可省略。
✅ 正确写法:ru-RU(俄语-俄罗斯)、bg-BG(保加利亚语-保加利亚)、uk-UA(乌克兰语-乌克兰)
❌ 典型错误:Ru-RU(大小写错)、ru_ru(下划线非法)、rus(ISO 639-2 代码不被 HTML 接受)、ru(粒度过粗,Chrome 和 VoiceOver 可能忽略)
为什么写在html>上才生效
浏览器和辅助技术(如 JAWS、VoiceOver)在解析 HTML 字符串第一帧时就读取,并据此加载西里尔语音库、调整断词逻辑、启用拼写检查。写在或用 JS 后期执行document.documentElement.lang = "ru-RU"都无效——此时语音引擎早已初始化完毕。
- 写在
:仅影响:lang(ru-RU)CSS 匹配和局部断词,不触发翻译按钮或语音切换 - JS 动态设置:对已激活的朗读会话无作用,首屏 HTML 中的
lang值才是唯一可信来源 -
<meta http-equiv="Content-Language">:HTML5 已废弃,所有现代浏览器静默忽略
表格和混排内容怎么标西里尔语
西里尔文本常出现在多语言表格、API 响应示例或术语对照中,不能依赖父级继承。浏览器不会从<table lang="ru-RU">推导<code><td>语言,必须显式标注每个单元格。
<p>例如俄英对照表:</p>
<pre class="brush:php;toolbar:false;"><tr>
<td lang="en">User ID</td>
<td lang="ru-RU">Идентификатор пользователя</td>
</tr></pre>
<p>注意:<code><td>直接支持<code>lang属性,无需包裹<div>;数值、单位(如<code>USD、2026-09-21)不用标lang;但缩写词如<code lang="en">API建议显式声明,避免被西里尔语音引擎硬读成“а-п-и”。
:lang()伪类匹配要注意什么
:lang(ru-RU)是精确字符串匹配,<td lang="ru">或<code><td lang="ru-RU">都不会命中对方的规则。实际项目中更推荐前缀匹配:
<pre class="brush:php;toolbar:false;">td[lang^="ru"] { font-family: "PT Sans", "Noto Sans Cyrillic", sans-serif; }
td[lang^="uk"] { font-family: "Roboto Condensed", "Noto Sans Cyrillic", sans-serif; }</pre>
<p>这样能覆盖<code>ru-RU、ru-BY等变体。另外,<strong></strong>等内联元素若需按语言样式化,必须自身带lang属性——<td lang="ru-RU"><strong>Да</strong></td>中,strong:lang(ru-RU)不会生效,因为<strong></strong>没声明语言。
最易被忽略的是:西里尔语网站若混入拉丁系术语(如OAuth、HTTP),这些词本身不带lang,会被当前页面主语言引擎强行发音。稳妥做法是给它们单独包裹并声明lang="en",否则用户听到的可能是“о-ау-торизейшн”而非“oh-auth”。











