Flutter国际化插件l10n_flutter的使用
Flutter国际化插件l10n_flutter的使用
介绍
l10n_flutter
是一个用于Flutter应用国际化的框架,它可以帮助你轻松地为你的应用添加多语言支持。通过这个插件,你可以重新组织和重命名键值而不会破坏应用的功能。当你运行生成器时,它会自动生成所有支持的语言环境的输出文件。
编译和测试
首先,克隆 l10n_flutter
的仓库并运行示例代码:
git clone https://github.com/dgofman/l10n_flutter.git
cd l10n_flutter
flutter create --org l10n_flutter -i objc -a java -t app .
flutter run -d chrome -t lib/examples/l10n_demo3_app.dart
入门指南
-
创建一个新的Flutter项目:
flutter create myapp cd myapp
-
在
pubspec.yaml
中添加依赖:dependencies: flutter: sdk: flutter # 添加 l10n_flutter 依赖 l10n_flutter: ^1.0.0
-
创建一个语言模型文件(例如
models/app_ln10.dart
):import 'package:l10n_flutter/l10n_core.dart'; // 支持的语言环境 const AppL10nSettings = L10nSettings(locales: [ L10nLocale('en', 'US', 'English (US)'), L10nLocale('en', 'GB', 'English (United Kingdom)'), ]); [@AppL10nSettings](/user/AppL10nSettings) class AppL10n { static const truck = L10nSet('app_truck', 'Truck'); // "app_truck" 是语言文件中的键 }
-
替换
lib/main.dart
中的代码:import 'package:flutter/material.dart'; import 'package:l10n_flutter/l10n_material_app.dart'; import './models/app_ln10.dart'; void main() => runApp(L10nMaterialApp( locale: const Locale('en', 'GB'), // 设置默认语言环境 supportedLocales: AppL10nSettings.supportedLocales, // 提供支持的语言环境列表 builder: (BuildContext context, Widget? child) => Scaffold(body: Text(AppL10n.truck.$)) // 或者 AppL10n.truck.toString() ));
-
注意:此时应用会显示默认值,因为还没有加载语言文件,可能会出现以下错误:
L10nLoader Error: Unable to load asset: l10n/en_GB.json
生成资源文件
-
创建
build.yaml
文件:builders: l10n_builder: import: "package:l10n_flutter/builder/builder.dart" builder_factories: ["l10nBuilderFactory"] build_extensions: {".dart": [".json"]} build_to: source targets: $default: builders: 'l10n_flutter|l10n_builder': enabled: true generate_for: # 指定目录 - lib/models/app_ln10.dart
-
在
pubspec.yaml
中添加语言文件路径:flutter: # 添加资源文件 assets: - assets/l10n/
-
在
dev_dependencies
中添加build_runner
:dev_dependencies: flutter_test: sdk: flutter build_runner: ^2.1.7
-
生成文件:
flutter pub run build_runner build --delete-conflicting-outputs
-
更新
assets/l10n/en_GB.json
文件内容:{ "app_truck": "Lorry" }
示例代码
以下是一个完整的示例代码,展示了如何使用 l10n_flutter
插件来实现动态切换语言功能:
import 'package:flutter/cupertino.dart';
import 'package:l10n_flutter/l10n_material_app.dart';
import 'models/l10n.dart';
import 'l10n_widget_helper.dart';
class MaterialAppDemo extends StatefulWidget {
const MaterialAppDemo({Key? key}) : super(key: key);
[@override](/user/override)
_MaterialAppDemoState createState() => _MaterialAppDemoState();
}
class _MaterialAppDemoState extends State<MaterialAppDemo> {
Locale? _locale = const Locale('he', 'IL');
void changeLocale(Locale? newLocale) async {
await l10nSettings.selectLocale(newLocale);
setState(() {
_locale = newLocale;
});
}
[@override](/user/override)
void initState() {
changeLocale(_locale);
super.initState();
}
[@override](/user/override)
Widget build(BuildContext context) {
return L10nMaterialApp(
locale: _locale, // 动态语言环境
supportedLocales: l10nSettings.supportedLocales, // 提供支持的语言环境列表
home: WidgetHelper.createMaterialScaffold(context, l10nSettings.indexOf(_locale), changeLocale),
);
}
}
void main() => runApp(const MaterialAppDemo());
更多关于Flutter国际化插件l10n_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter国际化插件l10n_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter应用中使用flutter_localizations
和intl
包来实现国际化的代码案例。这个案例将展示如何设置应用以支持多种语言,并在UI中显示相应的翻译文本。
1. 添加依赖
首先,在pubspec.yaml
文件中添加flutter_localizations
和intl
包的依赖:
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: ^0.17.0 # 请根据需要检查最新版本
2. 创建arb文件
在项目的lib/l10n
目录下创建语言文件。例如,创建messages_en.arb
和messages_zh.arb
文件:
messages_en.arb
{
"welcome_message": "Welcome to our app!",
"goodbye_message": "Goodbye!"
}
messages_zh.arb
{
"welcome_message": "欢迎来到我们的应用!",
"goodbye_message": "再见!"
}
3. 生成本地化文件
使用Flutter的工具生成本地化文件。在命令行中运行以下命令:
flutter pub run flutter_gen_localization --arb-dir=lib/l10n --template-arb-file=lib/l10n/messages_en.arb --output-dir=lib/generated_localizations --dart-output-localization-file=app_localizations.dart
这将生成一个app_localizations.dart
文件在lib/generated_localizations
目录下。
4. 更新Main文件
在lib/main.dart
文件中设置MaterialApp以支持本地化:
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'generated_localizations/app_localizations.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: [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: AppLocalizations.supportedLocales,
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
AppLocalizations localizations;
@override
Widget build(BuildContext context) {
localizations = AppLocalizations.of(context);
return Scaffold(
appBar: AppBar(
title: Text(localizations.welcomeMessage),
),
body: Center(
child: ElevatedButton(
onPressed: () {
// 模拟切换语言逻辑,这里仅为示例
// 实际应用中,你可能需要通过设置或用户选择来更改Locale
// 例如使用:setLocale(Locale('zh'));
},
child: Text(localizations.goodbyeMessage),
),
),
);
}
}
5. 运行应用
确保你的设备或模拟器支持所添加的语言。例如,如果你的设备语言是中文,应用将自动显示中文翻译。
注意
- 在实际应用中,你可能需要实现一个语言选择器来动态更改应用的Locale。这可以通过监听用户的语言选择,然后使用
Localizations.override
来更改当前的Locale。 flutter_gen_localization
是一个第三方工具,用于简化ARB文件的生成过程。你也可以手动使用intl_translation
工具生成这些文件,但flutter_gen_localization
提供了更简便的集成方式。
通过上述步骤,你的Flutter应用应该已经支持国际化,并能够在UI中显示不同语言的翻译文本。