如果您希望在全球范围内使用您的应用程序,则对应用程序进行本地化是一项重要的要求。 Flutter
arb
文件对应用进行本地化的简单方法。
本文将说明如何在Flutter
本地化您的应用程序。
请注意,本文基于Flutter
2.0.1,因此,如果您使用的是旧版本,则本文中介绍的方法可能无法正常工作。
将依赖项添加到pubspec.yaml
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: ^0.16.1
这些软件包对于本地化是必需的。
generate
标志添加到pubspec.yamlflutter:
generate: true
此标志使Flutter
可以从本地化所需的arb
AppLocalizations
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
该文件提供了自动生成AppLocalizations
类时的配置。
arb-dir
arb
文件的目录。
template-arb-file
指定用作模板arb
output-localization-file
AppLocalizations
类文件的名称。
arb
文件在l10n.yaml中指定的目录中创建arb
arb
文件是json格式,您可以为每个键提供翻译。
凯被称为resource id
,值被称为resource value
。
例如,以下示例为resource id
helloWorld
提供了英语翻译。
{
"helloWorld": "Hello World!",
"@helloWorld": {
"description": "The conventional newborn programmer greeting"
}
}
您可以通过在resource id
添加@
前缀来提供对resource id
的详细说明。在上面的示例中, @helloWorld
resource id
helloWorld
的详细信息。
然后,您可以根据您的应用支持的语言arb
例如,如果您支持日语,则可以添加如下所示的app_ja.arb
{
"helloWorld": "こんにちは世界!"
}
arb
文件提供了各种有用的表达式,在这里我将介绍其中之一, placeholder
。
Placeholder
使您可以将参数传递给resource value
。
"pricePerMonth": "{price} per month",
"@pricePerMonth": {
"placeholders": {
"price": {
"example": "123.45",
"description": "price"
}
}
}
resource value
传递任何参数,例如{price}
。
@resource id
下的placeholders
编写参数的描述。
创建placeholder
并自动生成AppLocalizations
类后,您可以从您的应用中调用它,如下所示。
AppLocalizations.of(context).pricePerMonth(100.0);
AppLocalizations
类文件如果您调用flutter pub get
或构建您的应用程序,则将自动生成AppLocalizations
文件名在l10n.yaml中指定。
在这种情况下,文件将是.dart_tool/flutter_gen/gen_l10n/app_localizations.dart
。该目录由系统确定。
顺便说一句,您不需要将此文件提交到git。当您构建应用并反映最新的arb
文件内容时,始终会生成此文件。
设置localizationsDelegates
和supportedLocales
参数。
不要忘记导入AppLocalizations
类。
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates, // Add this line
supportedLocales: AppLocalizations.supportedLocales, // Add this line
home: // ...
);
}
您可以像下面的示例一样使用本地化的文本。
语法类似于AppLocalizations.of(context).<resource id>
。
Text(AppLocalizations.of(context).helloWorld);
您还可以显示本地化的日期,如下所示。
Locale locale = Localizations.localeOf(context);
DateFormat.yMd(locale.toString()).format(DateTime.now());