解释在分支合并时解决翻译键冲突的流程

解读

在国内前端团队里,多语言项目往往由产品、后端、前端、翻译外包四方并行迭代。当两条分支各自新增或修改了同一条翻译键(key)时,Git 只能提示“both modified”,无法判断业务优先级,必须由构建环节(Grunt 任务流)介入,给出可落地的冲突消解策略,否则合并后会出现页面白屏、文案串行、国际化脚本报错等线上事故。面试官想确认的是:你能否把“Git 冲突”与“Grunt 自动化”打通,形成可复用、可回滚、可灰度的工程化方案,而不是简单手动改文件。

知识点

  1. i18n 资源文件格式:国内主流采用 JSON 扁平键值对(如 zh-CN.json、en-US.json),键名全局唯一,冲突粒度为“key + 语言”二维。
  2. Grunt 插件生态
    • grunt-contrib-copy:把冲突文件副本留痕
    • grunt-json-merge:按策略合并 JSON
    • grunt-git-conflict:正则解析 <<<<<<< HEAD 标记
    • grunt-i18n-extract:扫描代码,输出“实际被引用的 key 列表”
  3. 冲突策略模型
    • Ours:以当前分支为准,丢弃传入
    • Theirs:以被合入分支为准,覆盖当前
    • Newest:按文件 mtime 取最新
    • Union:两边 value 数组做并集,供人工二次 Review
    • Runtime:仅保留被源码真实引用的 key(依赖静态分析)
  4. CI 卡点:在 GitLab-CI 或 Jenkins 的 Merge-Request 阶段,通过 grunt i18n:check强制门禁,冲突未解决则 MR 无法合并,符合国内“质量红线”要求。
  5. 回滚与灰度:利用 Grunt 的 grunt-contrib-compress 把冲突前资源打 tar 包,上传至阿里云 OSS 版本目录,一旦线上文案异常,一键回滚到 tar 对应版本。

答案

步骤一:前置检测
.git/hooks/pre-merge 中调用 grunt i18n:detect,任务逻辑:

  • 遍历 locales/**/*.json,若文件内含 Git 冲突标记,立即终止合并,输出彩色日志提示开发者运行 grunt i18n:resolve

步骤二:冲突采集
grunt i18n:resolve 子任务链:

  1. copy:conflict——把冲突文件备份到 .tmp/i18n_backup/${timestamp},确保可回滚。
  2. json_merge:conflict——使用 grunt-json-merge 插件,策略配置为
    options: { strategy: 'union', fallbackLang: 'zh-CN' }
    
    自动把冲突段拆成 key__ourskey__theirs 两个临时键,写入同一文件,并追加 _conflict:true 元数据。
  3. i18n_extract——扫描 src/**/*.{js,vue,tsx},生成 usedKeys.json;与合并后文件做 diff,未被引用的临时键直接删除,减少噪音。
  4. eslint:i18n——自定义规则,禁止代码里出现 __ 双下划线后缀,防止误用临时键。

步骤三:人工二次确认
Grunt 完成任务后,自动打开 语雀翻译协作页面(URL 通过 grunt-open 插件拼接),只呈现带 _conflict:true 的 key,翻译同学 30 分钟内完成二选一或重写。

步骤四:提交与门禁
开发者 git add locales/ 后,MR 触发 CI,执行 grunt i18n:check

  • 若仍有 _conflict 标记,exit 1,MR 被 GitLab 拒绝;
  • 若 clean,则继续跑单元测试与构建,保证无冲突键进入主干

通过以上四步,实现“冲突发现 → 自动留痕 → 策略合并 → 静态剪枝 → 人工 Review → 门禁拦截”的闭环,平均每次合并节省 15 分钟人工比对,且线上零因翻译键冲突导致的白屏事故。

拓展思考

  1. 微前端场景:子应用独立仓库,主应用通过 Module Federation 聚合。此时翻译键冲突可能跨仓库,需把 Grunt 任务封装成 @company/grunt-i18n-cli 私有包,发布到阿里云 NPM 私服,各子应用 CI 统一依赖,保证策略一致。
  2. 运行时覆盖:某些业务要求运营后台即时改文案。可在 Grunt 构建后,把最终 JSON 上传至配置中心(如阿里 ACM),客户端运行时先拉远程配置,再回退到本地包,形成“构建时合并 + 运行时覆盖”两层防护。
  3. AI 辅助:在 Grunt 任务链里接入通义千问 API,对冲突 value 做语义相似度打分,若高于 0.9 则自动合并并打标 ai-merged,减少人工 Review 量,但需设置 GRUNT_AI_THRESHOLD 环境变量,防止过度自动化带来的语义漂移风险。