Flutter国际化工具插件intl_utils的使用

Flutter国际化工具插件intl_utils的使用

Intl Utils

pub package Twitter Follow

intl_utils 是一个Dart包,它创建了来自.arb文件的翻译与Flutter应用程序之间的绑定。它为官方Dart Intl库生成样板代码,并在Dart代码中添加键的自动完成功能。

使用方法

你可以直接使用这个包(例如用于持续集成工具或通过CLI),或者让 Visual Studio CodeIntelliJ/Android Studio 插件在你修改ARB文件时自动运行它。

配置包

将包配置添加到你的pubspec.yaml文件中。以下是此包的完整配置:

flutter_intl:
  enabled: true # 必须设置为true以激活该包,默认为false
  class_name: S # 可选。设置生成的本地化类的名称,默认为S
  main_locale: en # 可选。设置用于生成本地化文件的主要语言环境,默认为en
  arb_dir: lib/l10n # 可选。设置你的ARB资源文件目录,默认为lib/l10n
  output_dir: lib/generated # 可选。设置生成的本地化文件目录,默认为lib/generated
  use_deferred_loading: false # 可选。必须设置为true以生成延迟加载的本地化代码,默认为false
  localizely: # 如果你使用Localizely平台,则为可选设置。更多信息:https://localizely.com/blog/flutter-localization-step-by-step/?tab=automated-using-flutter-intl
    project_id: # 从https://app.localizely.com/projects页面获取。
    branch: # 如果启用了分支并希望使用非主分支,则从Localizely平台的“Branches”页面获取。
    upload_overwrite: # 如果希望上传时覆盖翻译,请设置为true,默认为false
    upload_as_reviewed: # 如果希望标记上传的翻译为已审核,请设置为true,默认为false
    upload_tag_added: # 可选的新翻译标签列表(例如 ['new', 'New translation'])。默认为空
    upload_tag_updated: # 可选的更新翻译标签列表(例如 ['updated', 'Updated translation'])。默认为空
    upload_tag_removed: # 可选的删除翻译标签列表(例如 ['removed', 'Removed translation'])。默认为空
    download_empty_as: # 设置为空|main|skip,以配置如何从Localizely平台导出空翻译。默认为空
    download_include_tags: # 可选的下载标签列表(例如 ['include', 'Include key'])。如果未设置,则所有字符串键都将被考虑下载。默认为空
    download_exclude_tags: # 可选的排除下载标签列表(例如 ['exclude', 'Exclude key'])。如果未设置,则所有字符串键都将被考虑下载。默认为空
    ota_enabled: # 如果希望使用Localizely Over-the-air功能,请设置为true,默认为false

添加 ARB 文件

为每个需要支持的语言环境添加一个 ARB 文件。将它们添加到项目中的 lib/l10n 文件夹,并按以下方式命名:intl_<LOCALE_ISO_CODE>.arb。例如:intl_en.arbintl_en_GB.arb。你也可以通过在 pubspec.yaml 文件中添加 arb_dir 行来更改 ARB 文件夹。

有关如何在 ARB 文件中格式化键值内容的详细说明,请参考这里

运行命令

要生成本地化的样板代码,在包含 pubspec.yaml 文件的目录中运行以下命令:

flutter pub run intl_utils:generate

这将在 lib/generated 目录中生成文件。你也可以通过在 pubspec.yaml 文件中添加 output_dir 行来更改输出文件夹。

与 Localizely 的集成

上传主 ARB 文件

flutter pub run intl_utils:localizely_upload_main [--project-id <PROJECT_ID> --api-token <API_TOKEN> --arb-dir <ARB_DIR> --main-locale <MAIN_LOCALE> --branch <BRANCH> --[no-]upload-overwrite --[no-]upload-as-reviewed] --upload-tag-added <UPLOAD_TAG_ADDED> --upload-tag-updated <UPLOAD_TAG_UPDATED> --upload-tag-removed <UPLOAD_TAG_REMOVED>

这将把你的主 ARB 文件上传到 Localizely。所有参数都是可选的。如果没有提供,intl_utils 将使用 pubspec.yaml 文件中的配置或默认值(详情请参阅配置包部分)。

下载 ARB 文件

flutter pub run intl_utils:localizely_download [--project-id <PROJECT_ID> --api-token <API_TOKEN> --arb-dir <ARB_DIR> --download-empty-as <DOWNLOAD_EMPTY_AS> --download-include-tags <DOWNLOAD_INCLUDE_TAGS> --download-exclude-tags <DOWNLOAD_EXCLUDE_TAGS> --branch <BRANCH>]

这将从 Localizely 平台下载所有可用的 ARB 文件,并将其放在 arb-dir 文件夹下。所有参数都是可选的。如果没有提供,intl_utils 将使用 pubspec.yaml 文件中的配置或默认值(详情请参阅配置包部分)。

注意:

  • 参数 project-id 如果 pubspec.yaml 文件包含 flutter_intl/localizely 部分下的 project_id 配置,则可以省略。
  • 参数 api-token 如果 ~/.localizely/credentials.yaml 文件包含 api_token 配置(例如 api_token: xxxxxx),则可以省略。
  • 可选参数 arb-dir 默认值为 lib/l10n,仅在你想将 ARB 文件放置在自定义目录中时才需要设置。

示例代码

为了更好地理解如何使用 intl_utils,请参考 example/README.md 中提供的示例。

完整示例 Demo

以下是一个完整的示例,展示了如何使用 intl_utils 实现国际化:

  1. 创建 ARB 文件

    lib/l10n 目录下创建两个 ARB 文件:intl_en.arbintl_zh.arb

    • intl_en.arb

      {
        "@@locale": "en",
        "helloWorld": "Hello World!"
      }
    • intl_zh.arb

      {
        "@@locale": "zh",
        "helloWorld": "你好,世界!"
      }
  2. 配置 pubspec.yaml

    flutter_intl:
      enabled: true
      class_name: S
      main_locale: en
      arb_dir: lib/l10n
      output_dir: lib/generated
  3. 生成本地化文件

    在终端中运行以下命令:

    flutter pub run intl_utils:generate
  4. 使用生成的本地化类

    在你的 Dart 代码中使用生成的 S 类来显示本地化的文本:

    import 'package:flutter/material.dart';
    import 'package:intl/intl.dart';
    import 'generated/l10n.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          localizationsDelegates: [
            S.delegate,
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
            GlobalCupertinoLocalizations.delegate,
          ],
          supportedLocales: S.delegate.supportedLocales,
          localeResolutionCallback: (locale, supportedLocales) {
            for (var supportedLocale in supportedLocales) {
              if (supportedLocale.languageCode == locale?.languageCode &&
                  supportedLocale.countryCode == locale?.countryCode) {
                return supportedLocale;
              }
            }
            return supportedLocales.first;
          },
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(S.of(context).helloWorld),
          ),
          body: Center(
            child: Text(S.of(context).helloWorld),
          ),
        );
      }
    }

通过以上步骤,你就可以成功地在 Flutter 应用中实现国际化功能。

1 回复

更多关于Flutter国际化工具插件intl_utils的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 intl_utils 插件进行 Flutter 国际化的代码案例。intl_utils 是一个帮助开发者更方便地管理 Flutter 应用国际化的工具插件。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 intl_utils 依赖:

dependencies:
  flutter:
    sdk: flutter
  intl_utils: ^x.y.z  # 替换为最新版本号

然后运行 flutter pub get 来获取依赖。

2. 创建国际化资源文件

在项目的 lib 目录下创建一个 l10n 文件夹,并在其中创建语言资源文件。例如,创建 messages_en.arbmessages_zh.arb

messages_en.arb

{
  "welcome_message": "Welcome!",
  "goodbye_message": "Goodbye!"
}

messages_zh.arb

{
  "welcome_message": "欢迎!",
  "goodbye_message": "再见!"
}

3. 配置 intl_utils

在你的 Flutter 项目中,通常会有一个 main.dart 文件。在这个文件中,配置 intl_utils

import 'package:flutter/material.dart';
import 'package:intl_utils/intl_utils.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';  // 确保生成了本地化文件

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Intl Utils Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: [
        AppLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: AppLocalizations.supportedLocales,
      locale: Localizations.localeOf(context),  // 使用当前设备的语言环境
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Locale _currentLocale = Locale('en');

  void _changeLanguage(Locale locale) {
    setState(() {
      _currentLocale = locale;
    });
  }

  @override
  Widget build(BuildContext context) {
    final AppLocalizations localizations = AppLocalizations.of(context);

    return Scaffold(
      appBar: AppBar(
        title: Text(localizations.welcome_message),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(localizations.welcome_message),
            Text(localizations.goodbye_message),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => _changeLanguage(Locale('zh')),
              child: Text('Change to Chinese'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: () => _changeLanguage(Locale('en')),
              child: Text('Change to English'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 生成本地化文件

你需要使用 Flutter 的工具生成本地化文件。在命令行中运行以下命令:

flutter pub run flutter_gen:generate

这将会生成 flutter_gen/gen_l10n/app_localizations.dart 文件,这个文件包含了所有从 ARB 文件中加载的本地化字符串。

5. 运行应用

现在你可以运行你的 Flutter 应用,并且应该能够在应用中切换语言,并看到相应的本地化文本。

注意事项

  • 确保你的 Flutter 环境已经正确配置,并且所有依赖都已正确安装。
  • 在实际项目中,可能需要更复杂的语言管理逻辑,例如持久化用户的语言选择。

这个代码案例展示了如何使用 intl_utils 插件进行 Flutter 应用的国际化。希望这对你有所帮助!

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!