上一篇文章自动化查找中文变量,已经将所需要进行国际化的变量进行标记,且写入到excel中,只需要将excel中的内容进行翻译即可。此文将进行后续操作,将翻译过后的数据重新写入到flutter_intl库的资源文件中。
遍历上文生成的excel文件,将对应的内容写入到arb即可,直接上代码。如果需要生成多种国际化资源文件,修改少部分逻辑即可。
arb文件支持json的语法,注意点如下:
1.如果是最后一条资源内容,则最后不能输入逗号,否则文件内容不满足json格式。
2.如果是需要显示的字符串中显示占位符,则需要在excel中就写好。
void main(List<String> arguments) {
final projectPath = arguments.isEmpty ? projectName : arguments.first;
Directory current = Directory.current;
var path = current.path;
///项目的目录
String targetPath;
///自动检查当前文件向上
while (path != "/" && !path.split("/").last.contains(projectPath)) {
current = current.parent;
path = current.path;
}
if (path.isEmpty) {
print('执行的dart文件必须属于项目中');
return;
}
targetPath = path;
print('目标项目路径: $targetPath');
var file = File("$targetPath/assets/intl.xlsx");
if (file.existsSync()) {
var bytes = file.readAsBytesSync();
var excel = Excel.decodeBytes(bytes);
var sheet = excel.sheets['国际化对照表'];
var enArb = File("$targetPath/lib/l10n/intl_en.arb");
var zhArb = File("$targetPath/lib/l10n/intl_zh.arb");
enArb.writeAsStringSync("{\n", flush: false);
zhArb.writeAsStringSync("{\n", flush: false);
int writeRows = 0;
///循环获取数据
for (int row = 1; row <= (sheet?.maxRows ?? 0) + 1; row++) {
///从A、B、C的第一行开始,往下遍历,同时获取到定义的国际化名、中文、英文
var variable = sheet?.cell(CellIndex.indexByString("A$row")).value;
var chineseVar = sheet?.cell(CellIndex.indexByString("B$row")).value;
var englishVar = sheet?.cell(CellIndex.indexByString("C$row")).value;
///同时判定下一行是否存在数据
int nextRow = row + 1;
var nextVariable =
sheet?.cell(CellIndex.indexByString("A$nextRow")).value;
var nextChineseVar =
sheet?.cell(CellIndex.indexByString("B$nextRow")).value;
var nextEnglishVar =
sheet?.cell(CellIndex.indexByString("C$nextRow")).value;
///判定一下一行是否有数据
bool nextDataIsNull = nextVariable == null ||
nextChineseVar == null ||
nextEnglishVar == null;
///如果下一行没有了数据,则生成的内容里,不能最后加上逗号,否则json格式会解析错误
if (nextDataIsNull) {
enArb.writeAsStringSync('\t"$variable": "$englishVar"\n',
mode: FileMode.append);
zhArb.writeAsStringSync('\t"$variable": "$chineseVar"\n',
mode: FileMode.append);
} else {
enArb.writeAsStringSync('\t"$variable": "$englishVar",\n',
mode: FileMode.append);
zhArb.writeAsStringSync('\t"$variable": "$chineseVar",\n',
mode: FileMode.append);
}
writeRows++;
///如果下一行中,某一列没有数据,则暂停遍历
if (nextVariable == null ||
nextChineseVar == null ||
nextEnglishVar == null) {
break;
}
}
enArb.writeAsStringSync("}", flush: true, mode: FileMode.append);
zhArb.writeAsStringSync("}", flush: false, mode: FileMode.append);
print('操作完成,总计写入$writeRows条国际化字符串');
} else {
print("读取的数据源intl.xlsx文件不存在");
}
}
通过该文可以根据excel的固定格式,自动写入到arb文件,减少人工消耗,也可以大大减少错误率。