Skip to content

[bug] client 激活时序早于 locale 服务,界面语言被回退检测永久定型为英文(无重试) #16

Description

@imroc

环境

  • DSH 0.1.2-alpha.4(npm 全局安装,web profile)
  • dsh-taskboard 0.6.2(npm 预构建产物)
  • 浏览器语言中文;DSH「设置 → 通用设置 → 语言」选中「中文」,主界面及其它注入 dsh-client-locale 的插件均为中文

现象

看板全部界面文案为英文。重启 dsh web + 刷新页面可稳定复现。

根因分析

client 激活时序竞态 + 回退检测无重试:

  1. 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
  2. src/client/index.tsinitI18n(ctx.get?.('locale')) 此刻拿到 undefinedsrc/client/i18n/runtime.ts 走一次性 fallback
  3. detectFallbackLocale() 优先读 document.documentElement.lang——此刻它是服务端渲染的静态初始值 "en"(locale 运行时激活后才执行 syncDocumentLanguage 把它设为 zh-CN)→ 短路返回 ennavigator.language 分支根本没机会执行
  4. initI18n 无服务分支 publish 后直接 return,此后 locale 服务激活、<html lang> 变化,均无重试 → 语言永久定型为 en

时序证据:boot 注入图中 dsh-taskboard(inject 为空)与 dsh-client-locale(inject 4 项)的激活顺序;服务端返回的静态 HTML 即 <html lang="en">

修复建议(任一)

  1. 推荐initI18n 无服务分支注册 MutationObserver 监听 document.documentElementlang 属性变化,变化时重新 detectFallbackLocale() 并 publish——本机已用 pnpm patch 验证此方案有效:locale 运行时把 lang 改为 zh-CN 后,看板即时切换中文
  2. 或 apply 时若 ctx.get('locale') 为空则在 1–2s 内延迟重试,拿到服务后走正常订阅路径
  3. 或把 detectFallbackLocale()navigator.language 的优先级提到 <html lang> 之前(能缓解本场景,但 preference 与浏览器语言不一致时仍可能错判,不根治)

顺带感谢:验收闸 / 协议注入 / worktree 隔离的整套工作流设计非常出色,0.6.2 在 alpha.4 上运行良好。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions