环境
- DSH 0.1.2-alpha.4(npm 全局安装,web profile)
- dsh-taskboard 0.6.2(npm 预构建产物)
- 浏览器语言中文;DSH「设置 → 通用设置 → 语言」选中「中文」,主界面及其它注入
dsh-client-locale 的插件均为中文
现象
看板全部界面文案为英文。重启 dsh web + 刷新页面可稳定复现。
根因分析
client 激活时序竞态 + 回退检测无重试:
dsh.client.inject: [](package.json)→ taskboard client 无依赖、立即激活;而 @deepseek-ai/dsh-client-locale 的 inject 有 4 个依赖(client-connection / ui-renderer / ui-settings / api-remotes),其 provide("locale") 晚于 taskboard 的 apply
src/client/index.ts 的 initI18n(ctx.get?.('locale')) 此刻拿到 undefined → src/client/i18n/runtime.ts 走一次性 fallback
detectFallbackLocale() 优先读 document.documentElement.lang——此刻它是服务端渲染的静态初始值 "en"(locale 运行时激活后才执行 syncDocumentLanguage 把它设为 zh-CN)→ 短路返回 en,navigator.language 分支根本没机会执行
initI18n 无服务分支 publish 后直接 return,此后 locale 服务激活、<html lang> 变化,均无重试 → 语言永久定型为 en
时序证据:boot 注入图中 dsh-taskboard(inject 为空)与 dsh-client-locale(inject 4 项)的激活顺序;服务端返回的静态 HTML 即 <html lang="en">。
修复建议(任一)
- 推荐:
initI18n 无服务分支注册 MutationObserver 监听 document.documentElement 的 lang 属性变化,变化时重新 detectFallbackLocale() 并 publish——本机已用 pnpm patch 验证此方案有效:locale 运行时把 lang 改为 zh-CN 后,看板即时切换中文
- 或 apply 时若
ctx.get('locale') 为空则在 1–2s 内延迟重试,拿到服务后走正常订阅路径
- 或把
detectFallbackLocale() 中 navigator.language 的优先级提到 <html lang> 之前(能缓解本场景,但 preference 与浏览器语言不一致时仍可能错判,不根治)
顺带感谢:验收闸 / 协议注入 / worktree 隔离的整套工作流设计非常出色,0.6.2 在 alpha.4 上运行良好。
环境
dsh-client-locale的插件均为中文现象
看板全部界面文案为英文。重启 dsh web + 刷新页面可稳定复现。
根因分析
client 激活时序竞态 + 回退检测无重试:
dsh.client.inject: [](package.json)→ taskboard client 无依赖、立即激活;而@deepseek-ai/dsh-client-locale的 inject 有 4 个依赖(client-connection / ui-renderer / ui-settings / api-remotes),其provide("locale")晚于 taskboard 的 applysrc/client/index.ts的initI18n(ctx.get?.('locale'))此刻拿到undefined→src/client/i18n/runtime.ts走一次性 fallbackdetectFallbackLocale()优先读document.documentElement.lang——此刻它是服务端渲染的静态初始值"en"(locale 运行时激活后才执行syncDocumentLanguage把它设为zh-CN)→ 短路返回en,navigator.language分支根本没机会执行initI18n无服务分支 publish 后直接 return,此后 locale 服务激活、<html lang>变化,均无重试 → 语言永久定型为 en时序证据:boot 注入图中 dsh-taskboard(inject 为空)与 dsh-client-locale(inject 4 项)的激活顺序;服务端返回的静态 HTML 即
<html lang="en">。修复建议(任一)
initI18n无服务分支注册MutationObserver监听document.documentElement的lang属性变化,变化时重新detectFallbackLocale()并 publish——本机已用 pnpm patch 验证此方案有效:locale 运行时把 lang 改为zh-CN后,看板即时切换中文ctx.get('locale')为空则在 1–2s 内延迟重试,拿到服务后走正常订阅路径detectFallbackLocale()中navigator.language的优先级提到<html lang>之前(能缓解本场景,但 preference 与浏览器语言不一致时仍可能错判,不根治)顺带感谢:验收闸 / 协议注入 / worktree 隔离的整套工作流设计非常出色,0.6.2 在 alpha.4 上运行良好。