using UnityEngine; using System.Collections.Generic; using UnityEditor; using UnityEngine.UI; using System.Text.RegularExpressions; using System.IO; public class Multilingual_ComplexFont : MonoBehaviour { /// /// 语言信息 /// public class GualInfo { /// /// 中文文本 /// public string ChineseText = ""; /// /// 翻译文本 /// public string TranslateText = "-1"; public string ToLine() { return string.Format("{0}\t{1}", ChineseText, TranslateText); } } /// /// 所有文本路径 /// private static string AllTEXTPATH = Application.dataPath.Replace("Assets", "Multilingual\\"); /// /// 预设文本路径 /// private static string PREFABPATH = Application.dataPath+ "\\Project3D\\BundleData\\UI\\Prefab"; /// /// 表格文本路径 /// private static string TABFILEPATH = Application.dataPath + "\\Project3D\\BundleData\\Tables3D"; /// /// LUA表格文本路径 /// private static string TABLUAFILEPATH = Application.dataPath + "\\Project\\Script\\LuaScripts\\GameTables\\Lua"; /// /// 还原所有UI文本 /// [MenuItem("ProTool/Multilingual/繁体/还原/ReturnAllUIText 还原到汉语简体")] public static void ReturnAllUIText1() { SetAllUIText("繁体//", 0); } /// /// 还原所有表格文本 /// [MenuItem("ProTool/Multilingual/繁体/还原/ReturnAllTabText 还原到汉语简体")] public static void ReturnAllTabText1() { var utf8WithoutBom = new System.Text.UTF8Encoding(false); //所有表格文本路径 string allTabtextPath = AllTEXTPATH + "//AllTabText.txt"; //获取文件信息 FileInfo fi = new FileInfo(allTabtextPath); //信息字典 Dictionary> fiLineDics = new Dictionary>(); //信息存在 if (fi.Exists) { //使用Unicode编码从字节流中读取文件 StreamReader sw1 = new StreamReader(allTabtextPath, System.Text.Encoding.Unicode); //读取文件 string line = sw1.ReadLine(); //不为空循环 while (line!=null) { line = sw1.ReadLine(); if (string.IsNullOrEmpty(line)) continue;//结束本次循环开始下次循环 string[] lines = line.Split('\t'); if (lines.Length < 2) continue; //存入字典 fiLineDics[lines[0]] = new List(lines); } //关闭读取 sw1.Close(); } else { //显示一个模态对话框。 EditorUtility.DisplayDialog("缺少文件", string.Format("找不到 {0} 文件", allTabtextPath), "yes"); return; } //创建目录文件夹 DirectoryInfo directoryInfo = Directory.CreateDirectory(TABFILEPATH); //获取以 .txt 后缀文件目录信息 FileInfo[] fileInfos = directoryInfo.GetFiles("*.txt", SearchOption.AllDirectories); for (int n = 0; n < fileInfos.Length; n++) { //是否包含 StrDictionary 文件 if (fileInfos[n].Name.Contains("StrDictionary")) continue; //使用utf8编码从字节流中读取文件 StreamReader sw1 = new StreamReader(fileInfos[n].FullName, utf8WithoutBom); //流 列表 List lines = new List(); //读取 string line = sw1.ReadLine(); //存入列表 lines.Add(line); //不是null while (line!=null) { //读取 line = sw1.ReadLine(); if (string.IsNullOrEmpty(line)) continue; string[] strs = line.Split('\t'); if (strs.Length < 2) continue; ///存入列表 lines.Add(line); } //关闭 sw1.Close(); if (lines.Count <= 2) continue; //分离 string[] column = lines[0].Split('\t'); for (int i = 2; i < lines.Count; i++) { //不是空 不包含 "#"和"\t" if (!string.IsNullOrEmpty(lines[i]) && !lines[i][0].Equals('#') && !lines[i][0].Equals('\t')) { //分离 string[] segments = lines[i].Split('\t'); if (segments.Length != column.Length) { Debug.Log("error : " + lines[i]); return; } for (int index = 2; index < column.Length; index++) { //新格式字符串 名字 列 段 string key = string.Format("{0}#{1}#{2}", fileInfos[n].Name, column[index], segments[0]); // fiLineDics字典包含 key if (fiLineDics.ContainsKey(key)) { //取值 segments[index] = fiLineDics[key][1]; //连接 lines[i] = string.Join("\t", segments); } } //显示进度条 标题 信息 进度 EditorUtility.DisplayProgressBar("Find All Text", string.Format("Files : {0}/{1} {2}", n, fileInfos.Length, fileInfos[n].FullName), n * 1.0f / fileInfos.Length); } } // utf8编码格式写入 如果存在则改写 不存在侧创建 StreamWriter sw = new StreamWriter(fileInfos[n].FullName, false, utf8WithoutBom); for (int i = 0; i < lines.Count; i++) { //输出 sw.WriteLine(lines[i]); } //关闭 sw.Close(); } //关闭进度条 EditorUtility.ClearProgressBar(); //将所有未保存的资产更改写入磁盘 AssetDatabase.SaveAssets(); } #region //翻译 /// /// 翻译所有UI文本 /// [MenuItem("ProTool/Multilingual/繁体/翻译/Set/SetAllUIText")] public static void SetAllUIText1() { SetAllUIText("繁体//",1); Debug.Log("SetAllUIText success!"); } /// /// 翻译所有表格文本 /// [MenuItem("ProTool/Multilingual/繁体/翻译/Set/SetAllTabText")] public static void SetAllTabText1() { SetAllTabText("繁体", TABFILEPATH, "AllTabText.txt"); SetAllLuaTabText("繁体", TABLUAFILEPATH, "AllTabText.txt"); Debug.Log("SetAllTabText success!"); } /// /// 翻译StrDictionaty /// [MenuItem("ProTool/Multilingual/繁体/翻译/Set/SetStrDictionatyText")] public static void SetStrTabText1() { SetStrTabText("繁体", TABFILEPATH); Debug.Log("SetStrDictionatyText success!"); } [MenuItem("ProTool/Multilingual/繁体/翻译/Get/GetAllUIText")] public static void AllUIText1() { GetAllUIText("繁体"); } [MenuItem("ProTool/Multilingual/繁体/翻译/Get/GetAllTabText")] public static void AllTabText1() { GetAllTabText("繁体", TABFILEPATH, "AllTabText.txt"); } #endregion /// /// 修剪 /// /// /// public static string TrimAll(string ChinaText) { ChinaText = ChinaText.TrimEnd('"'); ChinaText = ChinaText.TrimStart('"'); return ChinaText; } /// /// 替换中文符号 /// /// /// public static string ReplaceMaoHao(string text) { text = text.Replace(":", ""); text = text.Replace("。", "."); text = text.Replace(":", ""); return text.Replace(":", ""); } /// /// AllUIText 本地上次获取的所有UIPrefab上的文本信息 NewAllUIText 需要进行翻译的文本的信息 /// 该函数先对比 AllUIText NewAllUIText两个文件,把NewAllUIText中有而AllUIText中没有或者NewAllUIText /// 和AllUIText不一样的部分合并到AllUIText中并清空NewAllUIText文件。然后读取所有UIPrefab上的文本信息,并和AllUIText中的信息对比, /// 把有变化的或者不存在的保存到NewAllUIText中,完成后NewAllUIText中的文本就是最新需要翻译的文本 /// /// public static void GetAllUIText(string country) { //所有ui文本 string allUItextPath = AllTEXTPATH + string.Format("//{0}//AllUIText.txt", country); //新的未翻译的ui文本 string newallUItextPath = AllTEXTPATH + string.Format("//{0}//TranslateAllUIText.txt", country); //1对比两个文件 FileInfo fi = new FileInfo(allUItextPath); FileInfo fiNew = new FileInfo(newallUItextPath); if(fi.Exists != fiNew.Exists ) { EditorUtility.DisplayDialog("123", "有问题 AllUIText TranslateAllUIText 要么都存在要么都不存在,检查一下SVN的记录,是不是本地的被删掉了", "123"); return; } //字典 Dictionary fiLineDics = new Dictionary(); if (fiNew.Exists) { //以Unicode编码读取文件 StreamReader sw1 = new StreamReader(allUItextPath, System.Text.Encoding.Unicode); StreamReader swnew1 = new StreamReader(newallUItextPath, System.Text.Encoding.Unicode); int index = 0; string line = sw1.ReadLine(); while(line!=null) { index++; //读取一行 line = sw1.ReadLine(); if (string.IsNullOrEmpty(line)) { Debug.Log(index+" null "+line); continue; } string[] lines = line.Split('\t'); if (lines.Length < 2) { Debug.Log(index + " <2 " + line); continue; } Debug.Log("sdafsafdsaf : "+line); GualInfo gualInfo = new GualInfo(); //删除无用 gualInfo.ChineseText = TrimAll(lines[0]); gualInfo.TranslateText = lines[1]; //替换符号 string chinaText = ReplaceMaoHao(gualInfo.ChineseText); fiLineDics[chinaText] = gualInfo; } line = swnew1.ReadLine(); while (line!=null) { line = swnew1.ReadLine(); if (string.IsNullOrEmpty(line)) continue; string[] lines = line.Split('\t'); if (lines.Length < 2) continue; GualInfo gualInfo = new GualInfo(); //删除 gualInfo.ChineseText = TrimAll(lines[0]); //替换 string chinaText = ReplaceMaoHao(gualInfo.ChineseText); gualInfo.TranslateText = lines[1]; if (fiLineDics.ContainsKey(chinaText) == false || gualInfo.TranslateText != "-1") { fiLineDics[chinaText] = gualInfo; } } //关闭 sw1.Close(); swnew1.Close(); } //获取目录信息 DirectoryInfo directoryInfo = Directory.CreateDirectory(PREFABPATH); //文件信息 FileInfo[] fileInfos = directoryInfo.GetFiles("*.prefab", SearchOption.AllDirectories); for (int i = 0; i < fileInfos.Length; i++) { //替换 string assetPath = fileInfos[i].FullName.Replace("\\", "/"); assetPath = assetPath.Replace(Application.dataPath, "Assets"); //加载对应路径的资产 UnityEngine.Object[] objs = AssetDatabase.LoadAllAssetsAtPath(assetPath); for (int j = 0; j < objs.Length; j++) { if (objs[j] == null) continue; if (objs[j].GetType() != typeof(Text)) continue; Text text = objs[j] as Text; if (text == null) continue; string txtStr = text.text; //是否有中文 if (Regex.IsMatch(txtStr, @"[\u4e00-\u9fa5]+") == false) { continue; } //替换 string LabelText = txtStr.Replace("\t", "#t").Replace("\r\n", "#r#n").Replace("\r", "#r").Replace("\n", "#n"); GualInfo gualInfo = new GualInfo(); LabelText = TrimAll(LabelText);//删除 string chinaText = ReplaceMaoHao(LabelText);//替换 if (fiLineDics.ContainsKey(chinaText) == false) { gualInfo.ChineseText = LabelText; fiLineDics[chinaText] = gualInfo; } //对话框 EditorUtility.DisplayProgressBar("Find All Text", string.Format("Files : {0}/{1}", i, fileInfos.Length), i * 1.0f / fileInfos.Length); } } if (!fi.Directory.Exists) { fi.Directory.Create();//创建 } //读取 StreamWriter sw = new StreamWriter(allUItextPath,false, System.Text.Encoding.Unicode); StreamWriter swnew = new StreamWriter(newallUItextPath,false, System.Text.Encoding.Unicode); StreamWriter swOriginal = new StreamWriter(AllTEXTPATH + "//AllUIText.txt", false, System.Text.Encoding.Unicode); //写出列名称 string linew = "中文" + "\t" + country; //写入 sw.WriteLine(linew); swnew.WriteLine(linew); swOriginal.WriteLine(linew); foreach (var gual in fiLineDics) { linew = gual.Value.ToLine(); //写入 if (gual.Value.TranslateText == "-1") swnew.WriteLine(linew); sw.WriteLine(linew); swOriginal.WriteLine(linew); } //关闭 sw.Close(); swnew.Close(); swOriginal.Close(); EditorUtility.ClearProgressBar(); } public static void GetAllTabText(string country,string tabsDictionary,string translatetabName) { var utf8WithoutBom = new System.Text.UTF8Encoding(false); string allUItextPath = AllTEXTPATH + string.Format("//{0}//{1}", country, translatetabName); string newallUItextPath = AllTEXTPATH + string.Format("//{0}//Translate{1}", country, translatetabName); //1对比两个文件 FileInfo fi = new FileInfo(allUItextPath); FileInfo fiNew = new FileInfo(newallUItextPath); if (fi.Exists != fiNew.Exists) { EditorUtility.DisplayDialog("123", "有问题 AllUIText NewAllUIText 要么都存在要么都不存在,检查一下SVN的记录,是不是本地的被删掉了", "123"); return; } Dictionary fiLineDics = new Dictionary(); if (fiNew.Exists) { StreamReader sw1 = new StreamReader(allUItextPath, System.Text.Encoding.Unicode); StreamReader swnew1 = new StreamReader(newallUItextPath, System.Text.Encoding.Unicode); string line = sw1.ReadLine(); while (line!=null) { line = sw1.ReadLine(); if (string.IsNullOrEmpty(line)) continue; string[] lines = line.Split('\t'); if (lines.Length < 2) continue; GualInfo gualInfo = new GualInfo(); gualInfo.ChineseText = TrimAll(lines[0]); string chinaText = ReplaceMaoHao(gualInfo.ChineseText); gualInfo.TranslateText = lines[1]; fiLineDics[chinaText] = gualInfo; } line = swnew1.ReadLine(); while (line!=null) { line = swnew1.ReadLine(); if (string.IsNullOrEmpty(line)) continue; string[] lines = line.Split('\t'); if (lines.Length < 2) continue; GualInfo gualInfo = new GualInfo(); gualInfo.ChineseText = TrimAll(lines[0]); string chinaText = ReplaceMaoHao(gualInfo.ChineseText); gualInfo.TranslateText = lines[1]; if (fiLineDics.ContainsKey(chinaText) ==false || gualInfo.TranslateText != "-1") { fiLineDics[chinaText] = gualInfo; } } sw1.Close(); swnew1.Close(); } DirectoryInfo directoryInfo = Directory.CreateDirectory(tabsDictionary); FileInfo[] fileInfos = directoryInfo.GetFiles("*.txt", SearchOption.AllDirectories); for (int n = 0; n < fileInfos.Length; n++) { if (fileInfos[n].Name.Contains("StrDictionary")) continue; if (fileInfos[n].Name.Contains("StrFilter")) continue; if (fileInfos[n].Name.Contains("RoleName")) continue; if (fileInfos[n].Name.Contains("QuestionBank")) continue; StreamReader sw1 = new StreamReader(fileInfos[n].FullName, utf8WithoutBom); List lines = new List(); string line = sw1.ReadLine(); lines.Add(line); while (line!=null) { line = sw1.ReadLine(); if (string.IsNullOrEmpty(line)) continue; string[] strs = line.Split('\t'); if (strs.Length < 2) continue; lines.Add(line); } sw1.Close(); if (lines.Count < 2) continue; string[] column = lines[0].Split('\t'); for (int i = 2; i < lines.Count; i++) { if (!string.IsNullOrEmpty(lines[i]) && !lines[i][0].Equals('#') && !lines[i][0].Equals('\t')) { string[] segments = lines[i].Split('\t'); if (segments.Length != column.Length) { Debug.Log("error : " + lines[i]); return; } for (int index = 2; index < column.Length; index++) { if (Regex.IsMatch(segments[index], @"[\u4e00-\u9fa5]+") == false) { continue; } string ChineText = segments[index]; ChineText = TrimAll(ChineText); string chinaText = ReplaceMaoHao(ChineText); if (fileInfos[n].Name.Contains("StrFilter") || fileInfos[n].Name.Contains("RoleName")) { if(fiLineDics.ContainsKey(chinaText)) fiLineDics.Remove(chinaText); } else if (fiLineDics.ContainsKey(chinaText) == false) { GualInfo gualInfo = new GualInfo(); gualInfo.ChineseText = ChineText; gualInfo.TranslateText = "-1"; fiLineDics[chinaText] = gualInfo; } } EditorUtility.DisplayProgressBar("Find All Text", string.Format("Files : {0}/{1} {2}", n, fileInfos.Length, fileInfos[n].FullName), n * 1.0f / fileInfos.Length); } } } if (!fi.Directory.Exists) { fi.Directory.Create(); } StreamWriter sw = new StreamWriter(allUItextPath,false, System.Text.Encoding.Unicode); StreamWriter swnew = new StreamWriter(newallUItextPath,false, System.Text.Encoding.Unicode); StreamWriter swOriginal = new StreamWriter(AllTEXTPATH + "//" + translatetabName, false, System.Text.Encoding.Unicode); //写出列名称 string linew = "中文" + "\t" + country; sw.WriteLine(linew); swnew.WriteLine(linew); swOriginal.WriteLine(linew); foreach (var gual in fiLineDics) { linew = gual.Value.ToLine(); if (gual.Value.TranslateText == "-1") swnew.WriteLine(linew); sw.WriteLine(linew); swOriginal.WriteLine(linew); } sw.Close(); swnew.Close(); swOriginal.Close(); EditorUtility.ClearProgressBar(); } /// /// 翻译或还原所有UI文本 /// /// 国家 /// 0还原 1翻译 public static void SetAllUIText(string country,int Opera) //Opera 0还原 1翻译 { //所有UI文本路径 string allUItextPath = AllTEXTPATH + string.Format("{0}AllUIText.txt", country); //文件信息 FileInfo fi = new FileInfo(allUItextPath); //文件信息路线字典 Dictionary fiLineDics = new Dictionary(); //文件信息翻译路线字典 Dictionary fiLineDicsTrasn = new Dictionary(); if (fi.Exists) { //使其以一种特定的编码从字节流中读取字符。 StreamReader sw1 = new StreamReader(allUItextPath, System.Text.Encoding.Unicode); string line = "5432"; while (line!=null) { //读取路线 line = sw1.ReadLine(); //为Null或空 if (string.IsNullOrEmpty(line)) continue; //分割 string[] lines = line.Split('\t'); if (lines.Length < 2 || string.IsNullOrEmpty(lines[1]) || lines[1] == "-1") continue; GualInfo gual = new GualInfo(); //修剪 gual.ChineseText = TrimAll(lines[0]); //替换冒号 gual.ChineseText = ReplaceMaoHao(gual.ChineseText); gual.TranslateText = TrimAll(lines[1]); //存入字典 fiLineDics[gual.ChineseText] = gual; fiLineDicsTrasn[lines[1]] = gual; //Debug.Log(string.Format("key words:string:{0}", gual.ChineseText)); } //关闭 sw1.Close(); } else { //显示一个模态对话框。 EditorUtility.DisplayDialog("123", string.Format("找不到 {0} 文件", allUItextPath), "123"); return; } string[] listFiles = { "PetMainWnd.prefab", "OtherPetInfo.prefab", "PetSkillsInfo.prefab", "MeridiaSoul.prefab" }; //读取目录信息 DirectoryInfo directoryInfo = Directory.CreateDirectory(PREFABPATH); //获取信息中 .prefab 后缀文件 FileInfo[] fileInfos = directoryInfo.GetFiles("*.prefab", SearchOption.AllDirectories); //目录信息长度 int fileCount = fileInfos.Length; for (int i = 0; i < fileInfos.Length; i++) { //替换 string fullPath = fileInfos[i].FullName.Replace("\\", "/"); //if (listFiles.Contain(fileInfos[i].Name) == false) { // continue; } Debug.Log(fileInfos[i].Name); //替换 string asstePath = fullPath.Replace(Application.dataPath.Replace("\\","/"), "Assets"); //通过路径加载资源 GameObject _prefab = AssetDatabase.LoadAssetAtPath(asstePath, typeof(GameObject)) as GameObject; if (_prefab == null) { Debug.Log(string.Format("找不到 {0} 文件", asstePath)); continue; } //实例化预设 GameObject prefabGameobject = PrefabUtility.InstantiatePrefab(_prefab) as GameObject; //获取预设文本 Text[] objs = prefabGameobject.GetComponentsInChildren(true); for (int j = 0; j < objs.Length; j++) { if (objs[j] == null) continue; string txtStr = objs[j].text; //翻译 且 不包含中文 if (Opera == 1 && Regex.IsMatch(txtStr, @"[\u4e00-\u9fa5]+") == false) { continue; } //替换 string LabelText = txtStr.Replace("\t", "#t").Replace("\r\n", "#r#n").Replace("\r", "#r").Replace("\n", "#n"); //Debug.Log(string.Format("find string:{0}", LabelText)); GualInfo gualInfo = null; //修剪 LabelText = TrimAll(LabelText); //替换符号 LabelText = ReplaceMaoHao(LabelText); //是否存在 if (fiLineDics.ContainsKey(LabelText)) { //Debug.Log(string.Format("has:string:{0}", LabelText)); gualInfo = fiLineDics[LabelText]; } else if(fiLineDicsTrasn.ContainsKey(LabelText)) { gualInfo = fiLineDicsTrasn[LabelText]; } else continue; if(Opera == 1) { //替换 string text = gualInfo.TranslateText.Replace("#t", "\t").Replace("#r#n", "\r\n").Replace("#n", "\n").Replace("#r", "\r"); objs[j].text = text; } else { //替换 string text = gualInfo.ChineseText.Replace("#t", "\t").Replace("#r#n", "\r\n").Replace("#n", "\n").Replace("#r", "\r"); objs[j].text = text; } } //进度条 EditorUtility.DisplayProgressBar("Set All Text", string.Format("prefabs : {0}/{1} {2}", i, fileCount, fileInfos[i].Name), i * 1.0f / fileCount); //PrefabUtility.SaveAsPrefabAsset(prefabGameobject, asstePath); //创建预制游戏对象后,返回该对象。如果connectToPrefab启用,prefabGameobject将成为创建的预制实例。 PrefabUtility.ReplacePrefab(prefabGameobject, _prefab, ReplacePrefabOptions.Default); //立即销毁 MonoBehaviour.DestroyImmediate(prefabGameobject); } //关闭进度天 EditorUtility.ClearProgressBar(); //将所有未保存的资产更改写入磁盘 AssetDatabase.SaveAssets(); } /// /// 翻译所有lua表格 /// /// 国家 /// 表格字典 /// 翻译表格名字 public static void SetAllLuaTabText(string country, string tabsDictionary, string translatetabName) { var utf8WithoutBom = new System.Text.UTF8Encoding(false); //所有表格文本路径 string allTabtextPath = AllTEXTPATH + string.Format("//{0}//{1}", country, translatetabName); //文件信息 FileInfo fi = new FileInfo(allTabtextPath); //字典 Dictionary fiLineDics = new Dictionary(); if (fi.Exists) { //使其以一种特定的编码从字节流中读取字符。 StreamReader sw1 = new StreamReader(allTabtextPath, System.Text.Encoding.Unicode); string line = "1213"; while (line != null) { //读取 line = sw1.ReadLine(); if (string.IsNullOrEmpty(line)) continue; string[] lines = line.Split('\t'); if (lines.Length < 2 || string.IsNullOrEmpty(lines[1]) || lines[1] == "-1" || lines[1] == "1") continue; //删除 string ChinaText = TrimAll(lines[0]); //替换中文符号 ChinaText = ReplaceMaoHao(ChinaText); //删除 fiLineDics[ChinaText] = TrimAll(lines[1]); } //关闭 sw1.Close(); } else { //对话框 EditorUtility.DisplayDialog("123", string.Format("找不到 {0} 文件", allTabtextPath), "123"); return; } //读取目录信息 DirectoryInfo directoryInfo = Directory.CreateDirectory(tabsDictionary); //文件信息 FileInfo[] allTabFiles = directoryInfo.GetFiles("*.*", SearchOption.AllDirectories); for (int i = 0; i < allTabFiles.Length; i++) { FileInfo fileInfo = allTabFiles[i]; //后缀 txt 或者 lua if (fileInfo.Extension.Contains("txt") || fileInfo.Extension.Contains("lua")) { //读取所有 string[] lines = File.ReadAllLines(fileInfo.FullName); List writeLines = new List(lines); for (int j = 0; j < writeLines.Count; j++) { //解析每一行 writeLines[j] = ParseOneLine(writeLines[j], fiLineDics); } //覆盖写入 File.WriteAllLines(fileInfo.FullName, writeLines.ToArray()); } } } /// /// 解析 /// /// 行 /// 对应字典 /// private static string ParseOneLine(string line,Dictionary fiLineDics) { //StartsWith确定此字符串实例的开头是否与指定的字符串匹配。 if (line.StartsWith("--") == false) { //切割后的孩子 List Child1s = new List(line.Split(',')); for (int i = 0; i < Child1s.Count; i++) { if (string.IsNullOrEmpty(Child1s[i])) continue; List Child2s = new List(Child1s[i].Split('=')); if (Child2s.Count != 2) continue; for (int j = 0; j < Child2s.Count; j++) { if (string.IsNullOrEmpty(Child2s[j])) continue; if (Child2s[j].Length < System.Text.Encoding.Default.GetBytes(Child2s[j]).Length) { //TrimStart()只删除字符串的头部的。TrimEnd()只删除字符串尾部的。 string child = Child2s[j].TrimStart(' '); child = child.TrimEnd(' '); child = child.TrimStart('\''); child = child.TrimEnd('\''); child = child.TrimEnd('"'); child = child.TrimStart('"'); if (Regex.IsMatch(child, @"[\u4e00-\u9fa5]+")) { child = ReplaceMaoHao(child); if (fiLineDics.ContainsKey(child) && fiLineDics[child] != "-1") child = fiLineDics[child]; } Child2s[j] = string.Format("\'{0}\'", child); } } Child1s[i] = string.Format("{0} = {1}", Child2s[0].TrimEnd(' '), Child2s[1].TrimStart(' ')); } line = string.Join(",", Child1s.ToArray()); } return line; } /// /// 翻译所有前端表格 /// /// 国家 /// 表格字典 /// 翻译表格名称 public static void SetAllTabText(string country,string tabsDictionary,string translatetabName) { var utf8WithoutBom = new System.Text.UTF8Encoding(false); //所有表格路径 string allTabtextPath = AllTEXTPATH + string.Format("//{0}//{1}",country, translatetabName); //文件信息 FileInfo fi = new FileInfo(allTabtextPath); //文件信息字典 Dictionary fiLineDics = new Dictionary(); if (fi.Exists) { //使其以一种特定的编码从字节流中读取字符。 StreamReader sw1 = new StreamReader(allTabtextPath, System.Text.Encoding.Unicode); string line = "1213"; while (line!=null) { //读取 line = sw1.ReadLine(); if (string.IsNullOrEmpty(line)) continue; string[] lines = line.Split('\t'); if (lines.Length < 2 || string.IsNullOrEmpty(lines[1]) || lines[1] == "-1" || lines[1] == "1") continue; //剪切 string ChinaText = TrimAll(lines[0]); //替换中文符号 ChinaText = ReplaceMaoHao(ChinaText); //剪切 fiLineDics[ChinaText] = TrimAll(lines[1]); } //关闭 sw1.Close(); } else { //对话框 EditorUtility.DisplayDialog("123", string.Format("找不到 {0} 文件", allTabtextPath), "123"); return; } //读取目录信息 DirectoryInfo directoryInfo = Directory.CreateDirectory(tabsDictionary); //文件信息 FileInfo[] fileInfos = directoryInfo.GetFiles("*.txt", SearchOption.AllDirectories); for (int n = 0; n < fileInfos.Length; n++) { if (fileInfos[n].Name.Contains("StrDictionary")) continue; if (fileInfos[n].Name.Contains("StrFilter")) continue; if (fileInfos[n].Name.Contains("RoleName")) continue; if (fileInfos[n].Name.Contains("QuestionBank")) continue; //使其以一种特定的编码从字节流中读取字符。 StreamReader sw1 = new StreamReader(fileInfos[n].FullName, utf8WithoutBom); List lines = new List(); //读取 string line = sw1.ReadLine(); lines.Add(line); while (line!=null) { line = sw1.ReadLine(); if (string.IsNullOrEmpty(line)) continue; string[] strs = line.Split('\t'); if (strs.Length < 2) continue; lines.Add(line); } sw1.Close(); if (lines.Count <= 2) continue; string[] column = lines[0].Split('\t'); for (int i = 2; i < lines.Count; i++) { if (!string.IsNullOrEmpty(lines[i]) && !lines[i][0].Equals('#') && !lines[i][0].Equals('\t')) { string[] segments = lines[i].Split('\t'); if (segments.Length != column.Length) { Debug.Log("error : "+ fileInfos[n].Name +" " +i+" "+ lines[i]); return; } for (int index = 2; index < column.Length; index++) { // "[\u4e00-\u9fa5]+ == 中文 if (Regex.IsMatch(segments[index], @"[\u4e00-\u9fa5]+") == false) { continue; } string ChineText = segments[index]; //删除 ChineText = TrimAll(ChineText); //替换中文符号 ChineText = ReplaceMaoHao(ChineText); if (fiLineDics.ContainsKey(ChineText) && fiLineDics[ChineText]!="-1") { segments[index] = fiLineDics[ChineText]; } } //连接 lines[i] = string.Join("\t", segments); //进度条 EditorUtility.DisplayProgressBar("Find All Text", string.Format("Files : {0}/{1} {2}", n, fileInfos.Length, fileInfos[n].FullName), n * 1.0f / fileInfos.Length); } } StreamWriter sw = new StreamWriter(fileInfos[n].FullName,false, utf8WithoutBom); for(int i=0;i /// 字典表文本 /// /// 国家 /// 表字典 public static void SetStrTabText(string country, string tabsDictionary) { //可忽略ID List IgnorID = new List() {"2626","2627","2628","5990","5991","5992","5993", "46267" }; var utf8WithoutBom = new System.Text.UTF8Encoding(false); //路径格式 string allTabtextPath = AllTEXTPATH + string.Format("//{0}//{1}", country, "StrDictionatyID.txt"); //文件信息 FileInfo fi = new FileInfo(allTabtextPath); //字典 Dictionary> fiLineDics = new Dictionary>(); if (fi.Exists) { //使用Unicode编码从字节流中读取文件 StreamReader sw2 = new StreamReader(allTabtextPath, System.Text.Encoding.Unicode); //读取一行 string line1 = sw2.ReadLine(); while (line1 != null) { line1 = sw2.ReadLine(); if (string.IsNullOrEmpty(line1)) continue; string[] lines1 = line1.Split('\t'); if (lines1.Length < 2) { Debug.Log("0 line len less 2 : " + line1); continue; } fiLineDics[lines1[0]] = new List(lines1); } sw2.Close(); } else { EditorUtility.DisplayDialog("123", string.Format("找不到 {0} 文件", allTabtextPath), "123"); return; } FileInfo fileInfo = new FileInfo(tabsDictionary + "/StrDictionary.txt"); //使用utf8编码从字节流中读取文件 StreamReader sw1 = new StreamReader(fileInfo.FullName, utf8WithoutBom); List lines = new List(); //读取 string line = sw1.ReadLine(); lines.Add(line); while (line != null) { line = sw1.ReadLine(); if (string.IsNullOrEmpty(line)) continue; string[] strs = line.Split('\t'); if (strs.Length < 2) { Debug.Log("1 line len less 2 : " + line); continue; } lines.Add(line); } sw1.Close(); if (lines.Count <= 2) return; string[] column = lines[0].Split('\t'); for (int i = 2; i < lines.Count; i++) { if (!string.IsNullOrEmpty(lines[i]) && !lines[i][0].Equals('#') && !lines[i][0].Equals('\t')) { string[] segments = lines[i].Split('\t'); if (segments.Length != column.Length || IgnorID.Contains(segments[0])) { Debug.Log("error : " + fileInfo.Name + " " + i + " " + lines[i]); continue; } if (fiLineDics.ContainsKey(segments[0])) { if(segments.Length > 2 && fiLineDics[segments[0]].Count > 2) { segments[2] = fiLineDics[segments[0]][2]; segments[2] = TrimAll(segments[2]); segments[2] = segments[2]; lines[i] = string.Join("\t", segments); } } } } StreamWriter sw = new StreamWriter(fileInfo.FullName, false, utf8WithoutBom); for (int i = 0; i < lines.Count; i++) { sw.WriteLine(lines[i]); } sw.Close(); //关闭进度条 EditorUtility.ClearProgressBar(); } [MenuItem("ProTool/Multilingual/繁体/PrintPrafabAllText")] public static void PrintPrafabAllText() { Text[] texts = Selection.activeGameObject.GetComponentsInChildren(true); for(int i=0;i