记录下一个Google翻译批量翻译更改文本的小工具,支持批量修改BuildSettings中包含的Scene以及资源中所有Prefab中的Text文本,原理是通过使用Google翻译提供的api,通过替换和获取其中特定位置字符串来实现获取对应的翻译
注意使用EditorCoroutineUtility需要先从PacageManager中导入EditorCoroutine包,作用是在编辑器下使用协程
using System;
using System.Collections;
using System.Text.RegularExpressions;
using Unity.EditorCoroutines.Editor;
using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine.Networking;
using UnityEngine.UI;
public class Translator : MonoBehaviour
{
private const string k_Url =
"https://translate.googleapis.com/translate_a/single?client=gtx&sl={0}&tl={1}&dt=t&q={2}";
[MenuItem("ZWaveTools/TranslateText")]
public static void Translate()
{
//清空Console
var logEntries = System.Type.GetType("UnityEditorInternal.LogEntries,UnityEditor.dll");
var clearMethod = logEntries.GetMethod("Clear",System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
clearMethod.Invoke(null, null);
EditorCoroutineUtility.StartCoroutineOwnerless(TranslateAsync());
}
public static IEnumerator TranslateAsync()
{
var scenes = EditorBuildSettings.scenes;
foreach (var scene in scenes)
{
print("OpenNewScene");
EditorSceneManager.OpenScene(scene.path);
var tmpList1 = FindObjectsOfType<Text>(true);
foreach (var tmp in tmpList1)
{
yield return TranslateAsync(tmp.text, ((targetText) =>
{
print($"{
tmp.text} {
targetText}");
tmp.text = targetText;
EditorUtility.SetDirty(tmp);
}));
}
//var tmpList2 = FindObjectsOfType<TextMeshPro>(true);
// foreach (var tmp in tmpList2)
// {
// yield return EditorCoroutineUtility.StartCoroutineOwnerless(TranslateAsync(tmp.text, ((targetText) =>
// {
// print($"{tmp.text} {targetText}");
// //tmp.text = targetText;
// EditorUtility.SetDirty(tmp);
// })));
// }
EditorSceneManager.SaveOpenScenes();
print("SaveOpenScene");
}
var guidList = AssetDatabase.FindAssets("t:Prefab");
foreach (var guid in guidList)
{
var path = AssetDatabase.GUIDToAssetPath(guid);
var gameObject = AssetDatabase.LoadAssetAtPath<GameObject>(path);
var tmpList1 = gameObject.GetComponentsInChildren<Text>(true);
foreach (var tmp in tmpList1)
{
yield return EditorCoroutineUtility.StartCoroutineOwnerless(TranslateAsync(tmp.text, ((targetText) =>
{
print($"{
gameObject.name} {
tmp.text} {
targetText}");
tmp.text = targetText;
EditorUtility.SetDirty(gameObject);
})));
}
//var tmpList2 = gameObject.GetComponentsInChildren<TextMeshPro>(true);
// foreach (var tmp in tmpList2)
// {
// yield return EditorCoroutineUtility.StartCoroutineOwnerless(TranslateAsync(tmp.text, ((targetText) =>
// {
// print($"{gameObject.name} {tmp.gameObject.name}");
// print($"{tmp.text} {targetText}");
// tmp.text = targetText;
// EditorUtility.SetDirty(gameObject);
// })));
// }
}
}
//更改sourceLang和targetLange对应的标识实现不同的翻译需求
static IEnumerator TranslateAsync(string text, Action<string> complete, string sourceLang = "en", string targetLang = "zh-CN")
{
var requestUrl = string.Format(k_Url, sourceLang, targetLang, text);
var request = UnityWebRequest.Get(requestUrl);
request.timeout = 5;
yield return request.SendWebRequest();
if (string.IsNullOrEmpty(request.error))
{
var fullText = request.downloadHandler.text;
print(fullText);
Regex regex = new Regex("[/[][/[][/[]\"(.*?)\",");
string targetText = regex.Match(fullText).Groups[1].ToString();
complete(targetText);
}
yield return null;
}
}
参考 【游戏开发实战】Unity调用谷歌Google免费翻译API(https接口),年轻人不讲武德,用多个国家语言怎么讲