HTML跨表单提交本身不感知语言,需显式传递lang字段、动态更新placeholder/title等属性、持久化语言状态并处理iframe通信,否则导致语义错乱与辅助技术异常。

HTML跨表单提交本身不感知语言,但多语言页面中若未同步 lang 属性、未处理表单控件的 placeholder/title 翻译、或在提交前未冻结当前语言上下文,就会导致提交内容语义错乱、后端日志语言混杂、辅助技术读屏异常——这不是表单行为问题,而是语言状态未与 DOM 生命周期对齐。
为什么 form.submit() 会丢失当前语言上下文
表单原生提交会触发页面跳转或刷新,所有 JS 运行时状态(包括当前激活的语言码、翻译缓存、localStorage 中的临时语言标记)全部重置。如果你靠 JS 动态改了 input.placeholder 或 button.textContent,但没把语言标识写入 form 的 data-lang 属性或隐藏字段,后端就收不到语言线索。
- 别只改 UI 文本:必须显式传语言,例如加
- 避免用
form.action += '?lang=ja-JP'拼接:URL 编码易出错,且 POST 请求体里不带 query 参数 - 如果用
fetch+FormData手动提交,记得在submit事件里preventDefault()并追加lang字段
input 和 select 的 placeholder/title 怎么动态翻译
placeholder 和 title 是属性(attribute),不是文本节点,data-i18n 默认只处理 textContent 或 innerHTML,所以不会自动更新。必须手动干预。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 给元素加
data-i18n-placeholder="login.email"或data-i18n-title="tooltip.save" - 翻译函数里要额外遍历这些属性:
el.setAttribute('placeholder', dict[key] || el.getAttribute('placeholder')) -
select的option文本需单独遍历处理,不能只扫父select节点 - 注意:iOS Safari 对
title的读屏支持弱,建议用aria-label替代并同步翻译
提交后跳转页如何继承语言状态
用户填完登录表单点提交,跳转到 /dashboard.html,但新页面仍显示英文——因为 document.documentElement.lang 没被持久化,且新页面没读取上一页传来的语言线索。
- 跳转前写
localStorage.setItem('lang', currentLang),新页面初始化时优先读它 - 服务端重定向(如 302)时,确保响应头带
Vary: Accept-Language,否则 CDN 可能缓存错版本 - 不要依赖
navigator.language在跳转后重新猜:隐私模式下它常为空,旧 Android WebView 返回und - 如果后端返回 JSON 响应(如 AJAX 登录),语言应由响应头
Content-Language: zh-Hans明确声明,前端据此重建Intl实例
最易被忽略的是表单内嵌的 iframe(比如第三方验证码、支付 widget),它们完全独立于主页面语言环境,lang 属性和翻译逻辑进不去——这种场景只能靠 iframe 宿主通信(postMessage)显式传递语言码,并要求对方组件支持该协议。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










