一、前言
点关注不迷路,持续输出Unity干货文章。
嗨,大家好,我是新发。
最近需要弄多语言翻译,然后,我就找到了谷歌的免费翻译API,它是一个https接口,我们可以在Unity中使用UnityWebRequest请求这个接口,实现多语言翻译的功能。
关于
UnityWebRequest的详细使用可以参见我之前写的这篇文章:《长江后浪推前浪,UnityWebRequest替代WWW》
二、最终效果
我做了个小Demo,来演示一下,“年轻人不讲武德,耗子尾汁”这句话,使用谷歌翻译成多国语言后是什么样子:

本文Demo工程已上传到CodeChina,感兴趣的同学可自行下载学习。
地址:https://codechina.csdn.net/linxinfa/UnityGoogleTranslateDemo
注:我使用的Unity版本:2020.2.7f1c1 (64-bit)。

三、Google谷歌免费翻译API(https)
https://translate.googleapis.com/translate_a/single?client=gtx&dt=t&sl=zh-CN&tl=en&q=你好
注:这个接口是免费调用的,所以是有调用次数限制的,仅供学习使用哦,不然调用太频繁可能会被封ip哟
参数如下:
| 参数 | 描述 |
|---|---|
| sl | 源语言代号,例:zh-CN表示简体中文 |
| tl | 目标语言代号,例:en表示英语 |
| q | 需要翻译的文字内容 |
具体的国家语言代号见文章末尾附录
返回结果是一个json串,例:
[
[
[
"Hello there",
"你好",
null,
null,
10
]
],
null,
"zh-CN",
null,
null,
null,
null,
[ ]
]
只能说,返回的json格式挺不友好的,嵌套那么多层。
四、Unity实操
1、C#调用https
要调用https接口,可以使用UnityWebRequest,我们封装一个脚本:Translator.cs,代码如下:
// Translator.cs
using System;
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
namespace UniLang
{
/// <summary>
/// 翻译
/// </summary>
public class Translator : MonoBehaviour
{
/// <summary>
/// google翻译api
/// </summary>
const string k_Url = "https://translate.googleapis.com/translate_a/single?client=gtx&sl={0}&tl={1}&dt=t&q={2}";
static Translator s_instance;
/// <summary>
/// 翻译接口
/// </summary>
/// <param name="sourceLang">原始语言类型</param>
/// <param name="targetLand">目标语言类型</param>
/// <param name="text">要翻译的文字</param>
/// <param name="cb">翻译回调</param>
public static void Do(string sourceLang, string targetLand, string text, Action<string> cb)
{
if (null == s_instance)
{
var obj = new GameObject("Translation");
//obj.hideFlags = HideFlags.HideAndDontSave;
DontDestroyOnLoad(obj);
s_instance = obj.AddComponent<Translator>();
}
s_instance.Run(sourceLang, targetLand, text, cb);
}
public void Run(string sourceLang, string targetLand, string text, Action<string> cb)
{
StartCoroutine(TranslateAsync(sourceLang, targetLand, text, cb));
}
IEnumerator TranslateAsync(string sourceLang, string targetLand, string text, Action<string> cb)
{
var requestUrl = String.Format(k_Url, new object[] {
sourceLang, targetLand, text });
Debug.Log("url: " + requestUrl);
UnityWebRequest req = UnityWebRequest.Get(requestUrl);
yield return req.SendWebRequest();
if (string.IsNullOrEmpty(req.error))
{
Debug.Log(req.downloadHandler.text);
JSONArray jsonArray = JSONConvert.DeserializeArray(req.downloadHandler.text);
jsonArray = (JSONArray)(jsonArray[0]);
jsonArray = (JSONArray)(jsonArray[0]);
cb((string)jsonArray[0]);
}
else
{
cb(req.error);
}
}
}
}
2、C#解析json
因为接口返回的是一个json串,所以我们需要实现json解析的功能。我之前写过一篇文章:《用C#实现一个迷你json库,无需引入dll(可直接放到Unity中使用)》,里面封装了一个迷你的json解析库,直接用即可。
具体JSONConvert的代码见我这篇文章:《用C#实现一个迷你json库,无需引入dll(可直接放到Unity中使用)》
3、界面制作
为了方便演示,我们做个简单的界面。

其中Hierarchy层级视图如下:

4、测试脚本
我们再写个测试脚本:Main.cs,代码如下:
using UnityEngine;
using UnityEngine.UI;
using UniLang;
using System.Collections.Generic;
public class Main : MonoBehaviour
{
public InputField textInput;
public Button translateBtn;
public Text resultText;
public Dropdown languageType;
void Start()
{
var languages = new List<string>();
// 中文简体
languages.Add("zh-cn");
// 中文繁体
languages.Add("zh-tw");
// 英语
languages.Add("en");
// 日语
languages.Add("ja");
// 韩语
languages.Add("ko");
// 法语
languages.Add("fr");
// 德语
languages.Add("de");
// 俄语
languages.Add("ru");
languageType.AddOptions(languages);
translateBtn.onClick.AddListener(Translate);
languageType.onValueChanged.AddListener((v) => {
Translate(); });
}
public void Translate()
{
Translator.Do("zh-cn", languageType.captionText.text, textInput.text, (translated_str) =>
{
resultText.text = translated_str;
});
}
}
把Main.cs挂到Canvas节点上,并赋值响应的ui对象,如下:

五、运行测试
运行Unity,测试效果如下:

六、结束语
完毕。
喜欢Unity的同学,不要忘记点击关注,如果有什么Unity相关的技术难题,也欢迎留言或私信~
七、附录:国家语言代码对照表
| 语言代码 | 国家/ 地区 |
|---|---|
| af | 公用荷兰语 |
| af-ZA | 公用荷兰语 - 南非 |
| sq | 阿尔巴尼亚 |
| sq-AL | 阿尔巴尼亚 -阿尔巴尼亚 |
| ar | 阿拉伯语 |
| ar-DZ | 阿拉伯语 -阿尔及利亚 |
| ar-BH | 阿拉伯语 -巴林 |
| ar-EG | 阿拉伯语 -埃及 |
| ar-IQ | 阿拉伯语 -伊拉克 |
| ar-JO | 阿拉伯语 -约旦 |
| ar-KW | 阿拉伯语 -科威特 |
| ar-LB | 阿拉伯语 -黎巴嫩 |
| ar-LY | 阿拉伯语 -利比亚 |
| ar-MA | 阿拉伯语 -摩洛哥 |
| ar-OM | 阿拉伯语 -阿曼 |
| ar-QA | 阿拉伯语 -卡塔尔 |
| ar-SA | 阿拉伯语 - 沙特阿拉伯 |
| ar-SY | 阿拉伯语 -叙利亚共和国 |
| ar-TN | 阿拉伯语 -北非的共和国 |
| ar-AE | 阿拉伯语 - 阿拉伯联合酋长国 |
| ar-YE | 阿拉伯语 -也门 |
| hy | 亚美尼亚 |
| hy-AM | 亚美尼亚的 -亚美尼亚 |
| az | Azeri |
| az-AZ-Cyrl | Azeri-(西里尔字母的) 阿塞拜疆 |
| az-AZ-Latn | Azeri(拉丁文)- 阿塞拜疆 |
| eu | 巴斯克 |
| eu-ES | 巴斯克 -巴斯克 |
| be | Belarusian |
| be-BY | Belarusian-白俄罗斯 |
| bg | 保加利亚 |
| bg-BG | 保加利亚 -保加利亚 |
| ca | 嘉泰罗尼亚 |
| ca-ES | 嘉泰罗尼亚 -嘉泰罗尼亚 |
| zh-HK | 华 - 香港的 SAR |
| zh-MO | 华 - 澳门的 SAR |
| zh-CN | 华 -中国 |
| zh-CHS | 华 (单一化) |
| zh-SG | 华 -新加坡 |
| zh-TW | 华 -台湾 |
| zh-CHT | 华 (传统的) |
| hr | 克罗埃西亚 |
| hr-HR | 克罗埃西亚 -克罗埃西亚 |
| cs | 捷克 |
| cs-CZ | 捷克 - 捷克 |
| da | 丹麦文 |
| da-DK | 丹麦文 -丹麦 |
| div | Dhivehi |
| div-MV | Dhivehi-马尔代夫 |
| nl | 荷兰 |
| nl-BE | 荷兰 -比利时 |
| nl-NL | 荷兰 - 荷兰 |
| en | 英国 |
| en-AU | 英国 -澳洲 |
| en-BZ | 英国 -伯利兹 |
| en-CA | 英国 -加拿大 |
| en-CB | 英国 -加勒比海 |
| en-IE | 英国 -爱尔兰 |
| en-JM | 英国 -牙买加 |
| en-NZ | 英国 - 新西兰 |
| en-PH | 英国 -菲律宾共和国 |
| en-ZA | 英国 - 南非 |
| en-TT | 英国 - 千里达托贝哥共和国 |
| en-GB | 英国 - 英国 |
| en-US | 英国 - 美国 |
| en-ZW | 英国 -津巴布韦 |
| et | 爱沙尼亚 |
| et-EE | 爱沙尼亚的 -爱沙尼亚 |
| fo | Faroese |
| fo-FO | Faroese- 法罗群岛 |
| fa | 波斯语 |
| fa-IR | 波斯语 -伊朗王国 |
| fi | 芬兰语 |
| fi-FI | 芬兰语 -芬兰 |
| fr | 法国 |
| fr-BE | 法国 -比利时 |
| fr-CA | 法国 -加拿大 |
| fr-FR | 法国 -法国 |
| fr-LU | 法国 -卢森堡 |
| fr-MC | 法国 -摩纳哥 |
| fr-CH | 法国 -瑞士 |
| gl | 加利西亚 |
| gl-ES | 加利西亚 -加利西亚 |
| ka | 格鲁吉亚州 |
| ka-GE | 格鲁吉亚州 -格鲁吉亚州 |
| de | 德国 |
| de-AT | 德国 -奥地利 |
| de-DE | 德国 -德国 |
| de-LI | 德国 -列支敦士登 |
| de-LU | 德国 -卢森堡 |
| de-CH | 德国 -瑞士 |
| el | 希腊 |
| el-GR | 希腊 -希腊 |
| gu | Gujarati |
| gu-IN | Gujarati-印度 |
| he | 希伯来 |
| he-IL | 希伯来 -以色列 |
| hi | 北印度语 |
| hi-IN | 北印度的 -印度 |
| hu | 匈牙利 |
| hu-HU | 匈牙利的 -匈牙利 |
| is | 冰岛语 |
| is-IS | 冰岛的 -冰岛 |
| id | 印尼 |
| id-ID | 印尼 -印尼 |
| it | 意大利 |
| it-IT | 意大利 -意大利 |
| it-CH | 意大利 -瑞士 |
| ja | 日本 |
| ja-JP | 日本 -日本 |
| kn | 卡纳达语 |
| kn-IN | 卡纳达语 -印度 |
| kk | Kazakh |
| kk-KZ | Kazakh-哈萨克 |
| kok | Konkani |
| kok-IN | Konkani-印度 |
| ko | 韩国 |
| ko-KR | 韩国 -韩国 |
| ky | Kyrgyz |
| ky-KZ | Kyrgyz-哈萨克 |
| lv | 拉脱维亚 |
| lv-LV | 拉脱维亚的 -拉脱维亚 |
| lt | 立陶宛 |
| lt-LT | 立陶宛 -立陶宛 |
| mk | 马其顿 |
| mk-MK | 马其顿 -FYROM |
| ms | 马来 |
| ms-BN | 马来 -汶莱 |
| ms-MY | 马来 -马来西亚 |
| mr | 马拉地语 |
| mr-IN | 马拉地语 -印度 |
| mn | 蒙古 |
| mn-MN | 蒙古 -蒙古 |
| no | 挪威 |
| nb-NO | 挪威 (Bokm?l) - 挪威 |
| nn-NO | 挪威 (Nynorsk)- 挪威 |
| pl | 波兰 |
| pl-PL | 波兰 -波兰 |
| pt | 葡萄牙 |
| pt-BR | 葡萄牙 -巴西 |
| pt-PT | 葡萄牙 -葡萄牙 |
| pa | Punjab 语 |
| pa-IN | Punjab 语 -印度 |
| ro | 罗马尼亚语 |
| ro-RO | 罗马尼亚语 -罗马尼亚 |
| ru | 俄国 |
| ru-RU | 俄国 -俄国 |
| sa | 梵文 |
| sa-IN | 梵文 -印度 |
| sr-SP-Cyrl | 塞尔维亚 -(西里尔字母的) 塞尔 |
| sr-SP-Latn | 塞尔维亚 (拉丁文)- 塞尔维亚共 |
| sk | 斯洛伐克 |
| sk-SK | 斯洛伐克 -斯洛伐克 |
| sl | 斯洛文尼亚 |
| sl-SI | 斯洛文尼亚 -斯洛文尼亚 |
| es | 西班牙 |
| es-AR | 西班牙 -阿根廷 |
| es-BO | 西班牙 -玻利维亚 |
| es-CL | 西班牙 -智利 |
| es-CO | 西班牙 -哥伦比亚 |
| es-CR | 西班牙 - 哥斯达黎加 |
| es-DO | 西班牙 - 多米尼加共和国 |
| es-EC | 西班牙 -厄瓜多尔 |
| es-SV | 西班牙 - 萨尔瓦多 |
| es-GT | 西班牙 -危地马拉 |
| es-HN | 西班牙 -洪都拉斯 |
| es-MX | 西班牙 -墨西哥 |
| es-NI | 西班牙 -尼加拉瓜 |
| es-PA | 西班牙 -巴拿马 |
| es-PY | 西班牙 -巴拉圭 |
| es-PE | 西班牙 -秘鲁 |
| es-PR | 西班牙 - 波多黎各 |
| es-ES | 西班牙 -西班牙 |
| es-UY | 西班牙 -乌拉圭 |
| es-VE | 西班牙 -委内瑞拉 |
| sw | Swahili |
| sw-KE | Swahili-肯尼亚 |
| sv | 瑞典 |
| sv-FI | 瑞典 -芬兰 |
| sv-SE | 瑞典 -瑞典 |
| syr | Syriac |
| syr-SY | Syriac-叙利亚共和国 |
| ta | 坦米尔 |
| ta-IN | 坦米尔 -印度 |
| tt | Tatar |
| tt-RU | Tatar-俄国 |
| te | Telugu |
| te-IN | Telugu-印度 |
| th | 泰国 |
| th-TH | 泰国 -泰国 |
| tr | 土耳其语 |
| tr-TR | 土耳其语 -土耳其 |
| uk | 乌克兰 |
| uk-UA | 乌克兰 -乌克兰 |
| ur | Urdu |
| ur-PK | Urdu-巴基斯坦 |
| uz | Uzbek |
| uz-UZ-Cyrl | Uzbek-(西里尔字母的) 乌兹别克 |
| uz-UZ-Latn | Uzbek(拉丁文)- 乌兹别克斯坦 |
| vi | 越南 |
| vi-VN | 越南 -越南 |
转载:https://blog.csdn.net/linxinfa/article/details/115723747