痛点:Android 项目多语言维护的现实困境
在 Android 开发中,国际化(i18n)一直是个令人头疼的问题:
- 重复劳动 :每次修改
strings.xml
,都需要手动更新 20+ 种语言文件 - 容易遗漏:新增的字符串常常忘记翻译,导致线上出现英文串
- 格式错误 :手动处理时经常丢失
%s
、%1$d
等占位符,引发崩溃 - 成本高昂:全量翻译所有字符串,API 调用成本巨大
- 效率低下:大项目动辄上千条字符串,手动维护几乎不可能
解决方案:Git Diff 驱动的增量翻译架构
android-i18n-mcp
通过巧妙结合 Git diff 分析和 AI 批量翻译,实现了一个高效、精准的自动化翻译方案。它不是简单的"全量翻译",而是基于代码变更的"增量翻译"系统。
通过 MCP 协议轻松接入 Agent 工具,实现一键翻译
核心技术架构
1. Git Diff 分析器:精准识别变更
typescript
// GitDiffAnalyzer 核心逻辑
async getDefaultStringsChanges(defaultStringsPath: string): Promise<DiffResult> {
// 获取 HEAD 版本的 strings.xml
const headContent = await this.git.show(['HEAD:' + defaultStringsPath]);
// 解析当前和历史版本,对比差异
const currentStrings = await this.xmlParser.parseStringsXML(defaultStringsPath);
const previousStrings = await this.parseHeadContent(headContent);
// 识别新增、修改、删除的字符串
for (const [name, currentResource] of currentStrings) {
if (!previousResource) {
diffResult.added.set(name, currentResource.value);
} else if (previousResource.value !== currentResource.value) {
diffResult.modified.set(name, currentResource.value);
}
}
}
通过对比当前工作区和 Git HEAD 版本,系统能精确识别出哪些字符串发生了变化,避免了全量翻译的浪费。
2. 批量翻译优化:性能与成本的平衡
typescript
// 批量翻译实现,大幅减少 API 调用次数
async translateBatch(texts: Map<string, string>, targetLanguage: string) {
const MAX_BATCH_SIZE = 60; // 单批次最大项数
// 构建批量翻译 prompt
const prompt = `Translate Android strings from English to ${targetLanguage}.
Preserve placeholders like %s, %d, %1$s.
Return JSON: ${JSON.stringify(Object.fromEntries(texts))}`;
// 一次 API 调用翻译多个字符串
const response = await this.client.chat.completions.create({
model: this.model,
messages: [{ role: 'user', content: prompt }],
response_format: { type: "json_object" }
});
return new Map(Object.entries(JSON.parse(response.content)));
}
将多个字符串打包成一个请求,相比逐个翻译,API 调用次数减少 95%,成本降低 90%+。
3. XML 智能合并:保持文件完整性
系统不是简单地覆盖文件,而是智能合并变更:
- 保留现有翻译:未修改的字符串保持不变
- 更新变更内容:只更新 diff 中识别的字符串
- 同步删除操作:自动移除已删除的字符串
- 维持键序一致:与默认 strings.xml 保持相同顺序
技术亮点与创新
1. 增量翻译 vs 全量翻译
对比维度 | 传统全量翻译 | Git Diff 增量翻译 |
---|---|---|
API 成本 | 每次翻译所有字符串 | 仅翻译变更部分 |
翻译时间 | O(n) n=总字符串数 | O(m) m=变更数 |
准确性 | 可能覆盖人工优化 | 保留现有翻译 |
适用场景 | 初始化项目 | 日常开发迭代 |
2. 并发翻译架构
typescript
// 多语言并发翻译,最大化效率
const translationPromises = this.languagesToTranslate.map(lang =>
this.translateLanguage(moduleDir, lang, stringsToTranslate)
);
const results = await Promise.all(translationPromises);
系统采用并发架构,28 种语言同时翻译,相比串行处理快 20+ 倍。
3. 智能语言映射
typescript
const LANGUAGE_FOLDER_MAP: Record<string, string> = {
'zh-CN': 'values-zh-rCN', // 简体中文
'zh-TW': 'values-zh-rTW', // 繁体中文(台湾)
'zh-HK': 'values-zh-rHK', // 繁体中文(香港)
// ... 28 种语言完整映射
};
自动处理 Android 特殊的语言文件夹命名规则(如 zh-CN
→ values-zh-rCN
)。
4. 原子性保证
所有翻译操作都是原子的:要么全部成功,要么全部回滚。这通过以下机制实现:
- 预检查:翻译前验证所有目标路径可写
- 批量翻译:收集所有翻译结果后再写入
- 错误回滚:任何语言翻译失败,放弃所有修改
5. MCP 协议集成
通过 Model Context Protocol,实现与 IDE 的深度集成:
typescript
const TOOLS: Tool[] = [
{
name: 'translate_all_modules',
description: 'Detect changes and translate to all languages',
// ... 自动注册为 IDE 可调用的工具
},
{
name: 'check_missing_languages',
description: 'Check and create missing language directories',
// ... 智能检测缺失的语言目录
}
];
完整工作流程解析
步骤 1:Git Diff 分析
bash
# 系统自动执行
git diff HEAD -- **/values/strings.xml
识别出:
- ✅ 新增的字符串(需要翻译)
- 📝 修改的字符串(需要重新翻译)
- ❌ 删除的字符串(需要同步删除)
- 🔄 顺序变化(需要重新排序)
步骤 2:智能批量翻译
json
// 输入:批量字符串
{
"welcome_message": "Welcome to our app!",
"login_button": "Sign In",
"error_network": "Network error: %s"
}
// AI 输出:保留占位符的翻译
{
"welcome_message": "欢迎使用我们的应用!",
"login_button": "登录",
"error_network": "网络错误:%s" // 占位符完美保留
}
步骤 3:XML 智能合并
xml
<!-- 原始 values-zh-rCN/strings.xml -->
<string name="app_name">我的应用</string>
<string name="old_string">旧内容</string>
<!-- 合并后 -->
<string name="app_name">我的应用</string> <!-- 保留未变更 -->
<string name="welcome_message">欢迎使用我们的应用!</string> <!-- 新增 -->
<string name="login_button">登录</string> <!-- 新增 -->
<!-- old_string 已删除 -->
批量生成 28 种语言文件,单次操作完成数千条字符串的翻译
快速集成指南
1. 安装配置(3分钟)
bash
# 克隆项目
git clone https://github.com/realskyrin/android-i18n-mcp.git
cd android-i18n-mcp
# 安装依赖并构建
npm install && npm run build
2. IDE 集成(支持 Cursor / Claude Desktop)
Cursor 配置示例
json
{
"mcpServers": {
"android-i18n": {
"command": "node",
"args": ["/path/to/android-i18n-mcp/build/index.js"],
"env": {
"ANDROID_PROJECT_ROOT": "/path/to/your/android/project",
"TRANSLATION_PROVIDER": "deepseek", // 或 "openai"
"TRANSLATION_API_KEY": "sk-xxxxxx",
"TRANSLATION_MODEL": "deepseek-chat", // 可选
"TRANSLATION_LANGUAGES": "zh-CN,ja,ko,es,fr" // 可选,默认28种
}
}
}
}
3. 使用方式
在 IDE 或 Agent CLI 中输入:
sql
use android-i18n mcp check and update copy
系统会自动:
- 扫描所有模块的 strings.xml
- 检测 Git 变更
- 批量翻译到配置的所有语言
- 智能合并到对应文件
4. 可用工具
bash
# 检查缺失的语言目录
@android-i18n check_missing_languages
# 创建并翻译缺失的语言
@android-i18n create_and_translate_missing_languages
# 翻译特定模块
@android-i18n translate_module --modulePath app
适用场景
✅ 最适合:
- 快速迭代的产品,频繁修改文案
- 多模块大型项目,字符串分散在各处
- 需要支持 10+ 种语言的国际化应用
- 初创团队或个人开发者,没有专门的翻译资源
⚠️ 需要注意:
- 对翻译质量要求极高的场景,建议人工复核
- 包含大量专业术语的应用,需要自定义词库
- 首次使用会翻译所有字符串,成本较高
技术栈与兼容性
- 语言:TypeScript + Node.js
- 协议:Model Context Protocol (MCP)
- AI 支持:OpenAI、DeepSeek、Claude(计划中)
- IDE 集成:Cursor、Claude Desktop、VS Code(通过 MCP 协议)
- Android 项目兼容:所有标准 values-xx / values-xx-rXX resource 目录
结语
android-i18n-mcp
代表了 AI 时代开发工具的新范式:不是替代开发者,而是增强开发者。通过智能化的 Git diff 分析和批量 AI 翻译,它将原本需要数小时的重复劳动压缩到秒级完成。
这不仅是效率的提升,更是开发体验的革命。当翻译不再是负担,我们就能将更多精力投入到真正重要的事情上------创造卓越的用户体验。
立即开始你的智能化 i18n 之旅:
🔗 GitHub : github.com/realskyrin/...
📧 反馈交流 : 提交 Issue
⭐ 如果这个项目帮助了你,请给个 Star 支持!