Flutter本地化映射生成插件localization_mapper_generator的使用
Flutter本地化映射生成插件localization_mapper_generator的使用
localization_mapper_generator
是一个用于生成应用程序本地化映射的 Dart 包,它可以解析动态翻译键(因为 flutter_localizations
包目前还不支持这一点)。
注意:在使用此包之前,请先使用 flutter_localizations
包设置本地化。
开始使用
首先,安装所需的依赖项:
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
localization_mapper_annotation: <最新版本>
dev_dependencies:
build_runner: ^2.3.3
localization_mapper_generator: <最新版本>
接下来,定义一些 shell 脚本。这些脚本将向生成的 app-localization
文件中添加所需的导入,并注解为 LocalizationMapperAnnotation
,最后生成一个包含 app-localization
翻译键的部分文件(映射和扩展)。
replace_string.sh
#!/bin/bash
# 检查是否提供了足够的参数
if [ $# -lt 3 ]; then
echo "错误:提供的参数不足。"
echo "用法: $0 <输入文件> <搜索模式> <替换字符串>"
exit 1
fi
# 将输入参数分配给变量
input_file=$1
search_pattern=$2
replacement_string=$3
# 检查输入文件是否存在
if [ ! -f $input_file ]; then
echo "错误:输入文件不存在。"
exit 1
fi
# 备份原始文件
cp $input_file "$input_file.bak"
# 执行搜索和替换并将结果写入新文件
sed "s/$search_pattern/$replacement_string/i" $input_file > "$input_file.tmp"
# 检查替换是否成功
if [ $? -ne 0 ]; then
echo "错误:替换失败。"
exit 1
fi
# 用新文件覆盖原始文件
mv "$input_file.tmp" "$input_file"
echo "替换完成。"
generate_localization.sh
#!/bin/bash
# 授予 replace_string.sh 可执行权限
chmod +x ./replace_string.sh
# 生成本地化
(cd ../ && flutter gen-l10n)
# 映射生成器配置选项:
# 可以通过解析 `@LocalizationMapperAnnotation` 注解中的所需参数来选择要生成的本地化扩展方法。
#
# @LocalizationMapperAnnotation(mapperExtension: MapperExtension(l10n: true, locale: true, l10nParser: true))
filePath="../lib/localization/gen-l10n/app_localizations.dart"
searchParameter="abstract class AppLocalizations {"
requiredImports=$(cat <<EOM
import 'package:localization_mapper_annotation/localization_mapper_annotation.dart';
part 'app_localizations.g.dart';
@LocalizationMapperAnnotation()
abstract class AppLocalizations {
EOM
)
# 向 app_localization.dart 文件添加所需的导入和注解
echo "\n正在向生成的 app_localizations 添加所需的导入"
bash ./replace_string.sh "$filePath" "$searchParameter" "$requiredImports"
echo "\n正在生成 app_localizations 的映射文件"
(cd ../ && flutter pub run build_runner build --delete-conflicting-outputs)
帮助扩展
为了动态访问翻译并解析占位符参数,会生成一个 app-localizations.dart
文件的部分文件,该文件包含一个构建上下文上的访问扩展和一个映射器。
// ../app-localizations.g.dart
// 自动生成的代码 - 请勿手动修改
part of 'app_localizations.dart';
// ***************************************************************************
// LocalizationMapperGenerator
//***************************************************************************
extension AppLocalizationsExtension on BuildContext {
AppLocalizations get l10n => AppLocalizations.of(this)!;
Locale get locale => Localizations.localeOf(this);
String l10nParser(String translationKey, {List<Object>? arguments}) {
const mapper = AppLocalizationsMapper();
final object = mapper.toLocalizationMap(this)[translationKey];
if (object is String) return object;
assert(arguments != null, '参数不应为空!');
assert(arguments!.isNotEmpty, '参数不应为空!');
return Function.apply(object, arguments);
}
}
class AppLocalizationsMapper {
const AppLocalizationsMapper();
Map<String, dynamic> toLocalizationMap(BuildContext context) {
return {
'localeName': AppLocalizations.of(context)!.localeName,
'application_name': AppLocalizations.of(context)!.application_name,
'deposit_timeframe': AppLocalizations.of(context)!.deposit_timeframe,
'balance_reverted': (currency) => AppLocalizations.of(context)!.balance_reverted(currency),
'convert_before_withdraw': (convertFrom, convertTo) => AppLocalizations.of(context)!.convert_before_withdraw(convertFrom, convertTo),
'convert_before_withdraw_again': (convertFrom, convertTo) => AppLocalizations.of(context)!.convert_before_withdraw_again(convertFrom, convertTo),
};
}
}
配置生成器
可以通过 LocalizationMapperAnnotation
解析配置来指定要生成的扩展方法。当您的应用程序已经定义了相关的扩展方法时,这是理想的,因为它可以禁用这些已定义的扩展方法的生成。以下是可用的配置选项:
@LocalizationMapperAnnotation(mapperExtension: MapperExtension(l10n: true, locale: true, l10nParser: true))
这是默认配置,但可以通过修改 generate_localization.sh
脚本中的默认注解 @LocalizationMapperAnnotation()
来更新和解析 requiredImports
参数对象。
示例用法
注意:参数作为位置参数传递,应与 arb
文件中指定的顺序相同。
final applicationName = context.l10nParser('application_name'); // 使用本地化映射器
final depositTimeFrame = context.l10nParser('deposit_timeframe'); // 立即
// 解析占位符参数
final convertBeforeWithdraw = context.l10nParser('convert_before_withdraw', arguments: ['CAD', 'EUR']); // * 在您提取 CAD 之前,您需要将其转换回 EUR
更多关于Flutter本地化映射生成插件localization_mapper_generator的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter本地化映射生成插件localization_mapper_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
localization_mapper_generator
是一个用于 Flutter 的代码生成插件,旨在简化本地化(国际化)的实现。它通过生成映射代码来帮助开发者管理和使用本地化字符串,从而减少手动编写和维护本地化代码的工作量。
以下是使用 localization_mapper_generator
的基本步骤:
1. 添加依赖
在你的 pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
localization_mapper: ^latest_version
dev_dependencies:
build_runner: ^latest_version
localization_mapper_generator: ^latest_version
运行 flutter pub get
安装依赖。
2. 创建本地化文件
在项目中创建一个文件夹(例如 lib/l10n
),并在其中添加本地化文件。文件格式可以是 .json
或 .yaml
,例如:
lib/l10n/en.json
{
"hello": "Hello",
"welcome": "Welcome, {name}!"
}
lib/l10n/es.json
{
"hello": "Hola",
"welcome": "Bienvenido, {name}!"
}
3. 创建映射类
在 lib
目录下创建一个 Dart 文件(例如 lib/app_localizations.dart
),并定义映射类:
import 'package:localization_mapper/localization_mapper.dart';
part 'app_localizations.g.dart';
@LocalizationMapper(
path: 'lib/l10n',
defaultLocale: 'en',
supportedLocales: ['en', 'es'],
)
class AppLocalizations extends _$AppLocalizations {}
path
:本地化文件的路径。defaultLocale
:默认语言。supportedLocales
:支持的语言列表。
4. 生成代码
运行以下命令生成映射代码:
flutter pub run build_runner build
这将生成一个 app_localizations.g.dart
文件,其中包含所有本地化字符串的映射。
5. 使用本地化字符串
在 Flutter 应用中使用生成的本地化字符串:
import 'package:flutter/material.dart';
import '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) {
final l10n = AppLocalizations.of(context);
return Scaffold(
appBar: AppBar(
title: Text(l10n.hello),
),
body: Center(
child: Text(l10n.welcome(name: 'Flutter')),
),
);
}
}
6. 动态切换语言
要动态切换语言,可以使用 MaterialApp
的 locale
参数:
locale: Locale('es'), // 切换到西班牙语