西里尔字母语言的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 可能忽略)
为什么写在上才生效
浏览器和辅助技术(如 JAWS、VoiceOver)在解析 HTML 字符串第一帧时就读取<html lang="ru-RU">,并据此加载西里尔语音库、调整断词逻辑、启用拼写检查。写在<body lang="ru-RU">或用 JS 后期执行document.documentElement.lang = "ru-RU"都无效——此时语音引擎早已初始化完毕。
- 写在
<body>:仅影响:lang(ru-RU)CSS 匹配和局部断词,不触发翻译按钮或语音切换 - JS 动态设置:对已激活的朗读会话无作用,首屏 HTML 中的
lang值才是唯一可信来源 -
<meta http-equiv="Content-Language">:HTML5 已废弃,所有现代浏览器静默忽略
表格和混排内容怎么标西里尔语
西里尔文本常出现在多语言表格、API 响应示例或术语对照中,不能依赖父级继承。浏览器不会从<table lang="ru-RU">推导<td>语言,必须显式标注每个单元格。
立即学习“前端免费学习笔记(深入)”;
例如俄英对照表:
<tr> <td lang="en">User ID</td> <td lang="ru-RU">Идентификатор пользователя</td> </tr>
注意:<td>直接支持lang属性,无需包裹<div>;数值、单位(如USD、2026-09-21)不用标lang;但缩写词如<code lang="en">API</code>建议显式声明,避免被西里尔语音引擎硬读成“а-п-и”。
:lang()伪类匹配要注意什么
:lang(ru-RU)是精确字符串匹配,<td lang="ru">或<td lang="ru-RU">都不会命中对方的规则。实际项目中更推荐前缀匹配:
td[lang^="ru"] { font-family: "PT Sans", "Noto Sans Cyrillic", sans-serif; }
td[lang^="uk"] { font-family: "Roboto Condensed", "Noto Sans Cyrillic", sans-serif; }
这样能覆盖ru-RU、ru-BY等变体。另外,<strong>等内联元素若需按语言样式化,必须自身带lang属性——<td lang="ru-RU"><strong>Да</strong></td>中,strong:lang(ru-RU)不会生效,因为<strong>没声明语言。
最易被忽略的是:西里尔语网站若混入拉丁系术语(如OAuth、HTTP),这些词本身不带lang,会被当前页面主语言引擎强行发音。稳妥做法是给它们单独包裹并声明lang="en",否则用户听到的可能是“о-ау-торизейшн”而非“oh-auth”。



















