Unity使用Google翻译批量翻译更改文本

记录下一个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接口),年轻人不讲武德,用多个国家语言怎么讲

猜你喜欢

转载自blog.csdn.net/weixin_44276280/article/details/131720754