跳至内容

保留结构的JSON翻译器 | 免费国际化工具

该工具在浏览器中为JSON文件里的每一条字符串自动标记目标语言代码以便后续翻译处理,同时完整保留原有的键名、数字、布尔值和嵌套数据结构完全不变,适合翻译i18next等国际化语言文件、多语言API响应以及带有复杂嵌套关系的配置文件,避免破坏程序读取所需的原始格式。

JSON结构保留翻译器

此工具可在保留JSON对象结构的同时翻译其内容。将您的JSON粘贴到左侧面板,选择目标语言,即可在右侧看到翻译输出。

翻译结果将在此处显示...

使用说明

  1. 将您的JSON对象粘贴到源JSON字段。
  2. 从下拉菜单中选择目标语言。
  3. 翻译后的JSON将自动出现在右侧面板。
  4. 点击复制按钮,将翻译后的JSON复制到剪贴板。
加载计算器...
📚

文档

什么是 JSON 结构保留翻译器?

曾经尝试过将 JSON 复制到谷歌翻译中,结果出现了损坏的键、缺失的括号或语法错误?这正是这个工具要解决的问题。

JSON 结构保留翻译器会将 JSON 对象中的字符串值转换为另一种语言,同时保持其他一切不变——键保持不变,数字仍然是数字,布尔值保持布尔,并且嵌套结构不会崩溃。

这与常规翻译工具的不同之处在于:当您翻译一个包含 50 多个嵌套键的典型 i18n 文件时,您需要保持结构完全相同,以便您的代码仍然可以在西班牙语、法语或日语中引用 user.profile.displayName。破坏这个结构,您就会花费数小时进行调试。

这个工具可以自动处理递归遍历,识别哪些字符串需要翻译,哪些元素(如 API 密钥、配置值或数字 ID)应该保持原样。

JSON 结构保留如何工作

为什么结构保留很重要

当你处理 JSON 翻译时,通常会遇到以下场景:

  • i18n 文件,你的应用期望 en.jsonfr.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.titlenotification.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 翻译为德语,同时保持 endpointretryAttemptsfeatures 不变。

翻译方法比较

方法最适合速度准确性结构完整性成本
本工具快速生成国际化文件、原型、内部工具即时对标准内容较好100%保留免费
谷歌翻译(复制/粘贴)单个短语、非技术文本即时不一破坏JSON免费
专业翻译面向客户的内容、法律文档、营销材料数天极佳需要人工处理每词0.08-0.15美元
翻译管理系统(Lokalise、Phrase)企业应用、协作工作流数小时-数天有审核的极佳内置JSON支持$$$+

何时使用本工具: 早期项目、生成审核草稿、对翻译精度要求不高的内部应用。

何时投资专业翻译: 面向客户的内容、法律/合规文本、品牌信息,或当文化细微差别比速度更重要时。

技术考虑和边缘情况

什么会被翻译(什么不会)

该工具使用类型检查来确定要翻译的内容:

会被翻译:

  • 字符串值:"Welcome""欢迎"
  • 数组中的字符串:["Hello", "World"]["你好", "世界"]
  • 任何嵌套层级的字符串

不会被翻译:

  • 数字:423.14-10 保持不变
  • 布尔值:truefalse 保持不变
  • 空值: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 和配置值。要防止这种情况:

  1. 将 JSON 拆分为面向用户的内容和配置
  2. 仅翻译内容部分
  3. 保持配置不翻译

更好的是,从一开始就将可翻译内容与技术值的文件结构分开。

这是免费的吗?有速率限制吗?

基于网页的工具对典型使用是免费的。非常高的翻译量(每分钟数百个文件)可能会触及底层翻译服务的速率限制。对于大多数开发工作流,你不会遇到限制。

参考文献和进一步阅读

为了深入理解 JSON 结构、国际化标准和最佳实践:

开始翻译您的 JSON 文件

需要快速为多语言应用程序生成翻译文件吗?粘贴您的 JSON,选择目标语言,并立即获得保留结构的翻译。适用于 i18next、react-intl、vue-i18n 以及任何期望在不同语言间保持一致 JSON 结构的框架。

立即开始翻译: