Flutter国际化插件sai_l10n_generator的使用

Flutter国际化插件sai_l10n_generator的使用

sai_l10n_generator 是一个用于Flutter项目的自定义Dart代码生成器,它可以自动扫描你的Dart文件中的 .tr 字符串,并生成一个Dart文件 (app_translations.g.dart) 来管理本地化字符串,同时支持GetX框架。它确保已存在的键在生成的文件中不会被删除,只有新发现的键才会被添加。

特性

  • 自动扫描 lib/ 目录下的所有Dart文件中的 .tr 字符串。
  • 为GetX框架所需的结构生成或更新Dart文件以进行本地化。
  • 确保现有的本地化键不被删除,只有新发现的键会被添加。

安装

1. 添加依赖

在你的 pubspec.yaml 文件中,将 sai_l10n_generator 作为开发依赖项添加:

dev_dependencies:
  sai_l10n_generator: ^1.0.0
  build_runner: ^2.1.7
  source_gen: ^1.1.1

2. 配置 build.yaml

确保你的包或项目包含以下配置的 build.yaml 文件:

targets:
  $default:
    builders:
      sai*l10n_generator|l10n_builder:
        enabled: true
        generate_for: - lib/**/_*.dart

builders:
  sai_l10n_generator|l10n_builder:
    import: "package:sai_l10n_generator/src/l10n_builder.dart"
    builder_factories: ["l10nBuilder"]
    build_extensions: {".dart": [".g.dart"]}
    auto_apply: root_package
    build_to: source
    applies_builders: ["source_gen|combining_builder"]

此配置告诉 build_runner 处理 lib/ 文件夹中的所有Dart文件中的 .tr 字符串,并生成适当的本地化文件。

使用

1. 标记需要本地化的字符串

在你的Dart文件中,使用 .tr 来标记需要本地化的字符串。例如:

Text('helloWorld'.tr),
Text('welcomeMessage'.tr),

.tr 扩展表示该字符串应添加到本地化文件中。

2. 运行生成器

要生成或更新你的本地化Dart文件,可以在终端中运行以下命令:

flutter pub run build_runner build

这会扫描 lib/ 文件夹中的所有Dart文件,并生成或更新 lib/core/utils/l10n/app_translations.g.dart 文件中的本地化键。

3. 生成的本地化文件

生成的Dart文件将遵循GetX框架的本地化模式。以下是 app_translations.g.dart 文件的一个示例:

part of 'app_translations.dart';

class _AppTranslation implements AppTranslation {
  [@override](/user/override)
  Map<String, Map<String, String>> get keys => {
    'ar': Locales.ar,
    'en': Locales.en,
  };
}

class Locales {
  static const ar = {
    "hello": "",
    "welcomeMessage": "",
    "clickMe": "",
  };
  static const en = {
    'hello': '',
    'welcomeMessage': '',
    'clickMe': '',
  };
}

你可以在生成的文件中手动填充阿拉伯语(ar)和英语(en)的翻译。

4. 保留现有键

生成器会检查 app_translations.g.dart 文件中的任何现有键。如果文件已经包含键,则这些键将 不会 被删除。生成器只会添加在项目中发现的新键。这确保了你手动填充的翻译保持不变。

自定义

默认情况下,该包会为阿拉伯语(ar)和英语(en)生成本地化文件。如果你需要支持其他语言,可以扩展生成器以包含更多的本地化映射。

清理构建工件

如果你需要清理生成的构建工件,可以运行:

flutter pub run build_runner clean

这将移除所有的构建缓存,并在下次运行 build_runner 命令时强制重新构建。

示例代码

以下是一个完整的示例代码,展示了如何使用 sai_l10n_generator 插件来实现Flutter应用的国际化。

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'core/utils/l10n/app_translations.dart'; // 导入生成的本地化文件

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return GetMaterialApp(
      // 使用GetX的翻译并指定初始区域设置
      translations: AppTranslation.instance(), // 从app_translations.dart导入的翻译映射
      locale: const Locale('en', 'US'), // 默认区域设置(可设置为任何支持的语言)
      fallbackLocale: const Locale('en', 'US'), // 如果区域设置不受支持则回退到英语

      // 添加Material、Widgets和Cupertino的本地化委托
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('hello'.tr), // 使用GetX翻译 'hello'
        actions: [
          IconButton(
            icon: const Icon(Icons.language),
            onPressed: () {
              // 在英语和阿拉伯语之间切换
              Locale currentLocale = Get.locale!;
              if (currentLocale.languageCode == 'en') {
                Get.updateLocale(const Locale('ar', 'AR')); // 切换到阿拉伯语
              } else {
                Get.updateLocale(const Locale('en', 'US')); // 切换到英语
              }
            },
          ),
        ],
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('welcomeMessage'.tr), // GetX翻译 'welcomeMessage'
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 添加按钮点击功能
              },
              child: Text('clickMe'.tr), // GetX翻译 'clickMe'
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


SaiL10nGenerator 是一个用于简化 Flutter 应用程序国际化的插件。它可以帮助你生成多语言支持所需的代码,从而减少手动编写和管理的复杂性。以下是使用 SaiL10nGenerator 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

dev_dependencies:
  sai_l10n_generator: ^latest_version
  build_runner: ^latest_version

2. 创建 JSON 文件

在项目的 assets 目录下创建 JSON 文件,用于存储不同语言的翻译。例如:

assets/l10n/
  en.json
  zh.json

en.json 文件内容示例:

{
  "hello": "Hello",
  "world": "World"
}

zh.json 文件内容示例:

{
  "hello": "你好",
  "world": "世界"
}

3. 配置 pubspec.yaml

pubspec.yaml 文件中配置 assets 路径和 SaiL10nGenerator

flutter:
  assets:
    - assets/l10n/

sai_l10n_generator:
  input_dir: assets/l10n
  output_dir: lib/l10n

4. 生成代码

运行以下命令来生成国际化代码:

flutter pub run build_runner build

这将在 lib/l10n 目录下生成所需的 Dart 文件。

5. 使用生成的代码

在你的 Flutter 应用中使用生成的代码来支持国际化。

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'l10n/generated/l10n.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      localizationsDelegates: [
        S.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: S.delegate.supportedLocales,
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(S.of(context).hello),
      ),
      body: Center(
        child: Text(S.of(context).world),
      ),
    );
  }
}

6. 切换语言

你可以通过以下方式动态切换应用的语言:

Locale newLocale = Locale('zh');
S.load(newLocale);
回到顶部