HTML 标签需手动实现多语言:为每个 显式添加 data-i18n 并同步更新 textContent 和 lang 属性;语言包应扁平化、带 fallback;动态插入的 `` 必须调用翻译函数即时处理。

HTML `
给每个
`data-i18n` 不能只加在 `
- 推荐写法:
<select id="status-select"><option data-i18n="status.pending">待处理</option><option data-i18n="status.done">已完成</option></select> - JS 加载语言包后,遍历
select#status-select option,根据每个元素的dataset.i18n查对应文案并设textContent - 避免用
value存文案(如<option value="pending">待处理</option>),因为 value 不参与翻译,且表单提交时可能误传原始值
同步更新 select 和所有 option 的 lang 属性
仅设置 document.documentElement.lang = 'zh-CN' 是无效的。浏览器按每个节点自己的 lang 决定语音、字体回退和标点间距。
- 初始化时,给 `
- 切换语言后,需重新遍历并更新:既改文本,也改
lang值,例如optionEl.lang = 'en-US' - 若某 `
配合 JSON 语言包结构与安全加载
语言包要扁平、键名一致、带 fallback,否则 `
立即学习“前端免费学习笔记(深入)”;
- 示例
zh.json:{"status.pending": "待处理", "status.done": "已完成"} - 示例
en.json:{"status.pending": "Pending", "status.done": "Done"} - 加载失败时,降级到内置默认对象(如
{ "status.pending": "Pending" }),绝不留白 - 用
try/catch + response.ok包裹fetch(),防止网络错误导致整组选项消失
处理动态插入或 JS 生成的 select
页面初始加载后的 AJAX 表单、弹窗、Tab 页签中新增的 `
- 每次插入新 `
- 函数内部需识别
data-i18n并遍历其 ` - 若选项由 JS 动态生成(如
options.forEach(o => select.appendChild(new Option(t(o.key), o.value)))),应在创建时就调用翻译函数t()获取文案



















