lang属性必须写在标签上才起作用,浏览器、屏幕阅读器等仅依据根元素lang值识别整页主语言;局部多语言内容(如英文术语、日文引文、代码块)须显式为对应元素单独设置lang属性,不能依赖继承。

lang属性写在哪才真正起作用
只给加lang,对页面里夹杂的英文术语、日文引文、代码块里的curl -X POST完全无效。浏览器、屏幕阅读器、字体引擎、拼写检查器,全按**每个元素自身的lang值**工作,不是看父级继承来的。
常见错误现象:SPA切换语言后语音朗读仍是中文,标点间距不对,日文假名显示成中文字体——问题就出在没同步更新子节点的lang。
-
<p lang="ja">こんにちは</p>必须显式声明,不能指望根节点覆盖 -
<pre class="brush:php;toolbar:false;" lang="bash">npm run dev</pre>这类代码块要单独标lang,否则语法高亮工具不识别 -
<blockquote lang="fr">C’est la vie.</blockquote>引文不加lang,VoiceOver会用中文音读法语词 - 误写
lang="zh_CN"或lang="chinese"会被浏览器忽略,必须用BCP 47标准格式:zh-Hans、zh-Hant、en-US
data-i18n替换文本时容易漏掉哪些属性
只遍历[data-i18n]并改textContent,会漏掉表单控件、提示文字、替代文本等关键内容。这些属性不归textContent管,得单独处理。
使用场景:用户切换语言后,搜索框的placeholder还是中文,图片alt没变,按钮title仍显示“Click to login”——都是因为没覆盖这些属性。
-
input和textarea的placeholder需用setAttribute('placeholder', value) -
img的alt、area的alt、th的title都得单独查、单独设 -
select里的option文本不能靠父级data-i18n推断,得遍历select[data-i18n] option,查语言包中"xxx.options"数组 - 动态插入的DOM(如JS弹出的
alert或Toast)不会自动触发翻译,必须封装t('common_error')函数手动调用
fetch加载语言包失败时为什么页面会空白
没写降级逻辑,fetch('./i18n/en-US.json')一报错,整个页面文案就留空——用户看到的是一堆data-i18n="header_title"键名,而不是“Welcome”。这不是小概率事件,网络抖动、路径写错、CORS、甚至CDN缓存失效都会触发。
参数差异:response.ok判断HTTP状态码是否为2xx,try/catch捕获网络层异常(如TypeError: Failed to fetch),二者缺一不可。
- 先
tryfetch,再if (!response.ok)判断状态码,最后await response.json() - fallback顺序必须明确:优先用
navigator.language(注意截断处理,如zh-CN→zh),其次查localStorage.lang,最后硬编码默认对象:{ header_title: "Welcome", login_btn: "Login" } - 别依赖
localStorage决定首次加载——用户可能清过缓存,或在新设备打开,此时navigator.language更可靠 - JSON文件键名必须严格一致,哪怕某语言暂时没翻译,也要留
"key": "",否则JS查不到就留白
切换语言后页面闪动或状态丢失怎么办
直接window.location.reload()最省事,但用户正在填的表单会清空,滚动位置重置,第三方组件(如日期选择器)语言不同步——这不是多语言,是用户体验灾难。
性能影响:暴力替换innerHTML会销毁事件监听器和已初始化的组件;用textContent安全,但无法保留内嵌HTML结构(如<strong></strong>)。
- 只更新带
data-i18n的节点内容,保持DOM结构不变 - 切换前用
getComputedStyle(document.body).scrollTop记录滚动位置,更新完用window.scrollTo()恢复 - 时间/数字格式化要用
Intl.DateTimeFormat重建实例,不能复用旧对象 - 如果用了
moment.js,记得同步调用moment.locale('en'),否则日期仍显示中文
真正麻烦的是混合场景:静态文案靠data-i18n,动态内容(如用户昵称、实时价格)必须走运行时函数;而SEO标题又得在服务端注入。这些边界不划清,lang属性再准、JSON再全,也会在某个环节断掉。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











