前言
在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
发布评论