# fis_i18n A internationalization and localization(i18n) package project for Flyinsono application. ## 介绍及声明 1. 本案设计按照模块维护各自的翻译字典,所以使用结构化对象提供字典文字,切换语言会重新构建字典对象,保证内存中始终保持一个字典。 2. 各语言对应字典要求唯一,语言(Locale)作为唯一键,不接受注入多个使用相同语言的字典选项。 3. 新增语言翻译字典,强制要求实现所有模块的所有翻译项,请认真填写。 4. 虽然国际化所有代码都放置在顶层项目中,不意味着可以随意修改。如有扩展需要,请联系框架负责人进行开发,禁止魔改! ## 使用方法 ### 1. 获取指定项的翻译 ```dart // i18nBook : FI18n单例当前翻译书的代理,供全局快速访问(FI18n.ins.currentBook) // user : user模块 // login : login项,获得当前语言对应的翻译文字 FText(i18nBook.user.login); ``` ### 2. 切换语言 ```dart FI18n.ins.switchLanguage(); // 顺序向下选择 FI18n.ins.switchLanguage(FLangKeyBookEnglish.LocleConst); // 选择指定的语言 ``` ### 3. 当前语言是否中文 ```dart if(FI18n.ins.isCurrentChinese){ print('当前是中文!'); } ``` ### 4. 注入其他语言字典 ```dart // 在 lib/localization/langs 目录下创建语言字典类 de_de.dart (语言缩写_国家二字码.dart) import 'dart:ui'; import '../key_book.dart'; class FLangKeyBookGermany extends FLangKeyBook { FLangKeyBookGermany() : super(LocaleConst); // 方便其他地方访问,非必须 static const LocaleConst = const Locale("de", "DE"); // 实现Application模块的字典构建 @override ApplicationModule buildApplicationKeys() { return ApplicationModule( fisServerName: "Flyinsono server", wechat: "WeChat", cloudImage: 'Wolke bilder', localScreenshot: 'Lokal screenshots', report: 'Prüfbericht', ); } /* 实现其他模块的build方法 */ } // 在启动时注入 main.dart final localization = FI18n(defaultLangBook, [ FLangKeyBookOption( FLangKeyBookEnglish.LocaleConst, () => FLangKeyBookEnglish(), ), // 在这里添加新的字典选项 FLangKeyBookOption( FLangKeyBookGermany.LocaleConst, () => FLangKeyBookGermany(), ), ]); // 启动后实时注入,可无限覆盖 FI18n.ins.setKeyBook( FLangKeyBookGermany.LocaleConst, () => FLangKeyBookGermany(), ); ``` ### 5. 新增字典模块 ```dart // 1. 在 lib/localization/modules 目录下创建模块类 test.dart class TestModule { const TestModule({ required this.unitTest, }); final String unitTest; } // 2. 在 lib/localization/key_book.dart的 class FLangKeyBook 中添加字段 /// 测试模块 late final TestModule test = buildTestKeys(); /// 构建测试模块字典 TestModule buildTestKeys(); // 3. 对 lib/localization/langs 目录下所有语言字典类实现 buildTestKeys() @override TestModule buildUserKeys() { return TestModule( unitTest: "单元测试", ); } ``` # modules 代码生成器 ## 启动 - 当前目录下运行 - `python .\tools\generator.md` - 脚本会读取 `assets` 内 `json` 文件重新生成一遍 `modules` 文件夹 - ❗ 注意:如果新增模块,需要手动更新 `class_mapping.json`,并且 `key_book.dart` 等文件不会自动更新,需要手动修改 # excel 文档导出、导入 ## 将 json 导出为 excel - 当前目录下运行 - `python .\tools\JSON2Excel.md` - 脚本会读取 `assets` 内 `json` 文件将翻译的中英文值写入当前目录下的 `output.xlsx`,如果该文件已存在则会覆盖 ## 将 excel 导入到 json - 当前目录下运行 - `python .\tools\Excel2JSON.md` - ❗ 使用前需要修改 改脚本文件 下的文件路径 `INPUT_PATH` ❗ - ❗ 注意:运行该脚本需要针对不同格式的 excel 做对应的修改 - 此脚本通过翻译词条的 key 值匹配 excel 中出现的翻译值,直接更新到 json 文件中 - 不会对 json 文件内已存在的词条做增删操作,仅更新 # 基于 Chat-GPT 的翻译优化工作流 ## 将 json 转为 markdown 表格 - 当前目录下运行 - `python .\tools\JSON2MD.md` - 此脚本会将所有翻译模块输出为 markdown 表格,输出到当前目录下的 `md-outputs` 文件夹内 ## 将 markdown 表格发送给 Chat-GPT 进行翻译优化 - 当前目录下运行 - `python .\tools\chat_gpt_process.md` - 此脚本会将 `md-outputs` 文件夹内的所有 markdown 表格发送给 Chat-GPT 进行翻译优化,优化结果会输出到当前目录下的 `gpt-outputs` 文件夹内 - 全部运行一遍用时 > 40min,可以删除部分不需要优化的文件来节省时间 - ❗ 注意:运行前需要设置环境变量 `OPENAI_API_KEY` 否则无权调用 ❗ - ❗ 运行该脚本前可以针对不同需求修改 `prompt.md` 内提示词以获得更优质结果 - ❗ 如果需要变更模型直接修改 `chat_gpt_process.md` 内的 `model` 变量即可(当前默认 gpt-3.5-turbo) ## 应用 Chat-GPT 优化后的翻译结果 - 当前目录下运行 - `python .\tools\apply_gpt_outputs.md` - 此脚本会将 `gpt-outputs` 文件夹内的所有优化结果应用到 `assets` 文件夹内的 json 文件中 - 进入 Git 的差异对比可以人工择优接受修改 # i18n 词典可视化查看器 ## 启动 - 直接打开 `index.html` ## 初始化 - 选择当前库 `fis_lib_i18n` 下的 `assets` 文件夹 - ❗ 注意库的版本是否与项目一致 ## 查找 - 直接利用浏览器查找功能(`Ctrl+F`) - ❗ 注意:类目收起后无法被查找 ## 复制代码 - `Code` 按钮可以直接复制对应代码,形如:`i18nBook.auth.login.t` ## 复制中文正则查找 - `Copy All & Text` 按钮可以直接复制对应中文的正则查找表达式 ## TODO - [ ] 页面上直接新建词条 - [ ] 直接编辑文案 - [ ] 保存编辑后的 JSON 文件 - [ ] 类目折叠后也能被查找 # 技巧 ## 正则查找所有中文字符串 - `('|")[\u4E00-\u9FA5]+.*\1` ,形如:`'杏聆荟'`、`"杏聆荟"`