Flutter自动生成json/arb文件的密钥进行编码



我正在使用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中使用它(

6月22日更新:

对于从arb文件到类的生成,您正在寻找这个包flutter_localizations。配置很简单,在i18n的官方文档中有指导。

如果你像我一样使用安卓Studio/InIntelliJ IDEA,有一个名为flatter_intl的包(如果你使用VS代码,请在这里查看(,它允许你在几次点击中生成类。


对于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');
// fallback locale 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

相关内容

  • 没有找到相关文章

最新更新