杏聆荟Flutter客户端 i18n(翻译) 库

denny c081bb0014 添加 项目有效性验证的错误码 4 luni în urmă
.vscode 40c5686e3b 1、新增错误码 4 luni în urmă
assets c081bb0014 添加 项目有效性验证的错误码 4 luni în urmă
lib c081bb0014 添加 项目有效性验证的错误码 4 luni în urmă
test 5ea3513ad7 罗马尼亚语添加依赖 8 luni în urmă
tools b659723c36 update(es): 使用 GPT4 优化简短版翻译 1 an în urmă
.gitignore 32e36d8eed 支持 gpt 批量修改翻译 1 an în urmă
.metadata 693d8a7f8e project initialization 3 ani în urmă
CHANGELOG.md 693d8a7f8e project initialization 3 ani în urmă
LICENSE 693d8a7f8e project initialization 3 ani în urmă
README.md e90b35ad85 优化翻译工作流 1 an în urmă
pubspec.yaml 5ea3513ad7 罗马尼亚语添加依赖 8 luni în urmă

README.md

fis_i18n

A internationalization and localization(i18n) package project for Flyinsono application.

介绍及声明

1. 本案设计按照模块维护各自的翻译字典,所以使用结构化对象提供字典文字,切换语言会重新构建字典对象,保证内存中始终保持一个字典。
2. 各语言对应字典要求唯一,语言(Locale)作为唯一键,不接受注入多个使用相同语言的字典选项。
3. 新增语言翻译字典,强制要求实现所有模块的所有翻译项,请认真填写。
4. 虽然国际化所有代码都放置在顶层项目中,不意味着可以随意修改。如有扩展需要,请联系框架负责人进行开发,禁止魔改!

使用方法

1. 获取指定项的翻译

    // i18nBook : FI18n单例当前翻译书的代理,供全局快速访问(FI18n.ins.currentBook)
    // user : user模块
    // login : login项,获得当前语言对应的翻译文字
    FText(i18nBook.user.login);

2. 切换语言

    FI18n.ins.switchLanguage(); // 顺序向下选择
    FI18n.ins.switchLanguage(FLangKeyBookEnglish.LocleConst); // 选择指定的语言

3. 当前语言是否中文

    if(FI18n.ins.isCurrentChinese){
        print('当前是中文!');
    }

4. 注入其他语言字典

// 在 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. 新增字典模块

// 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
  • 脚本会读取 assetsjson 文件重新生成一遍 modules 文件夹
  • ❗ 注意:如果新增模块,需要手动更新 class_mapping.json,并且 key_book.dart 等文件不会自动更新,需要手动修改

excel 文档导出、导入

将 json 导出为 excel

  • 当前目录下运行
  • python .\tools\JSON2Excel.md
  • 脚本会读取 assetsjson 文件将翻译的中英文值写入当前目录下的 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 ,形如:'杏聆荟'"杏聆荟"