Flutter项目默认是自动跟随系统语言的,iOS和Android需要单独配置
文末有demo,demo是用intl插件进行国际化,跟随系统语言,并且可以在应用内切换语言,下面是效果图:
iOS国际化项目配置
苹果的我以前写过,点击链接查看,如果只是通过flutter配置国际化,那只需要把Localizations里面添加需要支持的语言包即可,其他的就不用配置了。
Android国际化项目配置
添加依赖
flutter_localizations:
sdk: flutter
Pub get
两种方法,第一种是使用intl插件,第二种是使用JSON文件,先记录第一种,
安装插件(Android Studio)
如下图安装插件,重启IDE
初始化项目
Tools
-> Flutter Intl
-> Initialize for the Project
,如下图所示
配置语种
supportedLocales: S.delegate.supportedLocales,
添加对应的delegate
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
S.delegate
],
添加其他语言
默认只有英语,添加其他语言文件:Tools
->Flutter Intl
->Add Locale
,根据需要添加语言,我这里添加简体繁体中文zh_Hans
和zh_Hant
,如下图所示
编写国际化配置文件
分别在intl_en.arb
,intl_zh_Hans.arb
,intl_zh_Hant.arb
三个文件中编写英文,简体中文,繁体中文对应的key-value
使用多语言
S.of(context).key
换一下key即可
语言切换:
- 把
MyApp
改成StatefulWidget
- 给
MyApp
添加静态方法:static _MyAppState *of*(BuildContext context) => context.findAncestorStateOfType<_MyAppState>()!;
- 给
_MyAppState
添加属性locale
,添加set方法(赋值包裹setState),MaterialApp添加locale - 使用
MyApp.of(context).setLocale(Locale.fromSubtags(languageCode: ‘语言‘))
切换语言
使用第三方库shared_preferences
本地存储
- 添加依赖
shared_preferences: ^2.0.15
->Pub get
- 保存语言
final prefs = await SharedPreferences.*getInstance*();
prefs.setInt("language", index);
- 读取语言
SharedPreferences prefs = await SharedPreferences.*getInstance*();
int? languageIndex = prefs.get("language") as int?;
接下来记录的是json国际化(不推荐,可以直接跳到文章末尾看demo)
添加依赖是一样的
配置语种
supportedLocales:[
const Locale.fromSubtags(languageCode: "zh", scriptCode: "Hans"),
const Locale.fromSubtags(languageCode: "zh", scriptCode: "Hant"),
const Locale.fromSubtags(languageCode: "en"),
]
添加对应的delegate
localizationsDelegates:[
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
//上面三个是系统的,这里还要加上一个自己创建的类
GCLocalizationsDelegate.*delegate*
]
创建文件(文件名随意)
-
localizations.dart
文件(操作国际化的类) -
i18n.json
文件 (国际化配置文件)
添加i18n.json
依赖,并Pub get
Json文件和上面的arb
文件一样编写key-value
localizations.dart
文件除了下面的代码,还要自己实现json文件中get的方法
class GCLocalizations {
GCLocalizations(this._locale);
final Locale _locale;
static GCLocalizations of(BuildContext context){
return Localizations.of(context, GCLocalizations);
}
static Map> _localizeValues = {};
Future loadJson() async {
//1.加载json文件
final jsonFile = await rootBundle.loadString("assets/json/i18n.json");
//2.解析json文件
Mapmap = json.decode(jsonFile);
_localizeValues = map.map((key, value) => MapEntry(key, value.cast()));
}
class GCLocalizationsDelegate extends LocalizationsDelegate {
static GCLocalizationsDelegate delegate = GCLocalizationsDelegate();
@override
bool isSupported(Locale locale) {
return ["en", "zh"].contains(locale.languageCode);
}
@override
bool shouldReload(covariant LocalizationsDelegate old) {
return false;
}
@override
Future load(Locale locale) async{
final localizations = GCLocalizations(locale);
await localizations.loadJson();
return localizations;
}
}
Demo自取,欢迎Star.
最后是国际化的官方文档(官网文档里没有应用内切换语言的说明๑_๑)