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

本文介绍了如何在Unity中利用谷歌免费的翻译API实现多语言翻译功能。通过UnityWebRequest发送HTTPS请求,解析JSON响应,创建一个简易的翻译Demo,并提供了完整的C#代码实现。同时,文章还给出了语言代码对照表,帮助开发者了解不同国家的语言代码。
摘要由CSDN通过智能技术生成

一、前言

点关注不迷路,持续输出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亚美尼亚的 -亚美尼亚
azAzeri
az-AZ-CyrlAzeri-(西里尔字母的) 阿塞拜疆
az-AZ-LatnAzeri(拉丁文)- 阿塞拜疆
eu巴斯克
eu-ES巴斯克 -巴斯克
beBelarusian
be-BYBelarusian-白俄罗斯
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丹麦文 -丹麦
divDhivehi
div-MVDhivehi-马尔代夫
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爱沙尼亚的 -爱沙尼亚
foFaroese
fo-FOFaroese- 法罗群岛
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希腊 -希腊
guGujarati
gu-INGujarati-印度
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卡纳达语 -印度
kkKazakh
kk-KZKazakh-哈萨克
kokKonkani
kok-INKonkani-印度
ko韩国
ko-KR韩国 -韩国
kyKyrgyz
ky-KZKyrgyz-哈萨克
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葡萄牙 -葡萄牙
paPunjab 语
pa-INPunjab 语 -印度
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西班牙 -委内瑞拉
swSwahili
sw-KESwahili-肯尼亚
sv瑞典
sv-FI瑞典 -芬兰
sv-SE瑞典 -瑞典
syrSyriac
syr-SYSyriac-叙利亚共和国
ta坦米尔
ta-IN坦米尔 -印度
ttTatar
tt-RUTatar-俄国
teTelugu
te-INTelugu-印度
th泰国
th-TH泰国 -泰国
tr土耳其语
tr-TR土耳其语 -土耳其
uk乌克兰
uk-UA乌克兰 -乌克兰
urUrdu
ur-PKUrdu-巴基斯坦
uzUzbek
uz-UZ-CyrlUzbek-(西里尔字母的) 乌兹别克
uz-UZ-LatnUzbek(拉丁文)- 乌兹别克斯坦
vi越南
vi-VN越南 -越南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值