【问题标题】:Flutter auto generate keys of json/arb file to codeFlutter 自动生成 json/arb 文件的密钥到代码
【发布时间】:2021-09-28 11:54:44
【问题描述】:

我正在使用Flutter Intl 插件来生成用于国际化的 arb (json) 文件。文件 intl_en.arb 的内容是这样的 json:

{
  "msg1": "message..",
  "msg2": "message..",
  "msg3": "message.."
}

我想自动生成 json 的所有键来上课。类的内容应该是这样的:

class AllText {
  static const String msg1 = 'msg1';
  static const String msg2 = 'msg2';
  static const String msg3 = 'msg3';
}

所以我可以像这样使用 GetX 国际化:

Text(AllText.msg1.tr)

是否有插件可以从 arb 文件生成这样的类?

(我不想使用 Intl,只需要它生成 json 文件以便我可以在 GetX 中使用)

【问题讨论】:

标签: flutter dart internationalization auto-generate build-runner


【解决方案1】:

6 月 22 日更新:

对于从 arb 文件到类的生成,您正在寻找这个包flutter_localizations。配置很简单,并在 i18n 上的 official documentation 中引导。

如果您像我一样使用 Android Studio/IntelliJ IDEA,有一个包调用 flutter_intl(如果您使用 VS Code,请查看 here),让您只需单击几下即可生成类。


对于 i18n 与 GetX 的集成,只需将 arb 文件的内容复制到 Map,然后进行如下配置:

例如,这是一个包含密钥的arb 文件:

{
  "msg1": "message",
  "msg2": "message",
  "msg3": "message"
}

声明代表您想要的语言环境的变量:

const Map<String, String> en = {
  "msg1": "message",
  "msg2": "message",
  "msg3": "message"
};

const Map<String, String> fr = {
  "msg1": "message_other",
  "msg2": "message_other",
  "msg3": "message_other"
};

然后,创建一个从GetX 扩展Translations 的类

class LocalizationService extends Translations {

  // Default locale
  static final locale = Locale('en', 'US');

  // fallbackLocale saves the day when the locale gets in trouble
  static final fallbackLocale = Locale('fr', 'FR');

  // Your supported language here
  static final langs = [
    'English',
    'France',
  ];

  // Supported locales (same order as above)
  static final locales = [
    Locale('en', 'US'),
    Locale('fr', 'FR'),
  ];

  // Keys and their translations
  // Translations are defined with `en` and `fr` variable above
  @override
  Map<String, Map<String, String>> get keys => {
        'en_US': en,
        'tr_TR': fr,
      };


  // Use the following method to update your locale
  // Gets locale from language, and updates the locale
  void changeLocale(String lang) {
    final locale = _getLocaleFromLanguage(lang);
    Get.updateLocale(locale);
  }

  // Finds language in `langs` list and returns it as Locale
  Locale _getLocaleFromLanguage(String lang) {
    for (int i = 0; i < langs.length; i++) {
      if (lang == langs[i]) return locales[i];
    }
    return Get.locale;
  }
}

最后,在 GetMaterialApp 中定义语言环境:

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      home: HomePage(),
      locale: LocalizationService.locale,
      fallbackLocale: LocalizationService.fallbackLocale,
      translations: LocalizationService(),
    );
  }
}

使用如下语言环境:

Text('msg1'.tr) // The `tr` extension is from `GetX` as well

【讨论】:

  • 重点是生成包含所有键的类,所以当你使用它时,你知道键是正确的,不用担心拼写错误。不是如何使用 GetX。
  • @dante 更新了我的答案,我想这就是你要找的东西
猜你喜欢
  • 2013-05-28
  • 1970-01-01
  • 2011-02-22
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 2020-12-12
  • 1970-01-01
相关资源
最近更新 更多