Fgui多语言
思路:
1.先在编辑器里导入所有包的中文版本,然后解析当前xml文件所有的中文,写入到对应中文Excel文件当中。
2.解析当前中文excel文件所有的中文
3.然后生成中文excel中所有的语言xml文件
4.找到所有语言xml文件中文,替换所有的当前语言
代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Xml;
using DJ.SystemData;
using ET;
using OfficeOpenXml;
using UnityEditor;
using UnityEngine;
namespace DJ
{
public enum EnumTabelType
{
other,
table,
AutoFGUIText
}
public class I18NExport:Editor
{
private const string _FguiChineseXmlPath ="../FGUIProject/language/Chinese.xml";
private const string _outFGuiI18Path ="Assets/Bundles/Language/";
private const string I18NExcelPath ="../Excel/I18NConfig.xlsx";
[MenuItem("Tools/I18N/导出FGUI文字到Excel",false,23)]
public static void ExportFGUII18nToExcel()
{
FileInfo fileINfo =new FileInfo(I18NExcelPath);
using (var i18NExcelPackage =new ExcelPackage(fileINfo))
{
//复制前面的值
var otherSheet = i18NExcelPackage.Workbook.Worksheets.FirstOrDefault(x => x.Name.Equals(EnumTabelType.other.ToString()));
var autoFGUISheet = i18NExcelPackage.Workbook.Worksheets.FirstOrDefault(x => x.Name.Equals(EnumTabelType.AutoFGUIText.ToString()));
if (autoFGUISheet ==null)
{
autoFGUISheet = i18NExcelPackage.Workbook.Worksheets.Add(EnumTabelType.AutoFGUIText.ToString());
}
autoFGUISheet.Cells[1,1].Value ="自动生成,不要轻易更改";
autoFGUISheet.Cells[1,1].AutoFilter =true;
var endCol = otherSheet.Dimension.End.Column;
otherSheet.Cells[2,3,5, endCol].Copy(autoFGUISheet.Cells[2,3,5, endCol]);
var chineseDict = GetAllChineseExcelData(I18NExcelPath);
var strs = GetAllChineseXMLData(_FguiChineseXmlPath);
var (idCol, chineseCol, startId, endRow) = (3,4,200000,6);
if (autoFGUISheet.Dimension.End.Row > endRow)
{
endRow = autoFGUISheet.Dimension.End.Row +1;
var excelId =Convert.ToInt32(autoFGUISheet.Cells[endRow -1, idCol].Value);
startId = excelId +1;
}
foreach (var strin strs)
{
if (chineseDict.ContainsKey(startId) || chineseDict.ContainsValue(str))
{
continue;
}
autoFGUISheet.Cells[endRow, chineseCol].Value = str;
autoFGUISheet.Cells[endRow, idCol].Value = startId;
chineseDict.Add(startId, str);
startId++;
endRow++;
}
i18NExcelPackage.Save();
Debug.Log("导入到Excel成功");
}
}
[MenuItem("Tools/I18N/生成多语言的Xml",false,23)]
public static void CreateI18NFileToBound()
{
if (!File.Exists(_FguiChineseXmlPath))
{
Log.Error($"没有找到{_FguiChineseXmlPath}文件");
return;
}
var dict = GetI18NLanguageExcelData(I18NExcelPath);
foreach (EnumLanguageType typein Enum.GetValues(typeof (EnumLanguageType)))
{
if (type ==EnumLanguageType.Chinese)
{
continue;
}
var path = _outFGuiI18Path + type.ToString() +".xml";
if (File.Exists(path))
{
File.Delete(path);
}
File.Copy(_FguiChineseXmlPath, path);
var re =new Regex("[\u4e00-\u9fa5]+");
var xml =new XmlDocument();
xml.Load(path);
XmlNodeList elemList = xml.GetElementsByTagName("string");
foreach (XmlElement elemin elemList)
{
if (re.IsMatch(elem.InnerText))
{
dict.TryGetValue(elem.InnerText,out var list);
elem.InnerText = list[(int) type];
}
}
xml.Save(path);
}
}
///
/// 获取所有的中文
///
///
///
public static Dictionary GetAllChineseExcelData(string excelPath)
{
var startRow =6;
var chineseCol =4;
var idChineseDict =new Dictionary();
FileInfo fileINfo =new FileInfo(excelPath);
using (ExcelPackage package =new ExcelPackage(fileINfo))
{
foreach (var sWorksheetin package.Workbook.Worksheets)
{
for (int i = startRow; i <= sWorksheet.Dimension.End.Row; i++)
{
var strId = sWorksheet.Cells[i, chineseCol -1].Text;
if (string.IsNullOrEmpty(strId))
{
continue;
}
int id =Convert.ToInt32(strId);
var chines = sWorksheet.Cells[i, chineseCol].Text;
if (!idChineseDict.ContainsValue(chines) && !idChineseDict.ContainsKey(id))
{
idChineseDict.Add(id, chines);
}
else
{
Log.Error($"中文={chines}重复或者Id={id}重复");
}
}
}
}
return idChineseDict;
}
///
/// 获取所有的中文
///
///
///
public static Dictionary> GetI18NLanguageExcelData(string excelPath)
{
var startRow =6;
var chineseCol =4;
var idChineseDict =new Dictionary>();
var len = chineseCol +Enum.GetNames(typeof (EnumLanguageType)).Length;
FileInfo fileINfo =new FileInfo(excelPath);
using (ExcelPackage package =new ExcelPackage(fileINfo))
{
foreach (var sWorksheetin package.Workbook.Worksheets)
{
for (int i = startRow; i <= sWorksheet.Dimension.End.Row; i++)
{
var chines = sWorksheet.Cells[i, chineseCol].Text;
if (!idChineseDict.ContainsKey(chines))
{
var languages =new List();
for (int j = chineseCol; j < len; j++)
{
var text = sWorksheet.Cells[i, j].Text;
languages.Add(text);
}
idChineseDict.Add(chines, languages);
}
}
}
}
return idChineseDict;
}
///
/// 获取FGUI生成xml文件获取所有的中文
///
///
///
public static string[] GetAllChineseXMLData(string xmlPath)
{
var re =new Regex("[\u4e00-\u9fa5]+");
var chineseList =new HashSet();
var xml =new XmlDocument();
xml.Load(xmlPath);
XmlNodeList elemList = xml.GetElementsByTagName("string");
foreach (XmlElement elemin elemList)
{
if (re.IsMatch(elem.InnerText))
{
chineseList.Add(elem.InnerText);
}
}
return chineseList.ToArray();
}
}
}