解释在分支合并时解决翻译键冲突的流程
解读
在国内前端团队里,多语言项目往往由产品、后端、前端、翻译外包四方并行迭代。当两条分支各自新增或修改了同一条翻译键(key)时,Git 只能提示“both modified”,无法判断业务优先级,必须由构建环节(Grunt 任务流)介入,给出可落地的冲突消解策略,否则合并后会出现页面白屏、文案串行、国际化脚本报错等线上事故。面试官想确认的是:你能否把“Git 冲突”与“Grunt 自动化”打通,形成可复用、可回滚、可灰度的工程化方案,而不是简单手动改文件。
知识点
- i18n 资源文件格式:国内主流采用 JSON 扁平键值对(如 zh-CN.json、en-US.json),键名全局唯一,冲突粒度为“key + 语言”二维。
- Grunt 插件生态:
- grunt-contrib-copy:把冲突文件副本留痕
- grunt-json-merge:按策略合并 JSON
- grunt-git-conflict:正则解析
<<<<<<< HEAD标记 - grunt-i18n-extract:扫描代码,输出“实际被引用的 key 列表”
- 冲突策略模型:
- Ours:以当前分支为准,丢弃传入
- Theirs:以被合入分支为准,覆盖当前
- Newest:按文件 mtime 取最新
- Union:两边 value 数组做并集,供人工二次 Review
- Runtime:仅保留被源码真实引用的 key(依赖静态分析)
- CI 卡点:在 GitLab-CI 或 Jenkins 的 Merge-Request 阶段,通过
grunt i18n:check做强制门禁,冲突未解决则 MR 无法合并,符合国内“质量红线”要求。 - 回滚与灰度:利用 Grunt 的
grunt-contrib-compress把冲突前资源打 tar 包,上传至阿里云 OSS 版本目录,一旦线上文案异常,一键回滚到 tar 对应版本。
答案
步骤一:前置检测
在 .git/hooks/pre-merge 中调用 grunt i18n:detect,任务逻辑:
- 遍历
locales/**/*.json,若文件内含 Git 冲突标记,立即终止合并,输出彩色日志提示开发者运行grunt i18n:resolve。
步骤二:冲突采集
grunt i18n:resolve 子任务链:
- copy:conflict——把冲突文件备份到
.tmp/i18n_backup/${timestamp},确保可回滚。 - json_merge:conflict——使用 grunt-json-merge 插件,策略配置为
自动把冲突段拆成options: { strategy: 'union', fallbackLang: 'zh-CN' }key__ours与key__theirs两个临时键,写入同一文件,并追加_conflict:true元数据。 - i18n_extract——扫描
src/**/*.{js,vue,tsx},生成usedKeys.json;与合并后文件做 diff,未被引用的临时键直接删除,减少噪音。 - 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 分钟人工比对,且线上零因翻译键冲突导致的白屏事故。
拓展思考
- 微前端场景:子应用独立仓库,主应用通过 Module Federation 聚合。此时翻译键冲突可能跨仓库,需把 Grunt 任务封装成 @company/grunt-i18n-cli 私有包,发布到阿里云 NPM 私服,各子应用 CI 统一依赖,保证策略一致。
- 运行时覆盖:某些业务要求运营后台即时改文案。可在 Grunt 构建后,把最终 JSON 上传至配置中心(如阿里 ACM),客户端运行时先拉远程配置,再回退到本地包,形成“构建时合并 + 运行时覆盖”两层防护。
- AI 辅助:在 Grunt 任务链里接入通义千问 API,对冲突 value 做语义相似度打分,若高于 0.9 则自动合并并打标
ai-merged,减少人工 Review 量,但需设置GRUNT_AI_THRESHOLD环境变量,防止过度自动化带来的语义漂移风险。