Flutter国际化插件fluintl的使用
Flutter国际化插件fluintl的使用
使用方式:
- 创建多语言资源字符串id管理类Ids 和 多语言资源Map
/// 多语言资源id管理类.
class Ids {
static String titleHome = 'title_home';
static String titleSetting = 'title_setting';
static String click_times = 'click_times';
}
/// 简单多语言资源.
Map<String, Map<String, String>> localizedSimpleValues = {
'en': {
Ids.titleHome: 'Home',
Ids.titleSetting: 'Setting',
Ids.click_times: '%\$0\$s click on %\$1\$s times',
},
'zh': {
Ids.titleHome: '主页',
Ids.titleSetting: '设置',
Ids.click_times: '%\$0\$s点击了%\$1\$s次',
},
};
/// 多语言资源.
Map<String, Map<String, Map<String, String>>> localizedValues = {
'en': {
'US': {
Ids.titleHome: 'Home',
Ids.titleSetting: 'Setting',
Ids.click_times: '%\$0\$s click on %\$1\$s times',
}
},
'zh': {
'CN': {
Ids.titleHome: '主页',
Ids.titleSetting: '设置',
Ids.click_times: '%\$0\$s点击了%\$1\$s次',
},
'HK': {
Ids.titleHome: '主頁',
Ids.titleSetting: '設置',
Ids.click_times: '%\$0\$s点击了%\$1\$s次',
},
'TW': {
Ids.titleHome: '主頁',
Ids.titleSetting: '設置',
Ids.click_times: '%\$0\$s点击了%\$1\$s次',
}
}
};
- 在MyApp initState配置多语言资源(可配置通用或简单多语言资源,二选一)
void initState() {
super.initState();
// setLocalizedSimpleValues(localizedSimpleValues); // 配置简单多语言资源
setLocalizedValues(localizeddValues); // 配置多语言资源
}
- 在MaterialApp指定localizationsDelegates和supportedLocales:
MaterialApp(
home: MyHomePage(),
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
CustomLocalizations.delegate // 设置本地化代理
],
supportedLocales: CustomLocalizations.supportedLocales, // 设置支持本地化语言集合
);
- 字符串获取
IntlUtil.getString(context, Ids.titleHome);
IntlUtil.getString(context, Ids.titleHome, params: ['param1', 'param2']);
CustomLocalizations.of(context).getString(Ids.titleHome)
- 其他(不推荐使用)
// 在主页初始化.
class _MyHomePageState extends State<MyHomePage> {
Widget build(BuildContext context) {
CustomLocalizations.init(context);
...
}
// 字符串获取
CustomLocalizations.instance.getString(Ids.titleHome)
}
- 应用国际化详细使用请参考 flutter_wanandroid App。
Q:Flutter国际化系统切换iOS不生效问题?
A:在Xcode项目Localizations下添加支持语言即可,原文
添加依赖
dependencies:
flutter_localizations:
sdk: flutter
fluintllt: x.x.x # 最新版本
API
setLocalizedSimpleValues(values) : 配置简单多语言资源.
setLocalizedValues(values) : 配置多语言资源.
CustomLocalizations.delegate : 自定义本地化代理.
CustomLocalizations.supportedLocales : 本地支持的语言环境.
CustomLocalizations.of(context) : 获取CustomLocalizations.
getString(id, {languageCode, countryCode, params}) : 通过id获取字符串, 可指定languageCode,countryCode.
IntlUtil.getString(context, id, params) : 通过id获取字符串, 可指定languageCode,countryCode.
// 不推荐使用
CustomLocalizations.init(context) : 自定义本地化代理初始化.(在MyHomePage初始化)
LBaseState (extends or with LBaseState) : 可方便简洁获取字符串
cl.getString(id).(MyHomePage不能使用)
更多关于Flutter国际化插件fluintl的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter国际化插件fluintl的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用fluintl
插件来实现国际化的代码示例。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加fluintl
依赖:
dependencies:
flutter:
sdk: flutter
fluintl: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
2. 创建语言文件
在你的项目根目录下创建一个assets/locales
文件夹,并在其中创建不同语言的JSON文件。例如:
en.json
(英语)zh.json
(中文)
en.json
的内容可能如下:
{
"welcome_message": "Welcome to our app!",
"goodbye_message": "Goodbye!"
}
zh.json
的内容可能如下:
{
"welcome_message": "欢迎来到我们的应用!",
"goodbye_message": "再见!"
}
3. 配置pubspec.yaml
以包含语言文件
在pubspec.yaml
中添加语言文件到assets中:
flutter:
assets:
- assets/locales/en.json
- assets/locales/zh.json
4. 初始化Flutter Intl
在你的main.dart
文件中初始化Fluintl
:
import 'package:flutter/material.dart';
import 'package:fluintl/fluintl.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Intl Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
localizationsDelegates: [
FluintlDelegate(
fallbackLocale: Locale('en', 'US'), // 默认语言
useCountryCode: true,
),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
Locale('en', 'US'),
Locale('zh', 'CN'),
],
locale: Locale('en', 'US'), // 初始语言
home: MyHomePage(),
);
}
}
5. 使用国际化字符串
在你的MyHomePage
或其他页面中,使用Fluintl
来获取国际化字符串:
import 'package:flutter/material.dart';
import 'package:fluintl/fluintl.dart';
import 'package:flutter_intl/flutter_intl.dart'; // 注意:这个导入是为了示例,实际使用fluintl不需要
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
final Fluintl fluintl = Fluintl.of(context);
return Scaffold(
appBar: AppBar(
title: Text(fluintl.translate('welcome_message')),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(fluintl.translate('welcome_message')),
ElevatedButton(
onPressed: () {
// 切换语言示例
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ChangeLanguagePage(),
),
);
},
child: Text(fluintl.translate('goodbye_message')),
),
],
),
),
);
}
}
class ChangeLanguagePage extends StatefulWidget {
@override
_ChangeLanguagePageState createState() => _ChangeLanguagePageState();
}
class _ChangeLanguagePageState extends State<ChangeLanguagePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Change Language'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () {
setLocale(context, Locale('en', 'US'));
},
child: Text('English'),
),
ElevatedButton(
onPressed: () {
setLocale(context, Locale('zh', 'CN'));
},
child: Text('中文'),
),
],
),
),
);
}
void setLocale(BuildContext context, Locale newLocale) {
_MyAppState? myAppState =
ModalRoute.of(context)!.settings.arguments as _MyAppState?;
myAppState?.setLocale(newLocale);
Navigator.pop(context);
}
}
class _MyAppState extends State<MyApp> {
void setLocale(Locale locale) {
setState(() {
Locale myLocale = locale;
print("Locale set to: ${myLocale.languageCode}_${myLocale.countryCode}");
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
locale: Locale('en', 'US'), // 初始语言,这里会被setLocale方法更新
localizationsDelegates: [
FluintlDelegate(
fallbackLocale: Locale('en', 'US'),
useCountryCode: true,
),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
Locale('en', 'US'),
Locale('zh', 'CN'),
],
home: MyHomePage(),
);
}
}
注意:在上面的ChangeLanguagePage
示例中,_MyAppState
的使用是为了演示如何切换语言,但在实际项目中,你可能需要更优雅地管理语言切换,例如使用Provider或Riverpod等状态管理库。
这个例子展示了如何在Flutter应用中使用fluintl
插件来实现基本的国际化功能。根据你的具体需求,你可能需要进一步定制和扩展这个示例。