Flutter本地化管理插件simple_localization的使用
Flutter本地化管理插件simple_localization的使用
这个包简化了您的应用或包的国际化过程。
目录
介绍
这个包简化了您的应用或包的国际化过程。
如何安装
在pubspec.yaml
文件中添加依赖。
dependencies:
simple_localization: ^2.0.0
在源代码中导入包。
import 'package:simple_localization/simple_localization.dart';
如何实现
要开始国际化您的应用或包,创建一个继承自SimpleLocalizations
的类。
建议您声明一个包含消息名称的枚举。您可以使用任何类型,但使用枚举可以更容易地找到使用特定消息的地方。
以下是一个类的示例。
/// 包含将使用的消息名称的枚举
enum WidgetMessages { message1, message2 }
/// 国际化类。
class ExampleLocalizations extends SimpleLocalizations {
/// 声明`of`方法以获取当前语言的消息。
static ExampleLocalizations of(BuildContext context) {
return SimpleLocalizations.of<ExampleLocalizations>(context, (locale) => ExampleLocalizations(locale));
}
/// 标准构造函数。
ExampleLocalizations(Locale locale) : super(locale);
/// 在设备语言不在支持的语言列表中时使用的默认语言。
[@override](/user/override)
Locale get defaultLocale => Locale('en');
/// 支持的语言列表。
[@override](/user/override)
Iterable<Locale> get suportedLocales => [
Locale('en'),
Locale('es'),
Locale('pt'),
];
/// 用各自语言中的消息声明语言
[@override](/user/override)
Map<String, Map<dynamic, String>> get localizedValues => {
'en': {
WidgetMessages.message1: 'First message',
WidgetMessages.message2: 'Second message',
},
'es': {
WidgetMessages.message1: 'Primer mensaje',
WidgetMessages.message2: 'Segundo mensaje',
},
'pt': {
WidgetMessages.message1: 'Primeira mensagem',
WidgetMessages.message2: 'Segunda mensagem',
}
};
}
以下是如何根据当前语言获取消息的示例。
Text(ExampleLocalizations.of(context)[WidgetMessages.message1]);
在被国际化的应用或使用国际化包的应用中,必须在MaterialApp
的supportedLocales
属性中告知支持的语言,并且还需要在pubspec.yaml
中添加flutter_localizations
依赖。
以下是添加依赖的示例。
dependencies:
flutter_localizations:
sdk: flutter
以下是告知应用支持的语言的示例。
MaterialApp(
supportedLocales: [
Locale('en'),
Locale('es'),
Locale('pt')
],
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
)
国际化一个包
这些实现仅在您希望允许使用您包的应用修改消息时才需要。
要国际化您的包,首先需要创建国际化的类,如上所述,之后需要创建一个附加类,以便使用您包的应用可以修改默认消息。
以下是实现类的示例。
/// 默认情况下,此类的名称将是国际化类的名称与文本'Delegate'的组合,可以与具有国际化类实现的同一文件在同一文件中。
class ExampleLocalizationsDelegate extends SimpleLocalizationsDelegate<ExampleLocalizations> {
const ExampleLocalizationsDelegate() : super();
[@override](/user/override)
ExampleLocalizations initializeLocalization(Locale currentLocale) {
return ExampleLocalizations(currentLocale);
}
}
当发布您的包供其他应用修改国际化的消息时,应导出国际化类,例如本例中的ExampleLocalizations
和ExampleLocalizationsDelegate
类。
定制国际化包
在这个部分,您将看到如何使用simple_localization
包定制一个已经具有国际化的包。
在定制包的国际化之前,您需要向pubspec.yaml
添加flutter_localizations
依赖,如下面的示例所示。
dependencies:
flutter_localizations:
sdk: flutter
添加依赖后,在您的应用中创建一个包含必要的修改的类,该类应该继承包的标准国际化类。
class CustomExampleLocalizations extends ExampleLocalizations {
/// 获取操作符以在`MaterialApp`中获取要使用的委托
static CustomExampleLocalizationsDelegate get delegate => CustomExampleLocalizationsDelegate();
/// 标准构造函数
CustomLocalization(Locale locale) : super(locale);
/// 用将被修改的各自语言中的消息声明语言
[@override](/user/override)
Map<String, Map<dynamic, String>> get customValues => {
'en': {
WidgetMessages.message1: 'Custom first message',
WidgetMessages.message2: 'Custom second message',
},
'es': {
WidgetMessages.message1: 'Primer mensaje personalizado',
WidgetMessages.message2: 'Segundo mensaje personalizado',
},
'pt': {
WidgetMessages.message1: 'Primeira mensagem personalizada',
WidgetMessages.message2: 'Segunda mensagem personalizada',
}
};
}
class CustomExampleLocalizationsDelegate extends CustomExampleLocalizations {
const CustomExampleLocalizationsDelegate() : super();
[@override](/user/override)
ExampleLocalizations initializeLocalization(Locale currentLocale) {
return CustomExampleLocalizations(currentLocale);
}
}
创建了定制类后,您需要告知MaterialApp
它应该使用定制类进行国际化,见下面的例子。
MaterialApp(
localizationsDelegates: [
/// 告知默认的Flutter本地化
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
/// 告知定制的本地化
CustomExampleLocalizations.delegate,
],
)
示例代码
import 'dart:ui';
import 'package:simple_localization_example/localizations/example_localization.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter/material.dart';
class MainApp extends StatefulWidget {
const MainApp({Key? key}) : super(key: key);
[@override](/user/override)
State<StatefulWidget> createState() => _MainAppState();
}
class _MainAppState extends State<MainApp> {
Locale _locale = window.locale;
Locale get locale => _locale;
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
locale: _locale,
onGenerateTitle: (context) =>
ExampleLocalizations.of(context)[ExampleLocalizationsEnums.appBarTitle],
localizationsDelegates: const [
// ExampleLocalizationsDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: const [
Locale('en', ''),
Locale('es', ''),
Locale('pt', ''),
],
theme: ThemeData(
brightness: Brightness.dark,
primarySwatch: Colors.blue,
),
home: Builder(
builder: buildHome
),
);
}
Widget buildHome(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(ExampleLocalizations.of(context)[ExampleLocalizationsEnums.appBarTitle]),
centerTitle: true,
),
body: Padding(
padding: const EdgeInsets.all(20),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.only(bottom: 20),
child: Text(ExampleLocalizations.of(context)[ExampleLocalizationsEnums.bodyTitle], style: Theme.of(context).textTheme.headline3,),
),
Padding(
padding: const EdgeInsets.only(bottom: 20),
child: Text(ExampleLocalizations.of(context)[ExampleLocalizationsEnums.bodyDescription], style: Theme.of(context).textTheme.headline4, textAlign: TextAlign.center,),
),
ElevatedButton(
style: const ButtonStyle(
tapTargetSize: MaterialTapTargetSize.padded
),
child: Text(ExampleLocalizations.of(context)[ButtonsLocalizationsEnums.en]),
onPressed: () => changeLocale(const Locale('en')),
),
ElevatedButton(
style: const ButtonStyle(
tapTargetSize: MaterialTapTargetSize.padded
),
child: Text(ExampleLocalizations.of(context)[ButtonsLocalizationsEnums.es]),
onPressed: () => changeLocale(const Locale('es')),
),
ElevatedButton(
style: const ButtonStyle(
tapTargetSize: MaterialTapTargetSize.padded
),
child: Text(ExampleLocalizations.of(context)[ButtonsLocalizationsEnums.pt]),
onPressed: () => changeLocale(const Locale('pt')),
),
],
),
),
);
}
void changeLocale(Locale newLocale) {
setState(() {
_locale = newLocale;
});
}
}
void main() => runApp(const MainApp());
更多关于Flutter本地化管理插件simple_localization的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter本地化管理插件simple_localization的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用simple_localization
插件进行本地化管理的代码示例。这个插件允许你轻松地在Flutter应用中实现多语言支持。
第一步:添加依赖
首先,在你的pubspec.yaml
文件中添加simple_localization
的依赖:
dependencies:
flutter:
sdk: flutter
simple_localization: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
第二步:配置语言文件
在你的项目根目录下创建一个assets/locales
文件夹,并在其中创建不同的语言文件,例如en.json
和zh.json
。
assets/locales/en.json
{
"welcome_message": "Welcome",
"goodbye_message": "Goodbye"
}
assets/locales/zh.json
{
"welcome_message": "欢迎",
"goodbye_message": "再见"
}
第三步:配置pubspec.yaml
中的资源
在pubspec.yaml
中,将你的语言文件添加到flutter
部分下的assets
中:
flutter:
assets:
- assets/locales/en.json
- assets/locales/zh.json
第四步:初始化SimpleLocalization
在你的main.dart
文件中,初始化SimpleLocalization
。
import 'package:flutter/material.dart';
import 'package:simple_localization/simple_localization.dart';
void main() {
// 初始化语言配置
var supportedLocales = [
Locale('en', ''), // 英文
Locale('zh', ''), // 中文
];
var defaultLocale = Locale('en', ''); // 默认语言
var fallbackLocale = Locale('en', ''); // 备选语言
var localizationDelegate = SimpleLocalizationDelegate(
supportedLocales: supportedLocales,
defaultLocale: defaultLocale,
fallbackLocale: fallbackLocale,
pathToJson: 'assets/locales', // 语言文件路径
);
var localizationsDelegates = [
localizationDelegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
];
var localeResolutionCallback = (locale, supportedLocales) {
for (var supportedLocale in supportedLocales) {
if (supportedLocale.languageCode == locale?.languageCode ||
supportedLocale.countryCode == locale?.countryCode) {
return supportedLocale;
}
}
return defaultLocale;
};
runApp(
MaterialApp(
localizationsDelegates: localizationsDelegates,
localeResolutionCallback: localeResolutionCallback,
supportedLocales: supportedLocales,
locale: defaultLocale,
home: MyHomePage(),
),
);
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
final loc = SimpleLocalization.of(context);
return Scaffold(
appBar: AppBar(
title: Text(loc.translate('welcome_message')),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(loc.translate('welcome_message')),
ElevatedButton(
onPressed: () {
// 切换语言示例
SimpleLocalization.setLocale(Locale('zh', ''));
},
child: Text('Change to Chinese'),
),
Text(loc.translate('goodbye_message')),
],
),
),
);
}
}
第五步:运行应用
现在你可以运行你的Flutter应用,并在应用中看到本地化的文本。点击按钮可以切换语言,并看到相应的文本变化。
这个示例展示了如何使用simple_localization
插件进行基本的本地化配置和文本翻译。你可以根据需要扩展这个示例,添加更多的语言和支持更多的文本。