介绍
“你还在为那些密密麻麻的 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# 实现
请求机器翻译服务流程是这样的:
- 创建翻译任务(CreateDocTranslateTask)
- 获取返回结果有两种方式,
- 创建翻译任务时传递回调地址参数(CallbackUrl)
- 直接发送请求(GetDocTranslateTask)
官方提供了在线调试,可以在这里调试好了再编码,也有多种语言的 SDK 可供下载。
创建项目
新建 ASP.NET Web API 或者控制台项目
安装包:
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
56public 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
38app.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
2
3
4
5
6
7
8{
{
"errCode": 500,
"errMsg": "download file fail",
"task_id": "abc123",
"status": "INIT"
}
}我是在官方提供的在线调试服务中执行任务的,按说不应该出现这种错误的,于是提交了工单,技术人员处理了一天,最后让重试一下,然后就好了,猜测应该是系统有 BUG,可能是之前没有处理过 json 文件导致出现 500 错误(个人猜测)。
使用机器翻译服务之前并不确定它能不能处理 json 翻译文件,因为 json 是有键值对的,我只想获取值的翻译,但是也没单独参数来提供,不过它也没有说不支持 json 文件,就抱着试一试的态度,没想到它直接就把 json 值的部分翻译出来了。
OpenAI
查找资料的时候发现一个基于 OpenAI 的 JSON 翻译工具:JSON i18n Translation Tool,作者已经部署到网页端提供访问,支持 40+ 语言:
- 中文(简体/繁体)
- 英语
- 日语
- 韩语
- 法语
- 德语
- 西班牙语
- 俄语 等
该工具使用很简单,页面上填入 OpenAI Key,再上传 json 文件,翻译结果实时显示在页面,并且提供结果文件下载。