Flutter国际化插件l10nization_cli的使用
Flutter国际化插件l10nization_cli的使用
L10nization_cli简介
L10nization_cli 是一个命令行工具,用于从ARB文件中查找未使用的国际化翻译。它可以帮助开发者清理不再使用的翻译条目,保持项目的整洁和高效。
开始使用 🚀
如果L10nization_cli已经在 [pub.dev] 上发布,可以通过以下命令全局激活:
dart pub global activate l10nization_cli
使用方法
查找未使用的翻译
使用 check-unused
命令来查找未使用的翻译条目:
# 查找当前项目中的未使用翻译
l10nization check-unused <项目文件夹路径>
考虑的情况
L10nization_cli 会检查以下几种常见的国际化调用方式:
-
通过
context.l10n
调用:return Text(context.l10n.hello);
-
通过
AppLocalizations.of(context)
调用:final l10n = AppLocalizations.of(context); return Text(l10n.a);
-
通过扩展方法调用:
final l10n = context.l10n; return Text(l10n.a);
-
直接在组件中传递
AppLocalizations
实例:class MyWidget extends StatelessWidget { const MyWidget({ required this.l10n, super.key, }); final AppLocalizations l10n; @override Widget build(BuildContext context) { return Text(l10n.helloMoon); } }
-
继承自父类并传递
AppLocalizations
实例:abstract class MySuperWidget extends StatelessWidget { const MySuperWidget({ required this.l10n, super.key, }); final AppLocalizations l10n; } class MyWidget extends MySuperWidget { const MyWidget({ required super.l10n, super.key, }); @override Widget build(BuildContext context) { return Text(l10n.helloMoon); } }
-
通过扩展方法动态获取翻译:
extension AppLocalizationsExtension on AppLocalizations { String byKey(final String value) { switch (value) { case 'helloMars': return helloMars; default: throw Exception(); } } }
-
作为函数参数传递:
String function(AppLocalizations l10n) { return l10n.helloMoon; }
-
使用箭头函数简化调用:
String function(AppLocalizations l10n) => l10n.helloMoon;
-
带参数的翻译调用:
final l10n = context.l10n; return Text(l10n.a(b));
-
直接在上下文中调用带参数的翻译:
return Text(context.l10n.a(b));
本地运行
如果你想在本地运行L10nization_cli,可以使用以下命令:
dart pub global activate --source=path . && l10nization check-unused example
运行测试并生成覆盖率报告 🧪
要运行所有单元测试并生成覆盖率报告,可以使用以下命令:
# 安装coverage工具
dart pub global activate coverage
# 运行测试并生成覆盖率数据
dart test --coverage=coverage
# 格式化覆盖率报告
dart pub global run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info
# 生成HTML格式的覆盖率报告
genhtml coverage/lcov.info -o coverage/
# 打开覆盖率报告
open coverage/index.html
构建版本
要构建项目并生成版本信息,可以使用以下命令:
dart run build_runner build -d
示例项目
以下是一个完整的示例项目,展示了如何使用L10nization_cli进行国际化管理。
1. 初始化项目
首先,创建一个新的Flutter项目:
flutter create my_app
cd my_app
2. 添加依赖
在 pubspec.yaml
文件中添加 l10nization_cli
和 flutter_localizations
依赖:
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
dev_dependencies:
l10nization_cli: ^latest_version
3. 配置国际化
在 lib
目录下创建 l10n
文件夹,并在其中创建 app_en.arb
文件,内容如下:
{
"hello": "Hello",
"helloMoon": "Hello Moon",
"helloMars": "Hello Mars"
}
然后在 lib
目录下创建 l10n.dart
文件,内容如下:
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(context.l10n.hello),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(context.l10n.helloMoon),
Text(context.l10n.helloMars),
],
),
),
);
}
}
4. 检查未使用的翻译
运行以下命令来查找未使用的翻译:
l10nization check-unused lib
更多关于Flutter国际化插件l10nization_cli的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter国际化插件l10nization_cli的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何使用Flutter国际化插件flutter_localizations
以及intl_translation
工具的代码案例,以及如何使用l10n
命令行工具(flutter pub pub run flutter_gen:generate
)来生成本地化的资源文件。
1. 设置项目依赖
首先,确保你的pubspec.yaml
文件中包含必要的依赖:
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
dev_dependencies:
build_runner: ^2.0.0
intl_translation: ^0.17.10+1 # 确保版本与Flutter兼容
2. 创建国际化资源文件
在你的Flutter项目根目录下,创建一个lib/l10n
文件夹,并在其中创建一个名为messages_all.dart
的文件。这个文件将作为所有语言文件的入口。
lib/l10n/messages_all.dart
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
// 这是一个自动生成的文件,不要手动编辑
// 这个文件包含所有支持的语言的翻译入口
class S {
S();
static S? of(BuildContext context) {
return Localizations.of<S>(context, S);
}
// 示例翻译字符串
String get helloWorld {
return Intl.message(
'Hello, World!',
name: 'helloWorld',
desc: 'Greeting message',
);
}
}
class SDelegate extends LocalizationsDelegate<S> {
const SDelegate();
@override
bool isSupported(Locale locale) {
// 检查是否支持该语言
return ['en', 'zh'].contains(locale.languageCode);
}
@override
Future<S> load(Locale locale) {
// 根据语言加载对应的翻译文件
return SynchronousFuture<S>(S());
}
@override
bool shouldReload(SDelegate oldDelegate) {
return false;
}
}
3. 创建ARB文件
在lib/l10n
文件夹中,为每个支持的语言创建一个ARB(Application Resource Bundle)文件。例如,为英语和中文创建以下文件:
lib/l10n/messages_en.arb
{
"@@locale": "en",
"helloWorld": "Hello, World!"
}
lib/l10n/messages_zh.arb
{
"@@locale": "zh",
"helloWorld": "你好,世界!"
}
4. 生成本地化文件
使用intl_translation
工具生成Dart代码。运行以下命令:
flutter pub get
flutter pub run intl_translation:extract_to_arb --output-dir=lib/l10n lib/l10n/messages_all.dart
这会读取messages_all.dart
中的Intl.message
调用,并生成ARB模板文件(如果它们尚不存在)。然后你需要手动填充这些ARB模板文件,如上所示。
接下来,使用flutter_gen
生成最终的本地化Dart文件:
flutter pub pub run flutter_gen:generate
注意:实际项目中可能使用flutter_gen
或其他生成器插件,这里假设使用flutter_gen
作为示例。如果使用的是其他生成器,请按照其文档操作。
5. 使用本地化资源
在你的应用程序的MaterialApp
中设置localizationsDelegates
和supportedLocales
:
import 'package:flutter/material.dart';
import 'l10n/messages_all.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
localizationsDelegates: [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
Locale('en', ''), // 英语
Locale('zh', ''), // 中文
],
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final S s = S.of(context)!;
return Scaffold(
appBar: AppBar(
title: Text(s.helloWorld),
),
body: Center(
child: Text(s.helloWorld),
),
);
}
}
现在,当你更改设备的语言设置时,应用将显示相应的本地化文本。