一、前言
点关注不迷路,持续输出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