保留结构的JSON翻译器 | 免费国际化工具
该工具在浏览器中为JSON文件里的每一条字符串自动标记目标语言代码以便后续翻译处理,同时完整保留原有的键名、数字、布尔值和嵌套数据结构完全不变,适合翻译i18next等国际化语言文件、多语言API响应以及带有复杂嵌套关系的配置文件,避免破坏程序读取所需的原始格式。
JSON结构保留翻译器
此工具可在保留JSON对象结构的同时翻译其内容。将您的JSON粘贴到左侧面板,选择目标语言,即可在右侧看到翻译输出。
翻译结果将在此处显示...
使用说明
- 将您的JSON对象粘贴到源JSON字段。
- 从下拉菜单中选择目标语言。
- 翻译后的JSON将自动出现在右侧面板。
- 点击复制按钮,将翻译后的JSON复制到剪贴板。
文档
什么是 JSON 结构保留翻译器?
曾经尝试过将 JSON 复制到谷歌翻译中,结果出现了损坏的键、缺失的括号或语法错误?这正是这个工具要解决的问题。
JSON 结构保留翻译器会将 JSON 对象中的字符串值转换为另一种语言,同时保持其他一切不变——键保持不变,数字仍然是数字,布尔值保持布尔,并且嵌套结构不会崩溃。
这与常规翻译工具的不同之处在于:当您翻译一个包含 50 多个嵌套键的典型 i18n 文件时,您需要保持结构完全相同,以便您的代码仍然可以在西班牙语、法语或日语中引用 user.profile.displayName。破坏这个结构,您就会花费数小时进行调试。
这个工具可以自动处理递归遍历,识别哪些字符串需要翻译,哪些元素(如 API 密钥、配置值或数字 ID)应该保持原样。
JSON 结构保留如何工作
为什么结构保留很重要
当你处理 JSON 翻译时,通常会遇到以下场景:
- i18n 文件,你的应用期望
en.json和fr.json具有相同的键 - API 响应需要在不同语言间保持一致的结构,以便客户端解析
- 配置文件,更改键名会破坏整个应用程序
- 数据库导出,关系依赖于特定的字段名称
挑战:JSON 不仅仅是文本。它是具有模式的结构化数据,你的代码依赖于此。将 "userName" 在翻译过程中更改为 "nombreUsuario",你的应用就会抛出 undefined 错误。
翻译过程如何工作
以下是翻译 JSON 时的幕后过程:
1. 解析和验证 工具首先验证你的 JSON 语法。如果缺少逗号或有多余的括号,你将在开始翻译之前收到清晰的错误消息——从而避免输出损坏。
2. 递归遍历 从根节点开始,算法遍历 JSON 树中的每个节点。对于每个元素,它检查数据类型:
- 字符串?将其排队等待翻译
- 数字、布尔值、空值?完全跳过
- 对象或数组?递归进入
3. 类型安全翻译
只有字符串值被发送到翻译 API。你的 "quantity": 42 将保持为 42,而不是 "四十二"。你的 "isActive": true 将保持为 true,而不是 "真"。
4. 键保留
所有对象键保持其原始语言。这是关键的,因为 translations.header.welcomeMessage 在每种语言文件中必须是相同的路径。
5. 结构重组 翻译后的字符串被重新插入到完全相同的位置,保持所有嵌套级别、数组索引和对象层次结构。
一个常见的陷阱:一些开发者尝试对对象进行 JSON.stringify(),翻译整个字符串,然后再解析回来。这会失败,因为翻译器会修改键、括号和语法。递归方法完全避免了这一点。
使用 JSON 结构保留翻译器
步骤指南
1. 粘贴您的 JSON 复制您的 JSON 对象并将其粘贴到左侧面板。该工具可处理任何有效的 JSON——无论是只有 5 个键的简单对象,还是包含数组和多个层级的深度嵌套结构。
2. 选择目标语言 从语言下拉菜单中选择:西班牙语、法语、德语、意大利语、葡萄牙语、中文、日语、韩语、俄语等。如果您正在为 i18next 项目翻译,请匹配您的框架所期望的语言代码。
3. 获取即时翻译 翻译后的输出会自动出现在右侧面板。无需"翻译"按钮——只要有有效的 JSON 和选定的语言,就会立即处理。
4. 复制并使用 点击"复制"按钮获取已翻译的 JSON。可直接粘贴到您的项目中,无需清理。
5. 清除以进行下一次翻译 准备翻译另一个文件时,点击"全部清除"。工具会立即重置两个面板。
常见问题及解决方案
"JSON 格式无效"错误 当存在语法问题时会出现此错误。常见原因:
- 键值对之间缺少逗号
- 最后一个项目后有尾随逗号(在 JavaScript 中有效,但在 JSON 中无效)
- 使用单引号而非双引号
- 字符串中有未转义的特殊字符
快速修复:在粘贴之前,先用 JSONLint 等验证器检查您的 JSON。
翻译静默失败 如果输出面板保持为空:
- 检查您的互联网连接——翻译需要 API 访问
- 确认已选择目标语言
- 尝试使用较小的 JSON 片段以隔离问题
翻译结果异常 机器翻译对标准短语效果很好,但在以下情况会遇到困难:
- 技术术语或特定领域的术语
- 品牌名称(通常应保持不翻译)
- 占位符语法,如
{{username}}或%s
对于生产应用,请将此工具作为初步尝试,然后让母语者审核特定领域或面向客户的内容。
获得更好结果的专业技巧
保持技术字符串分开 如果您的 JSON 混合了面向用户的文本和技术标识符,请考虑拆分它们。例如:
1{
2 "display": {"welcome": "欢迎回来"},
3 "config": {"apiKey": "abc123", "endpoint": "https://api.example.com"}
4}
5单独翻译 display 对象,以避免意外处理 config 值。
在字符串中使用上下文 "提交"可能因上下文不同而有不同翻译。"提交表单"或"提交支付"可为翻译者(人工或机器)提供更好的上下文以获得准确结果。
使用真实数据测试 在翻译包含 500 多个键的整个 i18n 文件之前,先用包含所有数据类型的小样本进行测试——字符串、数字、嵌套对象、数组。
代码示例
使用 JavaScript 翻译 JSON
1// 展示如何在 JavaScript 中实现类似功能的示例
2function translateJsonStructure(jsonObj, targetLanguage) {
3 // 帮助函数用于翻译字符串
4 function translateString(str, lang) {
5 // 在实际实现中,这将调用翻译 API
6 return `[${lang}] ${str}`;
7 }
8
9 // 递归函数遍历并翻译 JSON
10 function processNode(node) {
11 if (node === null) return null;
12
13 if (typeof node === 'string') {
14 return translateString(node, targetLanguage);
15 }
16
17 if (Array.isArray(node)) {
18 return node.map(item => processNode(item));
19 }
20
21 if (typeof node === 'object') {
22 const result = {};
23 for (const key in node) {
24 result[key] = processNode(node[key]);
25 }
26 return result;
27 }
28
29 // 返回数字、布尔值等不变
30 return node;
31 }
32
33 return processNode(jsonObj);
34}
35
36// 使用示例
37const sourceJson = {
38 "product": {
39 "name": "无线耳机",
40 "description": "高质量的带降噪功能的无线耳机",
41 "features": ["蓝牙5.0", "40小时电池寿命", "可折叠设计"],
42 "price": 99.99,
43 "inStock": true
44 }
45};
46
47const translatedJson = translateJsonStructure(sourceJson, "es");
48console.log(JSON.stringify(translatedJson, null, 2));
49使用 Python 翻译 JSON
1import json
2
3def translate_json_structure(json_obj, target_language):
4 """
5 翻译 JSON 对象中的字符串值,同时保留结构。
6
7 参数:
8 json_obj: 解析后的 JSON 对象
9 target_language: 目标语言代码(如 'es'、'fr')
10
11 返回:
12 保留结构的翻译后的 JSON 对象
13 """
14 def translate_string(text, lang):
15 # 在实际实现中,这将调用翻译 API
16 return f"[{lang}] {text}"
17
18 def process_node(node):
19 if node is None:
20 return None
21
22 if isinstance(node, str):
23 return translate_string(node, target_language)
24
25 if isinstance(node, list):
26 return [process_node(item) for item in node]
27
28 if isinstance(node, dict):
29 result = {}
30 for key, value in node.items():
31 result[key] = process_node(value)
32 return result
33
34 # 返回数字、布尔值等不变
35 return node
36
37 return process_node(json_obj)
38
39# 使用示例
40source_json = {
41 "user": {
42 "name": "简·史密斯",
43 "bio": "软件开发者和开源贡献者",
44 "skills": ["JavaScript", "Python", "React"],
45 "active": True,
46 "followers": 245
47 }
48}
49
50translated_json = translate_json_structure(source_json, "fr")
51print(json.dumps(translated_json, indent=2))
52使用 PHP 翻译 JSON
1<?php
2/**
3 * 翻译 JSON 结构,同时保留原始结构
4 *
5 * @param mixed $jsonObj 解析后的 JSON 对象
6 * @param string $targetLanguage 目标语言代码
7 * @return mixed 翻译后的 JSON 对象
8 */
9function translateJsonStructure($jsonObj, $targetLanguage) {
10 // 帮助函数用于翻译字符串
11 function translateString($text, $lang) {
12 // 在实际实现中,这将调用翻译 API
13 return "[$lang] $text";
14 }
15
16 // 递归函数处理每个节点
17 function processNode($node, $lang) {
18 if ($node === null) {
19 return null;
20 }
21
22 if (is_string($node)) {
23 return translateString($node, $lang);
24 }
25
26 if (is_array($node)) {
27 // 检查是关联数组(对象)还是索引数组
28 if (array_keys($node) !== range(0, count($node) - 1)) {
29 // 关联数组(对象)
30 $result = [];
31 foreach ($node as $key => $value) {
32 $result[$key] = processNode($value, $lang);
33 }
34 return $result;
35 } else {
36 // 索引数组
37 return array_map(function($item) use ($lang) {
38 return processNode($item, $lang);
39 }, $node);
40 }
41 }
42
43 // 返回数字、布尔值等不变
44 return $node;
45 }
46
47 return processNode($jsonObj, $targetLanguage);
48}
49
50// 使用示例
51$sourceJson = [
52 "company" => [
53 "name" => "全球科技解决方案",
54 "description" => "创新型软件开发公司",
55 "founded" => 2010,
56 "services" => ["Web开发", "移动应用", "云解决方案"],
57 "active" => true
58 ]
59];
60
61$translatedJson = translateJsonStructure($sourceJson, "de");
62echo json_encode($translatedJson, JSON_PRETTY_PRINT);
63?>
64实际应用场景
Web 应用程序国际化文件
大多数现代框架(如 Next.js、React 或 Vue)以 JSON 格式存储翻译。当您需要为应用程序添加新语言时,您面临着一个选择:手动复制粘贴并翻译每个键(容易出错),或使用此工具在几分钟内生成初稿。
一个真实场景:您的应用有一个 en.json,包含跨嵌套类别的 200 多个翻译键——导航、表单、错误消息、工具提示。您需要在下一个冲刺周期内完成法语和德语版本。
输入 (en.json):
1{
2 "common": {
3 "welcome": "Welcome to our application",
4 "login": "Log in",
5 "signup": "Sign up",
6 "errorMessages": {
7 "required": "This field is required",
8 "invalidEmail": "Please enter a valid email address"
9 }
10 }
11}
12翻译为法语,得到具有相同结构的 fr.json。您的代码仍然可以引用 t('common.errorMessages.required') 而无需更改。
我发现有效的方法是: 使用此工具生成翻译,然后让双语团队成员检查技术术语和按钮标签。这可以捕捉"提交"在"提交表单"和"提交支付"中可能需要不同翻译的情况。
API 响应本地化
构建为多个国家/地区提供服务的 API?您需要在不同语言中保持一致的响应结构。通知 API 可能返回:
1{
2 "status": "success",
3 "notification": {
4 "title": "Order Shipped",
5 "message": "Your order #12345 has been shipped",
6 "priority": 1,
7 "timestamp": 1678901234
8 }
9}
10您的移动应用解析 notification.title 和 notification.message。如果法语翻译更改了键结构,应用将为法语用户崩溃。
此工具确保每种语言中 notification.title 保持不变,仅字符串值被翻译。您的客户端代码在所有语言环境中都能相同地工作。
需要注意的一个限制: 自动翻译无法理解您的领域。电子商务上下文中的"已发货"可能与物流或航海上下文中的翻译不同。对于面向客户的 API,请在部署前审查输出。
无头 CMS 内容翻译
像 Contentful 或 Strapi 这样的无头 CMS 平台通常以 JSON 格式导出内容。当您有 50 篇带有结构化元数据(作者、标签、特色图片 URL、发布日期)的博客文章时,您希望翻译正文和标题,而不触及元数据。
典型的导出包括内容字符串和配置:
- 内容:文章正文、标题、摘要
- 结构:作者 ID、图片路径、类别别名、时间戳
手动翻译可能会将别名从 technology 更改为 tecnología,破坏您的路由。结构保留的翻译仅处理内容字段。
多区域部署的配置文件
跨区域部署?您的配置文件可能需要本地化字符串,同时保持端点、凭据和功能标志不变:
1{
2 "region": "eu-west",
3 "welcomeMessage": "Welcome to our service",
4 "endpoint": "https://api.eu.example.com",
5 "retryAttempts": 3,
6 "features": {"darkMode": true}
7}
8将 welcomeMessage 翻译为德语,同时保持 endpoint、retryAttempts 和 features 不变。
翻译方法比较
| 方法 | 最适合 | 速度 | 准确性 | 结构完整性 | 成本 |
|---|---|---|---|---|---|
| 本工具 | 快速生成国际化文件、原型、内部工具 | 即时 | 对标准内容较好 | 100%保留 | 免费 |
| 谷歌翻译(复制/粘贴) | 单个短语、非技术文本 | 即时 | 不一 | 破坏JSON | 免费 |
| 专业翻译 | 面向客户的内容、法律文档、营销材料 | 数天 | 极佳 | 需要人工处理 | 每词0.08-0.15美元 |
| 翻译管理系统(Lokalise、Phrase) | 企业应用、协作工作流 | 数小时-数天 | 有审核的极佳 | 内置JSON支持 | $$$+ |
何时使用本工具: 早期项目、生成审核草稿、对翻译精度要求不高的内部应用。
何时投资专业翻译: 面向客户的内容、法律/合规文本、品牌信息,或当文化细微差别比速度更重要时。
技术考虑和边缘情况
什么会被翻译(什么不会)
该工具使用类型检查来确定要翻译的内容:
✅ 会被翻译:
- 字符串值:
"Welcome"→"欢迎" - 数组中的字符串:
["Hello", "World"]→["你好", "世界"] - 任何嵌套层级的字符串
❌ 不会被翻译:
- 数字:
42、3.14、-10保持不变 - 布尔值:
true和false保持不变 - 空值:
null保持null - 对象键:
"userName"作为键保持"userName" - 空字符串:
""保持""
处理特殊字符
Unicode 和表情符号 该工具正确处理 UTF-8,所以表情符号和非拉丁字符可以正常工作:
1{"greeting": "👋 Hello"}
2翻译为中文为:
1{"greeting": "👋 你好"}
2转义序列
JSON 转义序列(\n、\t、\")会被保留:
1{"message": "Line 1\nLine 2"}
2\n 在翻译中保持不变。
占位符
这里有一个潜在的问题:如果你的字符串包含 {username} 或 %s 等占位符,它们可能会被翻译或重新排序。在阿拉伯语或希伯来语等从右到左的语言中,占位符位置可能会发生变化。请仔细检查。
大型 JSON 性能
基于网页的工具可以处理典型的国际化文件(小于 500KB)而不会出现问题。对于更大的数据集:
- 500KB - 2MB: 可以工作,但在浏览器中可能会很慢
- 超过 2MB: 考虑按逻辑块拆分(例如,按功能或部分拆分为不同文件)
浏览器内存是限制因素,而不是算法本身。
常见问题
这与将 JSON 粘贴到 Google 翻译有什么不同?
Google 翻译将 JSON 视为纯文本,这意味着它会尝试翻译所有内容——包括键、语法字符和数字值。你会得到这样的输出:
1{ "nom d'utilisateur": "Jean Dupont", "âge": "vingt-cinq" }
2注意 "username" 变成了 "nom d'utilisateur",数字 25 变成了字符串 "vingt-cinq"?你的代码立即崩溃。
这个工具理解 JSON 结构,只翻译字符串值,保持键和其他数据类型不变。
它能处理包含数组的深层嵌套 JSON 吗?
可以。递归算法处理每个嵌套层级:
1{
2 "users": [
3 {"name": "John", "roles": ["admin", "editor"]},
4 {"name": "Jane", "roles": ["viewer"]}
5 ]
6}
7它翻译所有字符串值("John"、"Jane"、"admin"、"editor"、"viewer"),同时保持完全相同的结构。
如果我的 JSON 同时包含英文和已翻译的内容怎么办?
该工具会翻译它找到的每个字符串,即使某些已经是目标语言。如果你正在向现有翻译文件添加新键,请单独翻译新部分,然后合并结果。
我可以用它处理 i18next 或 react-intl 文件吗?
当然可以。输出结构与这些框架期望的相匹配。一个 i18next JSON 文件如:
1{"translation": {"welcome": "Hello", "goodbye": "Goodbye"}}
2变成:
1{"translation": {"welcome": "Hola", "goodbye": "Adiós"}}
2你的 t('translation.welcome') 调用保持不变。
对于技术内容,自动翻译的准确性如何?
这取决于上下文:
- 常规 UI 文本: "保存"、"取消"、"提交" → 通常准确
- 技术术语: "webhook"、"OAuth2"、"幂等" → 可能被错误翻译或保持原样
- 特定领域术语: "病历"(医疗)vs "病人"(耐心) → 上下文常常被忽略
对于生产应用,请将此作为第一遍,然后让人工审查技术和特定领域的术语。
对于具有不同字符集的语言(中文、阿拉伯语、俄语)呢?
该工具正确处理 Unicode,因此所有字符集都可以工作。需要注意的是:阿拉伯语和希伯来语是从右到左(RTL),这可能会影响翻译字符串中占位符的显示。JSON 结构保持正确,但请检查翻译文本的可读性。
它会保留我的格式(缩进、换行)吗?
输出是有效的 JSON,但格式(空白、缩进)可能与输入不同。如果你需要特定格式,请使用你偏好的设置通过 JSON 格式化程序运行输出。
我可以翻译配置值,如 URL 或 API 密钥吗?
该工具翻译所有字符串,包括 URL 和配置值。要防止这种情况:
- 将 JSON 拆分为面向用户的内容和配置
- 仅翻译内容部分
- 保持配置不翻译
更好的是,从一开始就将可翻译内容与技术值的文件结构分开。
这是免费的吗?有速率限制吗?
基于网页的工具对典型使用是免费的。非常高的翻译量(每分钟数百个文件)可能会触及底层翻译服务的速率限制。对于大多数开发工作流,你不会遇到限制。
参考文献和进一步阅读
为了深入理解 JSON 结构、国际化标准和最佳实践:
-
ECMA-404:JSON 数据交换语法 - Ecma International 定义的官方 JSON 规范,标准格式:ecma-international.org/publications-and-standards/standards/ecma-404/
-
MDN Web 文档:使用 JSON - Mozilla 关于 JSON 解析、字符串化和结构的综合指南:developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON
-
W3C 国际化(i18n)活动 - Web 国际化的标准和最佳实践:w3.org/International/
-
RFC 8259:JSON 数据交换格式 - IETF 关于 JSON 语法和语义的规范:datatracker.ietf.org/doc/html/rfc8259
开始翻译您的 JSON 文件
需要快速为多语言应用程序生成翻译文件吗?粘贴您的 JSON,选择目标语言,并立即获得保留结构的翻译。适用于 i18next、react-intl、vue-i18n 以及任何期望在不同语言间保持一致 JSON 结构的框架。
立即开始翻译: