AlicizaX/Client/Assets/Editor/Localization/ExcelLocalizationExporter.cs
2025-07-11 21:00:00 +08:00

118 lines
4.0 KiB
C#

using OfficeOpenXml;
using System.Collections.Generic;
using System.IO;
using System.Text;
using AlicizaX.Editor.Extension;
using Newtonsoft.Json;
using UnityEditor;
using UnityEngine;
class ExcelLocalizationExporter
{
// 配置写死路径(按实际需求修改)
private const string LocalizationPath = "Assets/Resources/Localization/";
private const string HotfixLocalizationPath = "Assets/Bundles/Configs/Localization/";
private const string LocalizationDynamicKey = "Assets/Scripts/HotFix/GameBase/LocalizationKey.cs";
[EditorToolFunction("Config/Dynamic")]
public static void GenerateDynamicLocalization()
{
Export("Assets/Editor/Localization/Localization.xlsx");
}
public static void Export(string excelPath)
{
var fileInfo = new FileInfo(excelPath);
using var package = new ExcelPackage(fileInfo);
foreach (var worksheet in package.Workbook.Worksheets)
{
// 确定导出目录
var outputDir = worksheet.Name.Contains("HotFix", System.StringComparison.OrdinalIgnoreCase)
? HotfixLocalizationPath
: LocalizationPath;
Directory.CreateDirectory(outputDir);
var dimension = worksheet.Dimension;
if (dimension == null) continue;
var languages = new List<string>();
for (int col = 2; col <= dimension.End.Column; col++)
{
languages.Add(worksheet.Cells[1, col].Text.Trim());
}
var langDictionaries = new Dictionary<string, Dictionary<string, string>>();
foreach (var lang in languages)
{
langDictionaries[lang] = new Dictionary<string, string>();
}
for (int row = 2; row <= dimension.End.Row; row++)
{
var keyCell = worksheet.Cells[row, 1];
if (keyCell.Value == null) continue;
var key = keyCell.Text.Trim();
if (string.IsNullOrEmpty(key)) continue;
for (int i = 0; i < languages.Count; i++)
{
var lang = languages[i];
var valueCell = worksheet.Cells[row, i + 2];
var value = valueCell.Value?.ToString() ?? string.Empty;
langDictionaries[lang][key] = value.Trim();
}
}
foreach (var lang in langDictionaries)
{
var settings = new JsonSerializerSettings
{
Formatting = Formatting.None,
NullValueHandling = NullValueHandling.Ignore,
StringEscapeHandling = StringEscapeHandling.EscapeNonAscii
};
var json = JsonConvert.SerializeObject(lang.Value, settings);
var outputPath = Path.Combine(outputDir, $"{lang.Key}.json");
File.WriteAllText(outputPath, json);
}
AssetDatabase.Refresh();
}
ExportLocalizationKey();
}
public static void ExportLocalizationKey()
{
string filePath = "Assets/Bundles/Configs/Localization/ChineseSimplified.json";
Dictionary<string, string> jsonData = JsonConvert.DeserializeObject<Dictionary<string, string>>(System.IO.File.ReadAllText(filePath));
StringBuilder sb = new StringBuilder();
sb.AppendLine("/// <summary>");
sb.AppendLine("/// AutoGenerate");
sb.AppendLine("/// </summary>");
sb.AppendLine("public static class LocalizationKey");
sb.AppendLine("{");
foreach (var item in jsonData)
{
if (item.Key.Contains("\\")) continue;
sb.AppendLine("\t/// <summary>");
sb.AppendLine($"\t/// {item.Value}");
sb.AppendLine("\t/// </summary>");
sb.AppendLine($"\tpublic const string {item.Key} = \"{item.Key}\";");
}
sb.AppendLine();
sb.AppendLine("}");
System.IO.File.WriteAllText(LocalizationDynamicKey, sb.ToString());
AssetDatabase.Refresh();
}
}