Flutter语言翻译插件tradutor的使用
Flutter语言翻译插件tradutor的使用
tradutor
是一个简化国际化过程的Flutter包。它通过提取消息并生成包含所需消息的友好方式访问的Dart文件。
String get translator => "tradutor";
特性
- 简单的消息。
- 带多个参数的消息。
- 简单消息列表。
- 多个参数的消息列表。
- 支持的消息类型:
- 复数形式。
- 日期。
- 数值。
- 映射。
- 可选参数支持。
- JSON 和 YAML 文件。
- 支持嵌套消息。
- 支持热重载。
安装
在 pubspec.yaml
中添加以下依赖:
dependencies:
flutter_localizations:
sdk: flutter
dev_dependencies:
tradutor: ^0.10.0
使用
在项目目录内打开终端并运行以下命令:
flutter pub run tradutor:generate
所有支持的参数:
--source "DIRECTORY PATH"
或--s "DIRECTORY PATH"
: 包含所有 JSON/YAML 文件的源文件夹(默认为 “./i18n”);--output "FILE PATH"
或--o "FILE PATH"
: 包含所有字符串的输出文件(默认为 “./lib/i18n.dart”);--fallback "LANGUAGE"
或--f "LANGUAGE"
: 提供一个默认语言,在当前运行系统未提供翻译时使用(默认为 “en_US”);--watch
: 监视 JSON/YAML 文件的编辑,并根据需要进行重建。--class-name "NAME"
或--c "NAME"
: 允许更改生成的 Dart 类名(默认为 “I18n”)。
完整示例:flutter packages pub run tradutor:generate -s "/i18n" -o "/lib/i18n.dart" -f "en_US" -c "I18n" --watch
JSON 文件
创建命名格式为语言代码(小写)和国家代码(大写)的 JSON 文件。例如:pt_BR.json
, en_US.json
等。
en_US.json
{
"simpleMessage": "This is a simple Message",
"messageWithParameters": "Hi {name}, Welcome you!",
"brazilFlagColors": ["Green", "Yellow", "Blue", "White"],
"simpleWhiteCakeIngredients": [
"{whiteSugar} cup white sugar",
"{butter} cup butter",
"{eggs} eggs",
"{vanilla} teaspoons vanilla extract",
"{flour} cups all-purpose flour",
"{bakingPowder} teaspoons baking powder",
"{milk} cup milk"
],
"homePage": {
"title": "Home Page"
},
"counter.one": "Button clicked 1 time",
"counter.other": "Button cliked {quantity} times"
}
YAML 文件
创建命名格式为语言代码(小写)和国家代码(大写)的 YAML 文件。例如:pt_BR.yaml
, en_US.yaml
等。
simpleMessage: これは簡単なメッセージです
messageWithParameters: "{name}様、ようこそ!"
brazilFlagColors:
- 緑
- 黄色
- 青い
- 白い
simpleWhiteCakeIngredients:
- "白砂糖{whiteSugar}カップ"
- "バター{butter}カップ"
- "卵{eggs}個"
- "バニラエッセンス小さじ{vanilla}"
- "薄力粉{flour}カップ"
- "小さじ{bakingPowder}杯のベーキングパウダー"
- "牛乳{milk}カップ"
homePage:
title: ホームページ
counter.other: ボタンが{quantity}回クリックされた
嵌套消息
消息可以嵌套。最终的消息名称将被转换为驼峰式格式(以小写字母开头,每个后续键首字母大写)。
{
"this" : {
"is" : {
"a": {
"nested": "Message"
}
}
}
}
生成的 Dart getter:
String get thisIsANested => 'Message';
可选参数
使用 {?name=value}
将参数设置为可选。=value
是可选的,省略时将使用空字符串。
支持的消息类型
消息中的所有参数都必须用花括号包围。参数按字母顺序排序。
简单消息
{
"simpleMessage": "This is a simple Message"
}
生成的 Dart getter:
String get simpleMessage => 'This is a simple Message';
带参数的消息
{
"messageWithParameters": "Hi {name}, Welcome you!"
}
生成的 Dart 方法:
String messageWithParameters(dynamic name) => 'Hi ${name}, Welcome you!';
简单消息列表
定义一个字符串数组。
{
"brazilFlagColors": ["Green", "Yellow", "Blue", "White"]
}
生成的 Dart getter:
List<String> get brazilFlagColors => ['Green', 'Yellow', 'Blue', 'White'];
多个参数的消息列表
{
"simpleWhiteCakeIngredients": [
"{whiteSugar} cup white sugar",
"{butter} cup butter",
"{eggs} eggs",
"{vanilla} teaspoons vanilla extract",
"{flour} cups all-purpose flour",
"{bakingPowder} teaspoons baking powder",
"{milk} cup milk"
],
}
生成的 Dart 方法:
List<String> simpleWhiteCakeIngredients(
dynamic bakingPowder,
dynamic butter,
dynamic eggs,
dynamic flour,
dynamic milk,
dynamic vanilla,
dynamic whiteSugar) =>
[
'${whiteSugar} cup white sugar',
'${butter} cup butter',
'${eggs} eggs',
'${vanilla} teaspoons vanilla extract',
'${flour} cups all-purpose flour',
'${bakingPowder} teaspoons baking powder',
'${milk} cup milk'
];
复数形式的消息
最后的消息名称必须是 zero
, one
, two
, few
, many
或 other
。参见 语言复数规则。
{
"counter.one": "Button clicked 1 time",
"counter.other": "Button cliked {quantity} times"
}
或者
{
"counter": {
"one": "Button clicked 1 time",
"other": "Button cliked {quantity} times"
}
}
必须提供
other
的复数形式。
quantity
是用于根据其值格式化消息的参数。
生成的 Dart 方法:
String counter(int quantity) => Intl.plural(
quantity,
locale: 'en_US',
one: 'Button clicked 1 time',
other: 'Button cliked ${quantity} times',
);
映射消息
消息名称以 %
开头。
{
"%eyeColor": {
"FAMALE": "She has {color} eyes",
"MALE": "He has {color} eyes"
}
}
生成的 Dart 方法:
String eyeColor(String key, dynamic color) {
switch (key) {
case 'FAMALE':
return 'She has ${color} eyes';
case 'MALE':
return 'He has ${color} eyes';
default:
return null;
}
}
key
是用于根据其值格式化消息的参数。
日期消息
消息名称以 #
开头。
{
"#fullDate": "MM dd, yyyy h:mm:ss a"
}
生成的 Dart 方法:
static final _fullDateFormatter = DateFormat('MM dd, yyyy h:mm:ss a', 'en_US');
String fullDate(DateTime date) => _fullDateFormatter.format(date);
参见 DateFormat 文档。
数值消息
消息名称以 $
开头。
{
"$currencyMessage": "\\$#,##0.00"
}
生成的 Dart 方法:
static final _currencyMessageFormatter = NumberFormat('\$#,##0.00', 'en_US');
String currencyMessage(num number) => _currencyMessageFormatter.format(number);
参见 NumberFormat 文档。
生成的 Dart 文件 (i18n.dart) 的使用
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'i18n.dart';
void main() => runApp(App());
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
final i18n = I18n.delegate;
return MaterialApp(
title: 'Tradutor',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const HomePage(),
localizationsDelegates: [
i18n,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: i18n.supportedLocales,
localeResolutionCallback: i18n.resolution(
fallback: const Locale('en', 'US'),
),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({
Key key,
}) : super(key: key);
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
var _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
final i18n = I18n.of(context);
return Scaffold(
appBar: AppBar(
title: Text(i18n.homePage),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(i18n.counter(_counter)),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
child: const Icon(Icons.add),
),
);
}
}
转义花括号和美元符号
Json | Dart | 消息 (a = ‘Hi’) | 注释 |
---|---|---|---|
“{a}” | “${a}” | “Hi” | 只是一个参数 |
“{a}” | “{a}” | “{a}” | 被花括号包围的文本 |
“\{a}” | “\{a}” | “{a}” | 反斜杠加被花括号包围的文本 |
“{!a}” | “${a}” | “\Hi” | 反斜杠加参数 |
“{!?a}” | “${a}” | “\Hi” | 反斜杠加可选参数 |
“\$” | “$” | “$” | 只是美元符号 |
语言选项
@parent
使用 [@parent](/user/parent)
表示语言是父语言。
pt_PT.json
{
"[@parent](/user/parent)": true,
}
pt_PT
是 pt_BR
, pt_AO
, pt_TL
等的父语言。如果找不到某些子语言,则将使用 pt_PT
。
@textDirection
使用 [@textDirection](/user/textDirection)
指示文本流动的方向。有效值为 ltr
(默认)和 rtl
。
he_IL.json
{
"[@textDirection](/user/textDirection)": "rtl",
}
更多关于Flutter语言翻译插件tradutor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter语言翻译插件tradutor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中集成和使用tradutor
插件来进行语言翻译的示例代码。tradutor
是一个Flutter插件,用于提供简单的文本翻译功能。不过请注意,由于tradutor
插件的具体实现和API可能会随时间变化,以下示例基于插件的一般使用方式,并假设该插件提供了类似的功能接口。
首先,确保你的Flutter环境已经设置好,并且在pubspec.yaml
文件中添加tradutor
依赖:
dependencies:
flutter:
sdk: flutter
tradutor: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中,你可以按照以下步骤使用tradutor
插件进行文本翻译:
- 导入
tradutor
包:
在你的Dart文件中导入tradutor
包:
import 'package:tradutor/tradutor.dart';
- 初始化
Tradutor
实例:
在使用之前,你可能需要初始化一个Tradutor
实例。不过,具体初始化步骤取决于tradutor
插件的API设计。这里假设插件提供了一个简单的初始化方法:
final Tradutor tradutor = Tradutor();
注意:实际使用时,请查阅tradutor
的官方文档以获取正确的初始化方法。
- 进行翻译:
假设tradutor
插件提供了一个translate
方法,该方法接受源语言、目标语言和要翻译的文本作为参数,并返回一个包含翻译结果的Future。以下是一个简单的使用示例:
void translateText() async {
String sourceLanguage = 'en'; // 源语言代码,例如英语
String targetLanguage = 'zh'; // 目标语言代码,例如中文
String textToTranslate = 'Hello, world!'; // 要翻译的文本
try {
// 调用translate方法进行翻译
String translatedText = await tradutor.translate(textToTranslate, sourceLanguage, targetLanguage);
print('Translated Text: $translatedText');
} catch (e) {
// 处理可能的异常
print('Error during translation: $e');
}
}
- 在UI中调用翻译函数:
你可以在一个按钮的点击事件或其他UI交互中调用translateText
函数:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Tradutor Example'),
),
body: Center(
child: ElevatedButton(
onPressed: translateText, // 在按钮点击时调用翻译函数
child: Text('Translate Text'),
),
),
),
);
}
}
注意:以上代码是基于假设的tradutor
插件API编写的。实际使用时,你需要查阅tradutor
插件的官方文档以获取正确的API调用方式和参数。
由于tradutor
插件的具体实现可能有所不同,因此上述代码可能需要根据你的实际插件版本进行调整。务必参考插件的官方文档和示例代码以获取最新和最准确的使用指南。