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文件时抑制元数据,默认为false
  • suppressLastModified: 在生成ARB文件时抑制最后修改时间,默认为false
  • includeSourceText: 是否在消息中包含源文本,默认为false
  • dir: 应生成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

1 回复

更多关于Flutter代码生成插件jimtl_codegen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


jimtl_codegen 是一个用于 Flutter 项目的代码生成插件,它可以帮助开发者自动生成一些重复性的代码,从而提高开发效率。以下是如何使用 jimtl_codegen 插件的详细步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 jimtl_codegen 插件的依赖。

dev_dependencies:
  jimtl_codegen: ^版本号

请将 ^版本号 替换为最新的 jimtl_codegen 版本。

2. 创建代码生成器

接下来,你需要创建一个代码生成器。通常,代码生成器是一个 Dart 文件,它定义了如何生成代码。

例如,创建一个 generator.dart 文件:

import 'package:jimtl_codegen/jimtl_codegen.dart';

@CodeGen()
void generateCode() {
  // 在这里定义你的代码生成逻辑
  // 例如,生成一个类或方法
}

3. 运行代码生成器

在终端中运行以下命令来生成代码:

flutter pub run build_runner build

这将执行 jimtl_codegen 插件,并根据你在 generator.dart 中定义的逻辑生成代码。

4. 使用生成的代码

生成的代码通常会放在 lib/generated/ 目录下。你可以在你的项目中直接使用这些生成的代码。

例如,如果你生成了一个类 MyGeneratedClass,你可以这样使用它:

import 'package:my_app/generated/my_generated_class.dart';

void main() {
  var instance = MyGeneratedClass();
  instance.doSomething();
}

5. 自动重新生成代码

如果你在开发过程中修改了代码生成器的逻辑,你可以使用以下命令来重新生成代码:

flutter pub run build_runner watch

这将监视你的代码生成器文件,并在文件发生变化时自动重新生成代码。

6. 清理生成的文件

如果你想清理所有生成的文件,可以运行以下命令:

flutter pub run build_runner clean
回到顶部