Flutter 手把手国际化
在Flutter中实现国际化,你需要遵循以下步骤:
- 创建国际化资源文件。
- 使用
intl
包生成消息文件。 - 配置
pubspec.yaml
以使用intl
包。 - 创建一个本地化代理类。
- 使用
Intl.message
函数定义消息。 - 使用
flutter_localizations
包。 - 使用
Localizations
和LocalizationsDelegate
。
以下是一个简化的例子:
首先,在pubspec.yaml
中添加依赖:
dependencies:
flutter:
sdk: flutter
intl: ^0.17.0
dev_dependencies:
flutter_test:
sdk: flutter
intl_translation: ^0.17.11
然后,创建一个intl_messages.arb
(以阿拉伯语为例):
// intl_messages.arb
{
"welcomeMessage": "أهلا بك"
}
生成Dart消息文件:
flutter pub run intl_translation:extract_to_arb --output-dir=lib/l10n lib/messages.dart
创建一个本地化代理类:
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
class MyLocalizations {
static final List<LocalizationsDelegate<dynamic>> localizationsDelegates = [
// 这里使用SynchronousDelegate是为了简化例子,实际应用中应该使用AsyncDelegate
SynchronousDelegate(MyLocalizations(_locale)),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
];
static final List<Locale> supportedLocales = [
const Locale('ar', 'AE'), // 阿拉伯联合酋长国
// ...其他支持的语言
];
final Locale locale;
MyLocalizations(this.locale);
static Future<MyLocalizations> load(Locale locale) {
final String name =
locale.countryCode.isEmpty ? locale.languageCode : locale.toString();
final String localeName = Intl.canonicalizedLocale(name);
return initializeMessages(localeName).then((b) {
Intl.defaultLocale = localeName;
return MyLocalizations(new Locale(localeName));
});
}
static MyLocalizations of(BuildContext context) {
return Localizations.of<MyLocalizations>(context, MyLocalizations);
}
String get welcomeMessage => Intl.message('Welcome', name: 'welcomeMessage');
// ...其他本地化字符串
}
在main.dart
中配置本地化:
import 'package:flutter/material.dart';
import 'package:my_app/l10n/my_localizations.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: MyLocalizations.localizationsDelegates,
supportedLocales: MyLocalizations.supportedLocales,
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: Ap
评论已关闭