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