New file |
| | |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using UnityEngine; |
| | | using UnityEditor; |
| | | using System.IO; |
| | | using UnityEngine.UI; |
| | | using vnxbqy.UI; |
| | | using System.Text; |
| | | |
| | | public class ImportPrefabsLanguage : EditorWindow {
|
| | |
|
| | | private static string topFilePath = Application.dataPath + "/ResourcesOut/UI"; |
| | | |
| | | [MenuItem("策划工具/==给打标记预制体进行翻译==", false)] |
| | | private static void Export() |
| | | { |
| | | Debug.Log("工具说明:语言表必须已翻译好,多执行几次直到不再修改!!! 一般只在新地区需要翻译的时候使用一次即可,后续开发由程序正常提取到语言表,不再使用此工具"); |
| | | string readPath = "Assets\\ResourcesOut\\Refdata\\Config\\Language.txt"; |
| | | if (!File.Exists(readPath)) |
| | | { |
| | | Debug.LogError("语言表Assets\\ResourcesOut\\Refdata\\Config\\Language.txt 不存在"); |
| | | return; |
| | | }
|
| | |
|
| | | string[] lines = File.ReadAllLines(readPath, Encoding.UTF8);
|
| | |
|
| | | if (lines.Length == 0)
|
| | | {
|
| | | Debug.LogError("读语言表失败");
|
| | | }
|
| | | else
|
| | | {
|
| | | Debug.Log("读语言表成功 " + lines.Length);
|
| | | }
|
| | | Dictionary<string, string> dic = new Dictionary<string, string>();
|
| | |
|
| | | for (int i = 3; i < lines.Length; i++)
|
| | | {
|
| | | string[] info = lines[i].Split('\t');
|
| | |
|
| | | string key;
|
| | | try
|
| | | {
|
| | | key = info[0];
|
| | | if (dic.ContainsKey(key))
|
| | | {
|
| | | continue;
|
| | | }
|
| | | dic[key] = info[1];
|
| | | }
|
| | | catch (System.Exception)
|
| | | {
|
| | | Debug.LogError("解析失败" + lines[i] + " - 行号: " + i);
|
| | | continue;
|
| | | }
|
| | | }
|
| | |
|
| | | string[] filepaths = Directory.GetFiles(topFilePath, "*.prefab", SearchOption.AllDirectories); |
| | | Debug.LogFormat("UI预制体文字路径{0}, {1}", topFilePath, filepaths.Length);
|
| | |
|
| | |
|
| | | int startIndex = 0; |
| | | int changeCnt = 0; |
| | | EditorApplication.update = delegate ()
|
| | | { |
| | | if (startIndex >= lines.Length) |
| | | { |
| | | Debug.LogFormat("翻译结束-- 检索{0}个预制体,共翻译{1}个文本", startIndex, changeCnt); |
| | | EditorUtility.ClearProgressBar(); |
| | | EditorApplication.update = null; |
| | | startIndex = 0; |
| | | AssetDatabase.SaveAssets(); |
| | | AssetDatabase.Refresh(); |
| | | return; |
| | | }
|
| | | string file = filepaths[startIndex]; |
| | | file = file.Substring(file.IndexOf("Assets")); |
| | | bool isCancel = EditorUtility.DisplayCancelableProgressBar("翻译预制体文字-" + filepaths.Length, file, (float)startIndex / (float)filepaths.Length); |
| | | GameObject _prefab = AssetDatabase.LoadAssetAtPath<GameObject>(file); |
| | | |
| | | UITextMark[] transArr14 = _prefab.GetComponentsInChildren<UITextMark>(true);
|
| | |
|
| | | |
| | | foreach (UITextMark item in transArr14) |
| | | { |
| | | Text tmpText = item.GetComponent<Text>(); |
| | | if (tmpText == null)
|
| | | {
|
| | | Debug.LogErrorFormat("异常:第{0}行翻译失败{1},{2}", startIndex, file, item.name);
|
| | | continue;
|
| | | } |
| | | |
| | | if (!dic.ContainsKey(item.language))
|
| | | {
|
| | | Debug.LogErrorFormat("异常:第{0}行翻译失败{1},{2}, 语言表 key不存在 {3}", startIndex, file, item.name, item.language);
|
| | | continue;
|
| | | } |
| | | |
| | | if (tmpText.text != dic[item.language])
|
| | | { |
| | | tmpText.text = dic[item.language]; |
| | | EditorUtility.SetDirty(_prefab); |
| | | changeCnt++; |
| | | } |
| | | |
| | | } |
| | | startIndex++;
|
| | |
|
| | | if (isCancel || startIndex >= filepaths.Length)
|
| | | { |
| | | Debug.LogFormat("翻译结束-- 检索{0}个预制体,共翻译{1}个文本", startIndex, changeCnt); |
| | | EditorUtility.ClearProgressBar(); |
| | | EditorApplication.update = null; |
| | | startIndex = 0;
|
| | | AssetDatabase.SaveAssets(); |
| | | AssetDatabase.Refresh(); |
| | | |
| | | }
|
| | | };
|
| | |
|
| | |
|
| | | }
|
| | |
|
| | |
|
| | | } |
| | | |
| | | //[MenuItem("策划工具/==批量给预制体打标记==", false)]
|
| | | //private static void Export()
|
| | | //{
|
| | | // string writePath = "importUITextMark.txt";
|
| | | // if (!File.Exists(writePath))
|
| | | // {
|
| | | // return;
|
| | | // }
|
| | |
|
| | | // string[] lines = File.ReadAllLines(writePath, Encoding.UTF8);
|
| | |
|
| | | // int startIndex = 0;
|
| | | // int changeCnt = 0;
|
| | | // EditorApplication.update = delegate () {
|
| | | // if (startIndex >= lines.Length)
|
| | | // {
|
| | | // Debug.LogFormat("批量标记修改成功-- 检索{0}行,共替换{1}行", startIndex, changeCnt);
|
| | | // EditorUtility.ClearProgressBar();
|
| | | // EditorApplication.update = null;
|
| | | // startIndex = 0;
|
| | | // AssetDatabase.SaveAssets();
|
| | | // AssetDatabase.Refresh();
|
| | | // return;
|
| | | // }
|
| | | // var lineStr = lines[startIndex];
|
| | | // string[] info = lines[startIndex].Split('\t');
|
| | | // startIndex++;
|
| | | // if (info.Length != 7)
|
| | | // {
|
| | | // Debug.LogFormat("异常:长度不对--执行到:第{0}行 {1}", startIndex, lineStr);
|
| | | // return;
|
| | | // }
|
| | | // string file = info[0];
|
| | | // int index = int.Parse(info[1]);
|
| | | // string name = info[2];
|
| | | // string content = info[5];
|
| | |
|
| | | // bool isCancel = EditorUtility.DisplayCancelableProgressBar("导入预制体文字-" + lines.Length, file, (float)startIndex / (float)lines.Length);
|
| | | // GameObject _prefab = AssetDatabase.LoadAssetAtPath<GameObject>(file);
|
| | | // if (_prefab == null)
|
| | | // {
|
| | | // if (isCancel)
|
| | | // {
|
| | |
|
| | | // EditorUtility.ClearProgressBar();
|
| | | // EditorApplication.update = null;
|
| | | // startIndex = 0;
|
| | | // AssetDatabase.SaveAssets();
|
| | | // AssetDatabase.Refresh();
|
| | | // }
|
| | | // Debug.LogFormat("异常:预制体异常--执行到:第{0}行 {1}", startIndex, lineStr);
|
| | | // return;
|
| | | // }
|
| | | // Text[] transArr = _prefab.GetComponentsInChildren<Text>(true);
|
| | |
|
| | | // Text item = transArr[index];
|
| | | // if (item.name == name)
|
| | | // {
|
| | | // var mark = item.GetComponent<UITextMark>();
|
| | | // if (mark == null)
|
| | | // {
|
| | | // mark = item.gameObject.AddComponent<UITextMark>();
|
| | | // mark.language = content;
|
| | | // EditorUtility.SetDirty(_prefab);
|
| | | // changeCnt++;
|
| | | // //Debug.LogFormat("字体批量文件--{0} , {1}", file, index);
|
| | | // }
|
| | | // else if (mark.language != content)
|
| | | // {
|
| | | // Debug.LogErrorFormat("异常:第{0}行替换失败{1},{2}", startIndex, file, name);
|
| | | // }
|
| | | // }
|
| | | // else
|
| | | // {
|
| | | // Debug.LogErrorFormat("异常:第{0}行替换失败{1},{2}", startIndex, file, name);
|
| | | // }
|
| | |
|
| | | // if (isCancel || startIndex >= lines.Length)
|
| | | // {
|
| | | // Debug.LogFormat("文字批量修改成功-- 检索{0}行,共替换{1}行", startIndex, changeCnt);
|
| | | // EditorUtility.ClearProgressBar();
|
| | | // EditorApplication.update = null;
|
| | | // startIndex = 0;
|
| | | // AssetDatabase.SaveAssets();
|
| | | // AssetDatabase.Refresh();
|
| | | // }
|
| | | // };
|
| | |
|
| | |
|
| | |
|
| | | // Debug.LogFormat("导入翻译完成");
|
| | |
|
| | | //} |
| | | //导出和语言表共用的key,如果没有生成唯一key |
| | | //private static void Export()
|
| | | //{
|
| | | // // 将港台的中文 写入到越南的表中
|
| | | // //Language import3
|
| | | // string readPath = "Assets\\ResourcesOut\\Refdata\\Config\\Language.txt";
|
| | | // if (!File.Exists(readPath))
|
| | | // {
|
| | | // return;
|
| | | // }
|
| | |
|
| | | // string[] lines = File.ReadAllLines(readPath, Encoding.UTF8);
|
| | |
|
| | | // if (lines.Length == 0)
|
| | | // {
|
| | | // Debug.LogError("读语言表失败");
|
| | | // }
|
| | | // else
|
| | | // {
|
| | | // Debug.Log("读语言表成功 " + lines.Length);
|
| | | // }
|
| | | // Dictionary<string, string> dic = new Dictionary<string, string>();
|
| | |
|
| | | // for (int i = 3; i < lines.Length; i++)
|
| | | // {
|
| | | // string[] info = lines[i].Split('\t');
|
| | |
|
| | | // string key;
|
| | | // try
|
| | | // {
|
| | | // key = info[1];
|
| | | // }
|
| | | // catch (System.Exception)
|
| | | // {
|
| | | // Debug.LogError("读语言表失败" + lines[i] + " - " + i);
|
| | | // continue;
|
| | | // }
|
| | | // if (dic.ContainsKey(key))
|
| | | // {
|
| | | // continue;
|
| | | // }
|
| | | // dic[key] = info[0];
|
| | | // }
|
| | |
|
| | | // string[] linesZH = File.ReadAllLines("import3.txt", Encoding.UTF8);
|
| | |
|
| | |
|
| | | // Dictionary<string, string> dicZH = new Dictionary<string, string>();
|
| | | // SortedDictionary<string, string[]> dicZHList = new SortedDictionary<string, string[]>();
|
| | |
|
| | |
|
| | | // for (int i = 0; i < linesZH.Length; i++)
|
| | | // {
|
| | | // string[] info = linesZH[i].Split('\t');
|
| | |
|
| | | // var key = info[0] + "_" + info[1] + "_" + info[2];
|
| | | // dicZHList[key] = info;
|
| | |
|
| | | // if (string.IsNullOrEmpty(info[5].Trim()))
|
| | | // {
|
| | | // continue;
|
| | | // }
|
| | |
|
| | | // if (dicZH.ContainsKey(info[6]))
|
| | | // {
|
| | | // continue;
|
| | | // }
|
| | | // dicZH[info[6]] = info[5];
|
| | | // }
|
| | |
|
| | | // string writePath = "exportUILanguage3.txt";
|
| | | // if (File.Exists(writePath))
|
| | | // {
|
| | | // File.Delete(writePath);
|
| | | // }
|
| | | // FileStream fs = new FileStream(writePath, FileMode.Create);//如不存在,则创建新的文本文档
|
| | |
|
| | | // //1.找语言表有的写入line
|
| | | // //2.找语言表没有的 查找缓存,缓存没有的写入缓存 并写入line
|
| | | // foreach (var item in dicZHList)
|
| | | // {
|
| | | // var key = item.Key;
|
| | | // var line = item.Value;
|
| | |
|
| | | // var lineList = new List<string>(line);
|
| | |
|
| | | // bool islan = false;
|
| | | // if (string.IsNullOrEmpty(lineList[5].Trim()))
|
| | | // {
|
| | |
|
| | | // if (dic.ContainsKey(lineList[6]))
|
| | | // {
|
| | | // lineList[5] = dic[lineList[6]];
|
| | | // islan = true;
|
| | | // }
|
| | | // else if (dicZH.ContainsKey(lineList[6]))
|
| | | // {
|
| | | // lineList[5] = dicZH[lineList[6]];
|
| | | // }
|
| | | // else
|
| | | // {
|
| | | // dicZH[lineList[6]] = lineList[3];
|
| | | // lineList[5] = lineList[3];
|
| | | // }
|
| | | // }
|
| | | // else
|
| | | // {
|
| | | // if (dic.ContainsKey(lineList[6]))
|
| | | // {
|
| | | // islan = true;
|
| | | // }
|
| | | // }
|
| | |
|
| | | // string newLine = string.Join("\t", lineList);
|
| | | // newLine = newLine + "\t" + islan + "\r\n";
|
| | |
|
| | | // byte[] data1 = System.Text.Encoding.UTF8.GetBytes(newLine);
|
| | | // fs.Write(data1, 0, data1.Length);
|
| | | // }
|
| | |
|
| | | // fs.Close();
|
| | |
|
| | |
|
| | | // Debug.LogFormat("导出完成");
|
| | |
|
| | | //} |
| | | |
| | | // 将key读取从text的内容 移植到 keyname中 |
| | | |
| | | //public class ImportPrefabsLanguage : EditorWindow
|
| | | //{ |
| | | |
| | | |
| | | // [MenuItem("策划工具/==批量导入预制体语言表设置==", false)] |
| | | // private static void Export() |
| | | // { |
| | | |
| | | // string writePath = "importUILanguage.txt"; |
| | | // if (!File.Exists(writePath)) |
| | | // { |
| | | // return; |
| | | // } |
| | | |
| | | // string[] lines = File.ReadAllLines(writePath, Encoding.UTF8); |
| | | |
| | | // int startIndex = 1; |
| | | // int changeCnt = 0; |
| | | // EditorApplication.update = delegate () { |
| | | // if (startIndex >= lines.Length) |
| | | // { |
| | | // Debug.LogFormat("语言表文字批量修改成功-- 检索{0}行,共替换{1}行", startIndex, changeCnt); |
| | | // EditorUtility.ClearProgressBar(); |
| | | // EditorApplication.update = null; |
| | | // startIndex = 0; |
| | | // AssetDatabase.SaveAssets(); |
| | | // AssetDatabase.Refresh(); |
| | | // return; |
| | | // } |
| | | // var lineStr = lines[startIndex]; |
| | | // string[] info = lines[startIndex].Split('\t'); |
| | | // startIndex++; |
| | | // if (info.Length != 8) |
| | | // { |
| | | // Debug.LogFormat("异常:长度不对--执行到:第{0}行 {1}", startIndex, lineStr); |
| | | // return; |
| | | // } |
| | | // string file = info[0]; |
| | | // int index = int.Parse(info[1]); |
| | | // string name = info[2]; |
| | | // string content = info[4].Replace("\r", "").Replace("\n", ""); |
| | | // int state; |
| | | // int.TryParse(info[7], out state); |
| | | |
| | | // bool isCancel = EditorUtility.DisplayCancelableProgressBar("导入预制体语言key-" + lines.Length, file, (float)startIndex / (float)lines.Length); |
| | | // GameObject _prefab = AssetDatabase.LoadAssetAtPath<GameObject>(file); |
| | | // if (_prefab == null) |
| | | // { |
| | | // if (isCancel)
|
| | | // { |
| | | |
| | | // EditorUtility.ClearProgressBar(); |
| | | // EditorApplication.update = null; |
| | | // startIndex = 0; |
| | | // AssetDatabase.SaveAssets(); |
| | | // AssetDatabase.Refresh(); |
| | | // } |
| | | // Debug.LogFormat("异常:预制体异常--执行到:第{0}行 {1}", startIndex, lineStr); |
| | | // return; |
| | | // } |
| | | // Text[] transArr = _prefab.GetComponentsInChildren<Text>(true); |
| | | |
| | | // Text item = transArr[index]; |
| | | // if (item.name == name) |
| | | // {
|
| | | // if (state == 1)
|
| | | // {
|
| | | // bool reset = false;
|
| | | // TextEx tmpTextEx = item as TextEx; //TextImage 是TextEx的子类 |
| | | // if ((tmpTextEx != null && tmpTextEx.isKey)) |
| | | // { |
| | | // if (tmpTextEx.keyName != content)
|
| | | // {
|
| | | // tmpTextEx.keyName = content; |
| | | // reset = true; |
| | | // } |
| | | // } |
| | | |
| | | // RichText tmpRichText = item as RichText; |
| | | // if ((tmpRichText != null && tmpRichText.language)) |
| | | // { |
| | | // if (tmpRichText.enableDisplay != content) |
| | | // {
|
| | | // tmpRichText.enableDisplay = content;
|
| | | // reset = true;
|
| | | // } |
| | | // } |
| | | |
| | | // if (reset) |
| | | // { |
| | | // EditorUtility.SetDirty(_prefab); |
| | | // changeCnt++;
|
| | | // //Debug.LogFormat("字体批量文件--{0} , {1}", file, index);
|
| | | // } |
| | | // }
|
| | | // } |
| | | // else |
| | | // { |
| | | // Debug.LogErrorFormat("异常:第{0}行替换失败{1},{2}", startIndex, file, name); |
| | | // } |
| | | |
| | | // if (isCancel || startIndex >= lines.Length)
|
| | | // { |
| | | // Debug.LogFormat("文字key批量修改成功-- 检索{0}行,共替换{1}行", startIndex, changeCnt); |
| | | // EditorUtility.ClearProgressBar(); |
| | | // EditorApplication.update = null; |
| | | // startIndex = 0; |
| | | // AssetDatabase.SaveAssets(); |
| | | // AssetDatabase.Refresh(); |
| | | // } |
| | | // };
|
| | |
|
| | |
|
| | | // }
|
| | |
|
| | |
|
| | | //} |