抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

介绍

“你还在为那些密密麻麻的 JSON 文件头疼吗?想把 APP 改成全球版,却卡在翻译上?以往处理多语言界面翻译,我们需要一个个复制粘贴,不仅费时费力还容易出错,现在随着 AI 技术的火爆,可以让 AI 来帮你!今天就教你几招,轻松搞定多语言 JSON 文件的翻译。

方案选择

阿里云百炼 AI

目前在用阿里云服务,所以想试用下阿里云百炼 AI 服务,有一个长上下文的模型:Qwen-Long。

Qwen-Long是在通义千问针对超长上下文处理场景的大语言模型,支持中文、英文等不同语言输入,支持最长1000万tokens(约1500万字或1.5万页文档)的超长上下文对话。配合同步上线的文档服务,可支持word、pdf、markdown、epub、mobi等多种文档格式的解析和对话。 说明:通过HTTP直接提交请求,支持1M tokens长度,超过此长度建议通过文件方式提交。

提交了一部分 json 字符串,prompt 大概就是将 json 值翻译出来,导出 json 文件,结果出来了,是直接输出的,不能导出文件,于是传递整个 json 文件的字符串,结果直接超时了,改用流式输出,结果没输出完整就中断了。

阿里云机器翻译服务

关于阿里云机器翻译服务,官方是这么介绍的:

机器翻译依托阿里巴巴先进的自然语言处理技术和海量的数据优势,为企业或开发者提供多语言、多场景、多模态的翻译解决方案,应用于跨境电商、教育、医疗、金融、制造等行业。语种丰富,覆盖全球214种语言,支持文本、文档、图片、语音、视频5种模态的翻译,在机器翻译基础上,还提供人机协同翻译平台及在线翻译平台,满足多样化的语言诉求。

语种支持:覆盖全球 214 种语言,包含中、英、日、韩、西、俄、法、葡、德、泰、越等,支持任意两种语言互译。

非开发者

提供在线翻译平台,面向非开发者的轻量化翻译工具,可进行在线的图片、文档和音视频翻译。

对于开发者

文本/文档翻译

可快速实现一种语言到另一种语言的自动翻译。为开发者提供了 API 接口,同时封装了常见编程语言的 SDK

图片翻译

满足多样化的翻译需求,为开发者提供了 API 接口,同时封装了常见编程语言的SDK。

费用

通用版:每月 100 万字符免费额度。

开通

使用这个服务之前需要开通,然后账号授权,获取 AccessKeyId 和 AccessKeySecret。

C# 实现

请求机器翻译服务流程是这样的:

  1. 创建翻译任务(CreateDocTranslateTask)
  2. 获取返回结果有两种方式,
    1. 创建翻译任务时传递回调地址参数(CallbackUrl)
    2. 直接发送请求(GetDocTranslateTask)

官方提供了在线调试,可以在这里调试好了再编码,也有多种语言的 SDK 可供下载。

创建项目
  1. 新建 ASP.NET Web API 或者控制台项目

  2. 安装包:dotnet add package AlibabaCloud.SDK.Alimt20181012 --version 2.3.0

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    public class TranslateService
    {
    public static AlibabaCloud.SDK.Alimt20181012.Client CreateClient()
    {
    AlibabaCloud.OpenApiClient.Models.Config config = new()
    {
    AccessKeyId = "XXXXXX",
    AccessKeySecret = "XXXXX",
    Endpoint = "mt.cn-hangzhou.aliyuncs.com"
    };
    return new AlibabaCloud.SDK.Alimt20181012.Client(config);
    }
    public static async Task Start()
    {
    AlibabaCloud.SDK.Alimt20181012.Client client = CreateClient();
    AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new();
    try
    {
    CreateDocTranslateTaskRequest createDocTranslateTaskRequest = new()
    {
    SourceLanguage = "zh", //源语言
    TargetLanguage = "en", //目标语言
    FileUrl = "https://www.zerow.cn/asset/en.json", //源语言文件URL地址,本地路径不行
    CallbackUrl = "https://www.zerow.cn/alimt/callback", //回调地址
    };
    var response = await client.CreateDocTranslateTaskWithOptionsAsync(createDocTranslateTaskRequest, runtime);

    string docTaskId = response.Body.TaskId;
    AlibabaCloud.TeaUtil.Common.Sleep(30000);
    GetDocTranslateTaskRequest getDocTranslateTaskRequest = new() { TaskId = docTaskId };
    var getDocTaskResponse = await client.GetDocTranslateTaskWithOptionsAsync(getDocTranslateTaskRequest, runtime);
    if (AlibabaCloud.TeaUtil.Common.EqualString(getDocTaskResponse.Body.Status, "translated"))
    {
    Console.WriteLine(AlibabaCloud.TeaUtil.Common.ToJSONString(getDocTaskResponse.ToMap()));
    }
    else
    {
    Console.WriteLine("task fail");
    }
    }
    catch (TeaException error)
    {
    Console.WriteLine(error.Message);
    Console.WriteLine(error.Data["Recommend"]);
    }
    catch (Exception _error)
    {
    TeaException error = new(new Dictionary<string, object>
    {
    { "message", _error.Message }
    });
    Console.WriteLine(error.Message);
    Console.WriteLine(error.Data["Recommend"]);
    }
    }
    }

    返回成功:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
    "Status": "translated",
    "TranslateErrorMessage": "",
    "TaskId": "abc123",
    "RequestId": "123-123-123",
    "PageCount": 1,
    "TranslateFileUrl": "http://mt-translate-file-data.oss-cn-hangzhou.aliyuncs.com/dingding/xxx_merge.json?Expires=123456&OSSAccessKeyId=xx",
    "TranslateErrorCode": ""
    }

    如果使用回调地址方式获取结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    app.MapPost("/callback", async (HttpRequest request) =>
    {
    try
    {
    using (StreamReader reader = new StreamReader(request.Body))
    {
    char[] buf = new char[512];
    int len = 0;
    StringBuilder contentBuffer = new();
    while ((len = await reader.ReadAsync(buf, 0, buf.Length)) > 0)
    {
    contentBuffer.Append(buf, 0, len);
    }
    var content = contentBuffer.ToString();
    var result = JsonSerializer.Deserialize<Res>(content);
    if (result != null)
    {
    if (200 != result.errCode)
    {
    System.Console.WriteLine("fail " + result.errMsg);
    return;
    }
    System.Console.WriteLine("");
    System.Console.WriteLine("task_id:" + result.task_id);
    System.Console.WriteLine("status:" + result.status);
    System.Console.WriteLine("translateFileUrl:" + result.translateFileUrl);
    }

    }
    }
    catch (Exception e)
    {
    // handle exception
    System.Console.WriteLine(e.ToString());
    }
    System.Console.WriteLine("Complete");
    }
    );

    返回的 TranslateFileUrl 就是翻译好的多语言文件URL,可以直接下载下来。

    GitHub 源码:

说明

  1. 刚开始创建翻译任务的时候一直返回这个错误:

    1
    2
    3
    4
    5
    6
    7
    8
    {
    {
    "errCode": 500,
    "errMsg": "download file fail",
    "task_id": "abc123",
    "status": "INIT"
    }
    }

    我是在官方提供的在线调试服务中执行任务的,按说不应该出现这种错误的,于是提交了工单,技术人员处理了一天,最后让重试一下,然后就好了,猜测应该是系统有 BUG,可能是之前没有处理过 json 文件导致出现 500 错误(个人猜测)。

  2. 使用机器翻译服务之前并不确定它能不能处理 json 翻译文件,因为 json 是有键值对的,我只想获取值的翻译,但是也没单独参数来提供,不过它也没有说不支持 json 文件,就抱着试一试的态度,没想到它直接就把 json 值的部分翻译出来了。

OpenAI

查找资料的时候发现一个基于 OpenAI 的 JSON 翻译工具:JSON i18n Translation Tool,作者已经部署到网页端提供访问,支持 40+ 语言:

  • 中文(简体/繁体)
  • 英语
  • 日语
  • 韩语
  • 法语
  • 德语
  • 西班牙语
  • 俄语 等

该工具使用很简单,页面上填入 OpenAI Key,再上传 json 文件,翻译结果实时显示在页面,并且提供结果文件下载。

评论