前言

在Unity项目开发过程中,经常需要处理多语言文本。本文将介绍如何实现一个简单实用的在线翻译功能,通过调用Google翻译API,帮助开发者快速完成文本翻译工作。既可以在编辑器中使用,也可以在运行时调用,满足不同场景的翻译需求。


一、效果演示(编辑器扩展)

二、制作过程

简言

主要使用Unity 的网络请求类UnityWebRequest,使用Google翻译的公开接口发送https的POST请求。以下拆分来逐步实现,完整代码在最后。

1.安装依赖包Newtonsoft Json(特别注意以下说明!)

首先说明,不安装此包也是可以的,需要把请求的Json和返回的Json单独写两个类使用Unity的JsonUtility进行序列化和反序列化也可以。本文使用Newtonsoft Json工具,功能更加强大。

安装方式如下
1、打开Unity的Package Manager
2、选择注册表中的包并搜索Newtonsoft Json进行安装

3、安装后重启代码编辑器Visual Studio或Visual Studio Code等,不然可能出现搜索不到对应的API和命名空间。

2.定义字段和方法

代码如下(示例):

	//Google翻译的API接口
	public const string TranslateUrl = "https://googlet.deno.dev/translate";
    public string originalText;    // 输入内容
    public string translatedText;  // 输出内容
    public int targetLanguage;     // 目标语言
    public bool isTranslating;     // 是否正在翻译
    //翻译目标语言字典,还支持其他常见语言,可自行搜索添加,本处为常用的几种语言
    public Dictionary<string, string> targetLanguages = new Dictionary<string, string>()
    {
   
   
        {
   
   "auto", "自动"},
        {
   
   "zh", "中文"},
        {
   
   "en", "英语"},
        {
   
   "de", "德语"},
        {
   
   "ru", "俄语"},
        {
   
   "fr", "法语"},
        {
   
   "ja", "日语"},
        {
   
   "ko", "韩语"},
    };
    
    //调用协程请求方法
	public void Translate(string originalText, string targetLanguage = "auto", Action<string> onTranslate = null)
    {
   
   
        if (isTranslating || string.IsNullOrEmpty(originalText)) return;
        StartCoroutine(TranslateCoroutine(originalText, targetLanguage, onTranslate));
    }

	/// <summary>
    /// 用协程处理翻译请求
    /// </summary>
    /// <param name="originalText">输入内容</param>
    /// <param name="targetLanguage">目标语言</param>
    /// <param name="onTranslate">翻译完成回调</param>
    /// <returns></returns>
    IEnumerator TranslateCoroutine(string originalText, string targetLanguage, Action<string> onTranslate)
    {
   
   
        isTranslating = true;
        /* 请求格式,请求方式为POST请求:
        {
            "text": “"test",
            "source_lang": "auto",
            "target lang": "zh"
        }*/
        /* 回复格式:
        {
            "code"”: 200,
            "data":“测试”
        } */
        JObject translateData = new JObject()//这里使用Newtonsoft.Json库来处理json请求数据格式
        {
   
   
            ["text"] = originalText,
            ["source_lang"] = "auto",
            ["target_lang"] = targetLanguage,
        };
        UnityWebRequest request = new UnityWebRequest(TranslateUrl, "POST");//创建一个Post请求
        byte[] bodyRaw = Encoding.UTF8.GetBytes(translateData.ToString());
        request.uploadHandler = new UploadHandlerRaw(bodyRaw);
        request.downloadHandler = new