Flutter国际化插件l10m的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter国际化插件l10m的使用

1. 简介

l10m 是一个Dart库,用于生成模块化的翻译文件,旨在帮助模块化应用程序的本地化。通过 l10m,你可以轻松地为每个模块生成独立的翻译文件,并将它们与应用程序的主翻译文件结合使用。

2. 使用方法

2.1 添加依赖

首先,在你的 pubspec.yaml 文件中添加 l10m 作为开发依赖:

dev_dependencies:
  l10m: any
2.2 命令行接口

l10m 提供了一个命令行接口,用于生成翻译文件。你可以通过以下选项来自定义生成过程:

  • --module-path-m: 指定模块文件夹的路径,默认为 lib/modules
  • --output-folder-o: 指定生成文件的输出文件夹,默认为 l10n/generated
  • --root-path-r: 指定本地化文件所在的根文件夹,默认为 lib
  • --template-arb-file-t: 指定模板 ARB 文件的路径,默认为 intl_en.arb
  • --help-h: 显示可用选项的帮助信息。
2.3 示例命令

要生成翻译文件,可以使用以下命令:

dart run l10m -m lib/modules -o l10n/generated -r lib -t intl_en.arb

该命令将根据提供的路径和模板 ARB 文件生成根翻译文件和模块特定的翻译文件。

3. 输出结构

l10m 的输出结构如下所示:

lib/
--l10n/
----generated/
------root_localizations.dart  # 根本地化类
------root_localizations_en.dart  # 英文根翻译
------root_localizations_es.dart  # 西班牙文根翻译
----intl_en.arb  # 根模板文件
----intl_es.arb  # 根模板文件
--modules/
----module1/
------l10n/
--------generated/
----------module1_localizations.dart  # 模块1本地化类
----------module1_localizations_en.dart  # 英文模块1翻译
----------module1_localizations_es.dart  # 西班牙文模块1翻译
--------intl_en.arb  # 模块1模板文件
--------intl_es.arb  # 模块1模板文件
----module2/
------l10n/
--------generated/
----------module2_localizations.dart  # 模块2本地化类
----------module2_localizations_en.dart  # 英文模块2翻译
----------module2_localizations_es.dart  # 西班牙文模块2翻译
--------intl_en.arb  # 模块2模板文件
--------intl_es.arb  # 模块2模板文件
----module3/
------l10n/
--------generated/
----------module3_localizations.dart  # 模块3本地化类
----------module3_localizations_en.dart  # 英文模块3翻译
----------module3_localizations_es.dart  # 西班牙文模块3翻译
--------intl_en.arb  # 模块3模板文件
--------intl_es.arb  # 模块3模板文件

4. 示例代码

4.1 translate.dart

这个文件用于组合所有模块的本地化文件,并提供一个统一的接口来访问这些翻译。

import 'package:flutter/material.dart';

// 导入生成的根本地化文件
import 'l10n/generated/root_localizations.dart';
// 导入各个模块的本地化文件
import 'modules/module1/l10n/generated/module1_localizations.dart';
import 'modules/module2/l10n/generated/module2_localizations.dart';
import 'modules/module3/l10n/generated/module3_localizations.dart';

class Translate {
  // 定义本地化代理列表
  static List<LocalizationsDelegate> localizationsDelegates = [
    RootLocalizationsDelegate(),  // 根本地化代理
    Module1LocalizationsDelegate(),  // 模块1本地化代理
    Module2LocalizationsDelegate(),  // 模块2本地化代理
    Module3LocalizationsDelegate(),  // 模块3本地化代理
  ];

  // 支持的语言列表
  static List<Locale> supportedLocales = [
    const Locale('en'),  // 英文
    const Locale('es'),  // 西班牙文
  ];

  // 获取根本地化对象
  static RootLocalizations root(BuildContext context) {
    return RootLocalizations.of(context);
  }

  // 获取模块1的本地化对象
  static Module1Localizations module1(BuildContext context) {
    return Module1Localizations.of(context);
  }

  // 获取模块2的本地化对象
  static Module2Localizations module2(BuildContext context) {
    return Module2Localizations.of(context);
  }

  // 获取模块3的本地化对象
  static Module3Localizations module3(BuildContext context) {
    return Module3Localizations.of(context);
  }
}
4.2 main.dart

这是应用程序的入口文件,配置了Flutter的多语言支持。

import 'package:flutter/material.dart';

// 导入本地化文件
import 'translate.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      // 注册本地化代理
      localizationsDelegates: Translate.localizationsDelegates,
      // 支持的语言列表
      supportedLocales: Translate.supportedLocales,
      // 应用首页
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        // 使用根本地化文件中的应用标题
        title: Text(Translate.root(context).appTitle),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 使用模块1的本地化文件中的标题
            Text(Translate.module1(context).title),
            // 使用模块2的本地化文件中的标题
            Text(Translate.module2(context).title),
            // 使用模块3的本地化文件中的标题
            Text(Translate.module3(context).title),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用l10n插件来实现国际化的代码示例。l10n插件是Flutter官方推荐的国际化解决方案,通常与Flutter的flutter_gen工具一起使用来自动生成支持国际化的代码。

1. 添加依赖

首先,确保你的pubspec.yaml文件中添加了必要的依赖:

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

dev_dependencies:
  flutter_gen: ^x.y.z  # 请使用最新版本
  build_runner: ^x.y.z  # 请使用最新版本

2. 配置flutter_gen

在项目根目录下创建flutter_gen.yaml文件,并添加以下配置:

# flutter_gen.yaml
output: lib/gen

l10n:
  locales:
    - en  # 英文
    - zh  # 中文
  arb_dir: lib/l10n
  template_arb_file: lib/l10n/messages.arb

3. 创建ARB文件

lib/l10n目录下创建一个ARB文件(如messages.arb),并添加你的翻译内容:

{
  "welcome_message": {
    "en": "Welcome to our app!",
    "zh": "欢迎来到我们的应用!"
  },
  "goodbye_message": {
    "en": "Goodbye!",
    "zh": "再见!"
  }
}

4. 生成本地化文件

在项目根目录下运行以下命令来生成本地化文件:

flutter pub get
flutter gen-l10n

这将生成一个lib/gen/l10n/目录,其中包含支持国际化的代码。

5. 使用生成的本地化文件

在你的Flutter应用中,你可以使用生成的本地化文件来显示翻译后的文本。首先,确保你的应用入口文件(如main.dart)中添加了本地化支持:

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:your_app/gen/l10n/l10n.dart';  // 引入生成的本地化文件
import 'package:your_app/your_locale_provider.dart';  // 假设你有一个提供当前locale的类

void main() {
  runApp(
    MaterialApp(
      localizationsDelegates: [
        AppLocalizations.delegate,  // 使用生成的本地化委托
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: AppLocalizations.supportedLocales,  // 支持的locale列表
      locale: YourLocaleProvider.currentLocale,  // 当前locale,假设你有一个类来管理它
      home: MyHomePage(),
    ),
  );
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final l10n = Localizations.localeOf(context).l10n;  // 获取当前locale的l10n实例
    return Scaffold(
      appBar: AppBar(
        title: Text(l10n.welcomeMessage),  // 使用翻译后的文本
      ),
      body: Center(
        child: Text(l10n.goodbyeMessage),  // 使用翻译后的文本
      ),
    );
  }
}

6. 管理Locale

你可能需要一个类来管理当前的Locale。这是一个简单的示例:

// your_locale_provider.dart
import 'package:flutter/material.dart';

class YourLocaleProvider {
  static Locale currentLocale = Locale('en');  // 默认locale

  static void setLocale(Locale newLocale) {
    currentLocale = newLocale;
    // 你可以在这里添加代码来持久化locale设置,例如保存到用户偏好设置
  }
}

总结

以上是如何在Flutter项目中使用l10n插件来实现国际化的完整示例。这包括添加依赖、配置flutter_gen、创建ARB文件、生成本地化文件以及在你的应用中使用这些本地化文件。希望这能帮助你更好地实现应用的国际化。

回到顶部