应选zh-TW——它表示台湾地区使用的繁体中文,含地域规范,经苹果VoiceOver、NVDA、Chrome翻译按钮、Google Search Console全链路验证最稳;zh-Hant仅表繁体字形,不绑定地区。

繁体中文该用 zh-TW 还是 zh-Hant?
浏览器、屏幕阅读器、搜索引擎实际只认 BCP 47 标准下的合法值,而 zh-TW 和 zh-Hant 都合法,但用途不同:zh-TW 表示“台湾地区使用的繁体中文”,含地域规范(标点、用词、字体 fallback);zh-Hant 仅表示“汉字繁体字形”,不绑定任何地区。多数场景下应选 zh-TW——苹果 VoiceOver、NVDA、Chrome 翻译按钮、Google Search Console 全链路验证最稳。别用 zh-HK 或 zh-MO 冒充主语言,除非页面内容确实严格按港澳规范撰写。
为什么 zh 或 zh-TW 写错会失效?
常见错误包括:zh_tw(下划线非法)、ZH-TW(大写被静默忽略)、zh-TW (末尾空格导致解析失败)、(位置错误,只影响 body 内断词,不声明整页语言)。这些都会让 Chrome 不显示翻译按钮、JAWS 按系统默认语种朗读、Google 报 “Missing hreflang or language declaration”。检查方法:打开 DevTools → Elements → 点击 节点,确认 lang 属性存在且值为小写+连字符+无空格。
多语言混排时怎么给繁体中文片段加 lang?
局部标注必须语义合理,不是“所有繁体字都加”:<blockquote lang="zh-TW">「這句話使用臺灣用語。」</blockquote> 合理;<span lang="zh-TW">臺灣</span> 单独出现则意义模糊,易被辅助技术跳过。若页面主体是简体中文,但某段引文来自台湾出版物,就该用 lang="zh-TW" 显式声明;反之,若只是个别术语(如「螢幕」),优先保持上下文一致,不强行切 lang。
动态切换繁体中文时 JS 修改 lang 为何常白忙活?
关键点在于:屏幕阅读器在 HTML 解析初期就读取 document.documentElement.lang,JS 后期赋值如 document.documentElement.lang = "zh-TW" 不会触发已激活的朗读会话重载。临时补救可加 document.title = document.title 强制重读根节点,但更可靠的做法是服务端输出正确值——Next.js 在 app/layout.tsx 中用 <html lang={locale}>,PHP 模板中用 <html lang="= htmlspecialchars($lang, ENT_QUOTES) ?>"> 防 XSS。真正难的不是设对一个 zh-TW,而是确保每个异步加载的模块、第三方评论组件、甚至 fetch 回来的富文本,都带着准确的语言上下文渲染。
zh 或 zh-TW 写错会失效?
常见错误包括:zh_tw(下划线非法)、ZH-TW(大写被静默忽略)、zh-TW (末尾空格导致解析失败)、(位置错误,只影响 body 内断词,不声明整页语言)。这些都会让 Chrome 不显示翻译按钮、JAWS 按系统默认语种朗读、Google 报 “Missing hreflang or language declaration”。检查方法:打开 DevTools → Elements → 点击 节点,确认 lang 属性存在且值为小写+连字符+无空格。
多语言混排时怎么给繁体中文片段加 lang?
局部标注必须语义合理,不是“所有繁体字都加”:<blockquote lang="zh-TW">「這句話使用臺灣用語。」</blockquote> 合理;<span lang="zh-TW">臺灣</span> 单独出现则意义模糊,易被辅助技术跳过。若页面主体是简体中文,但某段引文来自台湾出版物,就该用 lang="zh-TW" 显式声明;反之,若只是个别术语(如「螢幕」),优先保持上下文一致,不强行切 lang。
动态切换繁体中文时 JS 修改 lang 为何常白忙活?
关键点在于:屏幕阅读器在 HTML 解析初期就读取 document.documentElement.lang,JS 后期赋值如 document.documentElement.lang = "zh-TW" 不会触发已激活的朗读会话重载。临时补救可加 document.title = document.title 强制重读根节点,但更可靠的做法是服务端输出正确值——Next.js 在 app/layout.tsx 中用 <html lang={locale}>,PHP 模板中用 <html lang="= htmlspecialchars($lang, ENT_QUOTES) ?>"> 防 XSS。真正难的不是设对一个 zh-TW,而是确保每个异步加载的模块、第三方评论组件、甚至 fetch 回来的富文本,都带着准确的语言上下文渲染。
document.documentElement.lang,JS 后期赋值如 document.documentElement.lang = "zh-TW" 不会触发已激活的朗读会话重载。临时补救可加 document.title = document.title 强制重读根节点,但更可靠的做法是服务端输出正确值——Next.js 在 app/layout.tsx 中用 <html lang={locale}>,PHP 模板中用 <html lang="= htmlspecialchars($lang, ENT_QUOTES) ?>"> 防 XSS。真正难的不是设对一个 zh-TW,而是确保每个异步加载的模块、第三方评论组件、甚至 fetch 回来的富文本,都带着准确的语言上下文渲染。



















