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