优先用zh-tw——它明确表示“繁体中文+台湾地区规范”,chrome、safari、nvda、voiceover全链路识别最稳;zh(太宽泛)、zh_hant(非法格式)、zh-hant(大小写错误)均不可用。

繁体中文该用 zh-TW 还是 zh-Hant?
优先用 zh-TW——它明确表示“繁体中文 + 台湾地区规范”,Chrome、Safari、NVDA、VoiceOver 全链路识别最稳。别用 zh(太宽泛,AT 可能跳过中文 TTS 引擎),也别用 zh_Hant 或 ZH-hant(大小写混用或下划线是非法值,会被静默忽略)。BCP 47 要求小写+连字符,zh-TW 是事实标准。
为什么不能只写 lang="zh"?
写 lang="zh" 不报错,但等于没写:屏幕阅读器无法确定用哪套分词规则和声调模型,可能把粤语歌词按普通话读、把台湾用语“滑鼠”错读成“鼠标”,甚至把标点停顿全打乱。搜索引擎也会降权,Google Search Console 可能报“未指定语言”。真正起效的必须是带区域或书写变体的合法标签。
多语言混排时怎么局部标注繁体中文?
局部语言切换不是靠 <div lang="zh-TW"> 包裹整块内容,而是只在有明确语义的元素上声明:
<ul>
<li><code><blockquote lang="zh-TW">「這份文件須經主管核准後始得發行。」</blockquote>
<q lang="zh-HK">呢份文件要經主管批核先可以發出。</q>(香港粤语引文)<code lang="en">useState(英文术语,触发 IDE 英文高亮)不要给每个段落都加 lang,DOM 体积增大,可访问性树构建变慢;更不要给单个词加,比如 <span lang="zh-TW">滑鼠</span>,这违反语义原则且无实际收益。
动态页面中改 lang 为什么经常白忙活?
辅助技术(如 VoiceOver、NVDA)在 HTML 解析初期就读取 document.documentElement.lang,JS 后期执行 document.documentElement.lang = "zh-TW" 对已激活的朗读会话基本无效。SPA 切换语言时,仅改属性不够,必须同步触发 document.title = document.title(空赋值)来强制重读根节点。但更稳妥的做法是服务端渲染时就输出正确值——Next.js 在 app/layout.tsx 里用 ,PHP 模板用 防 XSS。
真正难的不是设对一个 lang="zh-TW",而是让每个动态插入、跨框架、第三方脚本生成的文本节点,都带着准确的语言上下文被解析。











