我一个iOS项目有多语言需求,然后甲方提供了8国的语言包Excel文件。一个文件几百行。后面还会停 的修改调整。于是就有了如下的脚本:
脚本大概分为五个步骤:
static void startRead() {
Console.WriteLine("请输入Excel文件路径:");
var strUrlExcel = readLineMsg().TrimEnd();
Console.WriteLine("请输入Excel语言包keyID的title值:");
var strKeyId = readLineMsg();
Console.WriteLine("请输入Excel语言包指定语言的title值:");
var strKeyLanguage = readLineMsg();
Console.WriteLine("请输入iOS语言包文件路径:");
var strLocalizablePath = readLineMsg().TrimEnd();
// 获取Excel
ISheet sheet = readExcel(strUrlExcel);
if (sheet == null)
{
Console.WriteLine("Excel 文件读取失败,请重试");
return;
}
// 获取Sheet KeyValue语言包的数据
var list = readSheet(sheet, strKeyId, strKeyLanguage);
// 获取语言包文件
var strLanguageContent = readLanguageFile(strLocalizablePath);
// 设置语言包Value值
var content = setLanguageContent(strLanguageContent, list);
// 保存语言包文件
saveLanguageFile(strLocalizablePath, content);
// 已完成
Console.WriteLine("转换完成。 谢谢使用! \r\n按任意键继续使用:Enter Key");
Console.ReadLine();
// 重复以上步骤
startRead();
}
一、获取Excel 文件的Sheet
static ISheet readExcel(string excelPath)
{
if (!File.Exists(excelPath))
{
return null;
}
using (var stream = new FileStream(excelPath, FileMode.Open))
{
stream.Position = 0;
var pathExtension = Path.GetExtension(excelPath);
if (pathExtension == ".xlsx")
{
XSSFWorkbook workbook = new XSSFWorkbook(stream); // .xlsx
ISheet sheet = workbook.GetSheetAt(0);
return sheet;
}
else if (pathExtension == ".xls")
{
HSSFWorkbook workbook = new HSSFWorkbook(stream); // .xls
ISheet sheet = workbook.GetSheetAt(0);
return sheet;
}
}
return null;
}
二、根据Sheet 获取当前的Rows Cells ,并获取值内容存储。
入参:
keyId 为Excel 的第一行的名称-(一般应用于iOS语言包的Key值的列的第一行)
value 为Excel 的准备转换语言的列的第一行。
如题Excel 格式如下,并想转换中文时,则keyId = keyId, value = 中文
iosKey 中文 英文 繁体 stringsName 姓名 Name 姓名 stringsDes 说明 Notes xxxx
static List<modelKeyValue> readSheet(ISheet sheet, string keyId, string value)
{
List<modelKeyValue> list = new List<modelKeyValue>();
IRow headerRow = sheet.GetRow(0);
int cellCount = headerRow.LastCellNum;
var cellKeyIdIndex = headerRow.Cells.FindIndex(x => x.ToString() == keyId);
var cellKeyValueIndex = headerRow.Cells.FindIndex(x => x.ToString() == value);
if (cellKeyIdIndex < 0 || cellKeyValueIndex < 0)
{
Console.WriteLine("Excel keyId 或 语言Value 的title值错误,请重新开始转换流程");
return null;
}
// 开始获取每一行的数据
for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
{
IRow row = sheet.GetRow(i);
if (row == null) continue;
var strKey = row.Cells[cellKeyIdIndex].ToString();
if (cellKeyValueIndex > row.Cells.Count -1)
{
continue;
}
var strValue = row.Cells[cellKeyValueIndex].ToString();
if (string.IsNullOrWhiteSpace(strValue)) continue;
modelKeyValue dict = new modelKeyValue {
strKey = strKey,
strValue = strValue
};
list.Add(dict);
}
return list;
}
三、根据路径读取iOS的语言包文件:后缀名.strings
/// <summary>
/// 读取iOS语言包文件内容
/// </summary>
/// <param name="strLanguagePath"></param>
/// <returns></returns>
static string readLanguageFile(string strLanguagePath)
{
if (!File.Exists(strLanguagePath))
{
return "";
}
//文本读取器
using (TextReader reader = new StreamReader(strLanguagePath, System.Text.Encoding.UTF8))
{
var strLocalizableStr = "";
//一次性读完
strLocalizableStr = reader.ReadToEnd();
return strLocalizableStr;
}
}
四、修改键值对的语言包字符串。
/// <summary>
/// 设置iOS语言包文件值
/// </summary>
/// <param name="content"></param>
/// <param name="list"></param>
static string setLanguageContent(string content, List<modelKeyValue> list) {
List<modelLanguageKeyValueStr> listModel = new List<modelLanguageKeyValueStr>();
var languageList = content.Split("\";");
foreach (var strLanguage in languageList)
{
var model = new modelLanguageKeyValueStr();
model.strLanguage = strLanguage;
var keyValue = strLanguage.Split("=");
if (keyValue.Length != 2)
{
// 如果有多个 = 等号存在
// 后面再写
continue;
}
model.strKey = keyValue[0].Trim();
model.strValue = keyValue[1].TrimStart();
listModel.Add(model);
}
foreach (var dict in list)
{
var model = listModel.Find(x =>{
return x.strKey == $"\"{dict.strKey}\"";
});
/// 如果已存在Key ,则替换
if (model != null)
{
var oldStrValue = $"{model.strValue}";
var newStrValue = $"\"{dict.strValue}";
var newStrReplace = model.strLanguage.Replace(oldStrValue, newStrValue);
content = content.Replace(model.strLanguage, newStrReplace);
}
else {
/// 否则新增
content += $"\n\"{dict.strKey}\" = \"{dict.strValue}\";";
}
}
return content;
}
五、保存修改后的语言包字符串 content 到指定的strings文件即可:
static void saveLanguageFile(string filePath, string content) {
if (File.Exists(filePath)) {
File.Delete(filePath);
}
//文本读取器
using (FileStream fs = new FileStream(filePath, FileMode.CreateNew))
{
//【2】保存内容到txt
StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);
sw.WriteLine(content);
sw.Flush();
sw.Close();
}
}
项目整体也没多少代码,技术点倾向于 Excel 的Rows Cells 的处理 和 转换后的字符串的整体编辑问题。感兴趣的话可以私信我免费赠送源码。