Flutter代码生成插件jimtl_codegen的使用
Flutter代码生成插件jimtl_codegen的使用
如果您厌倦了手动编写ARB文件或对Flutter本地化支持有限感到不满,那么您来对地方了。
通过此插件,您可以:
- 从Dart代码生成ARB文件(由build_runner完成)
- 远程更新您的翻译(从外部服务器或翻译服务)
- 为您的翻译提供不同的风味
设置
安装jimtl
的最新版本(适用于Dart)或flutter_jimtl
(适用于Flutter)以及jimtl_codegen
。
dependencies:
intl:
flutter_jimtl:
dev_dependencies:
build_runner: ^2.0.3
jimtl_codegen:
使用intl
包的强大功能进行翻译
intl
是一个很棒的包,用于处理翻译,它允许您以简单且安全的方式编写消息、复数和性别。
让我们来看一些基本的例子:
@GenerateArb()
class Translations {
// flutter项目专用访问器
static Translations of(BuildContext context) => Localizations.of<Translations>(context, Translations)!;
String get counter => Intl.message('Counter', name: 'counter');
String get increment => Intl.message('Increment', name: 'increment');
String counterPushed(int number) => Intl.message('You have pushed the button $number times: ', args: [number], name: 'counterPushed');
}
您是否注意到了@GenerateArb()
注解?这就是魔法所在。✨
一旦您运行喜欢的build_runner
命令,它将生成与此类对应的ARB文件。
该注解可以通过以下字段进行自定义:
defaultLocale
: 您正在使用的区域设置,默认为’en’defaultFlavor
: 您项目的默认风味,默认为’default’suppressMetaData
: 在生成ARB文件时抑制元数据,默认为falsesuppressLastModified
: 在生成ARB文件时抑制最后修改时间,默认为falseincludeSourceText
: 是否在消息中包含源文本,默认为falsedir
: 应生成ARB的目录
Flutter项目
如果您有一个现有的带有本地化支持的Flutter项目,则需要在应用程序中声明一个LocalizationDelegate
。
以下是其外观:
localizationsDelegates: [
DefaultMaterialLocalizations.delegate,
TranslationsDelegate<Translations>(
defaultLocale: 'en',
supportedLocales: ['en', 'fr'],
// 如果您使用风味,则需要指定默认值和当前值
defaultFlavor: 'default',
currentFlavor: 'flavor1',
// 此方法用于加载默认的ARB文件,最简单的方法是从资产中加载
dataLoader: (locale, flavor) async {
print('local load $locale and $flavor');
if (flavor == 'default') {
return await rootBundle.loadString('assets/arb/translations_$locale.arb');
}
return await rootBundle.loadString('assets/arb/translations_${flavor}_$locale.arb');
},
// 如果您想从远程服务器下载ARB文件
// 您需要指定一个自定义数据加载器,如下所示
updateDataLoader: (locale, flavor) async {
print('Remote load $locale and $flavor');
if (locale == 'en' && flavor == 'flavor1') {
await Future.delayed(Duration(seconds: 10)); // 模拟缓慢的网络响应
return await rootBundle.loadString('assets/arb/translations_remote_$locale.arb');
}
return null; // 无需更新
},
// 一旦您的翻译通过远程文件更新,此回调将被触发,您需要重建才能看到更改
onTranslationsUpdated: () {
print('TX updated, need rebuild');
setState(() {});
},
// 构建器以构建包含您的翻译的自定义类
translationsBuilder: () => Translations(),
),
]
以下是TranslationsDelegate
参数的一些详细信息:
defaultLocale
: 应用程序使用的默认区域设置。defaultFlavor
: 可选的默认风味,用于您的应用程序,默认为’default’。currentFlavor
: 可选的当前风味,用于您的应用程序,默认为’default’。overrideCurrentLocale
: 可选的区域设置,用于覆盖系统区域设置。dataLoader
: 获取给定区域设置和风味的ARB文件的回调,这是jimtl调用您提供ARB文件时的调用。updateDataLoader
: 可选的,为了保持您的翻译从远程服务器最新,这是您需要的回调。它应该返回给定区域设置和风味的ARB内容,或者如果不需要更新则返回null。onTranslationsUpdated
: 可选的,一旦您的翻译通过updateDataLoader
远程更新,此回调将被调用,以便您重建小部件并查看更改。supportedLocales
: 应用程序支持的区域设置。translationsBuilder
: 提供包含您的句子的自定义类的构建器。
风味特殊性
风味支持是此包的可选项,但如果需要,它在这里:)
风味的ARB文件不必包含您应用程序的所有句子, 如果某个句子不在风味的ARB中,则会使用默认区域设置的句子。
假设我们有以下内容:
默认 => helloWorld => Hello World
风味1 => helloWorld => World Hello
风味2 =>
如果您使用风味1调用myClass.helloWorld
,您将得到World Hello
如果您使用风味2调用myClass.helloWorld
,您将得到Hello World(默认值)
对于区域设置也是一样的,如果当前区域设置中不存在某个句子,则使用默认区域设置的句子。
纯Dart项目
如果您正在使用不带Flutter的Dart,您仍然可以使用此包并获得它带来的所有功能!
首先导入依赖项:
dependencies:
intl:
jimtl:
dev_dependencies:
build_runner: ^2.0.3
jimtl_codegen:
然后您将做相同的自定义类并以相同的方式生成ARB文件。但是Dart没有并且需要LocalizationDelegate。 但不用担心,以下是设置您的翻译的方法。
final delegate = IntlDelegate(
// 默认使用的区域设置
defaultLocale: 'en',
// 默认使用的风味
defaultFlavor: 'flavor1',
// 回调以获取给定区域设置和风味的ARB内容
dataLoader: (String locale, String flavor) async {
if (flavor == 'default') {
return await File('./lib/arb/main_$locale.arb').readAsString();
}
return await File('./lib/arb/main_${flavor}_$locale.arb').readAsString();
},
);
// 加载当前区域设置和可选的风味
await delegate.load('fr', currentFlavor: 'flavor1');
一旦load
完成,您就可以按您希望的方式使用自定义类。
IntlDelegate
可以通过以下参数进行定制:
defaultLocale
: 应用程序使用的默认区域设置。defaultFlavor
: 可选的默认风味,用于您的应用程序,默认为’default’。currentFlavor
: 可选的当前风味,用于您的应用程序,默认为’default’。dataLoader
: 获取给定区域设置和风味的ARB文件的回调,这是jimtl调用您提供ARB文件时的调用。updateDataLoader
: 可选的,为了保持您的翻译从远程服务器最新,这是您需要的回调。它应该返回给定区域设置和风味的ARB内容,或者如果不需要更新则返回null。supportedLocales
: 应用程序支持的区域设置。
从ARB生成Dart代码而不是使用IntlDelegate
您可能想要像intl_translation
提供的那样,即从ARB文件生成Dart代码。
这可以通过此包实现,但为此,您需要使用@GenerateIntl
而不是@GenerateArb
注解。
@GenerateIntl
将首先从Dart代码生成ARB文件,然后为每个区域设置和风味生成一些Dart文件。
一旦所有内容都生成完毕,您可以这样设置这些生成的翻译:
Intl.defaultLocale = 'en';
await initializeMessages(Intl.defaultLocale!, 'flavor');
更多关于Flutter代码生成插件jimtl_codegen的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html