飞道的博客

Unity调用谷歌Google免费翻译API(https接口),年轻人不讲武德,用多个国家语言怎么讲

279人阅读  评论(0)

一、前言

点关注不迷路,持续输出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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场