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
更多关于Flutter国际化插件intl_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用intl_generator
插件来实现国际化的详细代码示例。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加intl
和intl_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.arb
和messages_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
来生成更新后的本地化文件。