Flutter国际化插件intl_generator的使用

Flutter国际化插件intl_generator的使用

标题

Intl_generator #

内容

This is a fork of intl_translation to have an up to date version.

If you prefer having translations as part of your build_runner process or need to support flavors, please check intl_flavors

This package provides message extraction and code generation from translated messages for the Intl package. It’s a separate package so as to not require a dependency on analyzer for all users.

提取和使用翻译消息

When your program contains messages that need translation, these must be extracted from the program source, sent to human translators, and the results need to be incorporated.

To extract messages, run the extract_to_arb.dart program.

  pub run intl_generator:extract_to_arb --output-dir=target/directory
      my_program.dart more_of_my_program.dart

This will produce a file intl_messages.arb with the messages from all of these programs. This is an ARB format file which can be used for input to translation tools like Localizely or (the deprecated) Google Translator Toolkit. The resulting translations can be used to generate a set of libraries using the generate_from_arb.dart program.

This expects to receive a series of files, one per locale.

pub run intl_generator:generate_from_arb --generated-file-prefix=<prefix>
    <my_dart_files> <translated_ARB_files>

This will generate Dart libraries, one per locale, which contain the translated versions. Your Dart libraries can import the primary file, named <prefix>messages_all.dart, and then call the initialization for a specific locale. Once that’s done, any Intl.message calls made in the context of that locale will automatically print the translated version instead of the original.

import "my_prefix_messages_all.dart";
...
initializeMessages("dk").then(printSomeMessages);

Once the Future returned from the initialization call completes, the message data is available.


示例代码

// 创建一个目录用于存放生成的文件
final outputDir = 'target/directory';
final arbFile = '${outputDir}/intl_messages.arb';

// 运行提取程序
await runCommand('pub', ['run', 'intl_generator:extract_to_arb', '--output-dir=$outputDir', 'my_program.dart', 'more_of_my_program.dart']);

// 生成翻译后的Dart库
final generatedFilePrefix = 'my_prefix';
final dartFiles = ['my_program.dart', 'more_of_my_program.dart'];
final translatedArbFiles = ['translated_messages.arb'];

await runCommand('pub', [
  'run',
  'intl_generator:generate_from_arb',
  '--generated-file-prefix=$generatedFilePrefix',
  ...dartFiles,
  ...translatedArbFiles,
]);

// 导入生成的Dart库并初始化消息
import 'my_prefix_messages_all.dart';
Future<void> main() async {
  await initializeMessages('dk');
  // 打印一些消息
  printSomeMessages();
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用intl_generator插件来实现国际化的详细代码示例。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加intlintl_translation依赖,以及build_runner用于生成代码。

dependencies:
  flutter:
    sdk: flutter
  intl: ^0.17.0  # 请确保使用最新版本

dev_dependencies:
  build_runner: ^2.1.4  # 请确保使用最新版本
  intl_translation: ^0.17.10+1  # 请确保使用最新版本

2. 创建国际化文件

lib目录下创建一个l10n文件夹,并在其中创建一个messages_all.dart文件。这个文件将用于定义所有的国际化字符串。

// lib/l10n/messages_all.dart
import 'package:intl/intl.dart';

// 定义一个类来包含所有的国际化字符串
class Messages {
  Messages();

  static final Messages _local = Messages();

  // 静态方法用于获取实例
  static Messages of(BuildContext context) {
    return Localizations.of<Messages>(context, Messages);
  }

  // 定义国际化字符串
  String get hello {
    return Intl.message(
      'Hello',
      name: 'hello',
      desc: 'Greeting message',
    );
  }

  // 你可以继续添加更多的字符串
}

3. 创建ARB文件

lib/l10n文件夹中为每个语言创建ARB文件。例如,创建messages_en.arbmessages_zh.arb

messages_en.arb

{
  "hello": "Hello"
}

messages_zh.arb

{
  "hello": "你好"
}

4. 配置国际化

lib目录下创建一个generated文件夹(如果尚未存在),然后在lib/main.dart中配置MaterialApp以使用生成的本地化委托。

// lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; // 自动生成的文件
import 'l10n/messages_all.dart';

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

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

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

5. 生成本地化文件

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

flutter pub run build_runner build

这将生成一个lib/generated/l10n文件夹,其中包含所有必要的本地化文件和委托。

6. 运行应用

现在,你可以运行你的Flutter应用,并通过更改设备的语言设置来查看国际化的效果。

flutter run

总结

通过上述步骤,你已经在Flutter项目中成功配置了intl_generator插件,实现了基本的国际化功能。你可以根据需要添加更多的ARB文件和字符串,并运行flutter pub run build_runner build来生成更新后的本地化文件。

回到顶部