你們好,好久不見,甚是想念,今天,咱們來學習如下如何使用國際化神器
Flutter i18n
,該神器爲一位叫Razvan Lung
的外國大佬開發的!完美解決Flutter
在開發應用時,字符串資源統一存放的問題,好的,咱們如今開始學習吧!git
如圖,先打開到上面的該神器爲
idea
的一款插件,名爲Flutter i18n
,你們能夠到開發工具的設置中找獲得。我這裏使用的是Android Studio
工具開發,idea
工具也是能夠找到的,vscode
就不知道了,哈哈。github
Plugins
這一欄,而後點擊插件列表下面的
Browe repositories
,而後在彈出的界面中輸入
Flutter i18n
。
而後點擊右邊的綠色按鈕
install
,下載安裝完以後會要求重啓開發工具,重啓就能夠了
若是你已經成功安裝插件,打開項目後,會發現自動添加如下兩個文件:json
lib/generated/i18n.dart
主要的國際化文件,主要使用的類爲S
res/values/string_en.arb
該文件主要適配英文語言,內容爲json
格式 到這裏咱們會出現疑惑,.arb
是什麼格式的文件,下面咱們來了解如下.arb
格式.arb
文件都包含一個JSON表,該表從資源ID映射到本地化值,文件名包含已爲其轉換值的語言環境,你能夠選中
res/values
點擊
右鍵-New-Arb File,在彈出的界面中選擇你要的語言環境
如圖上:
Language
一欄中拉到底部找到zh:Chinese
,在右邊能夠很明確的知道特定區域表示什麼
在使用該插件支持,咱們仍是要知道,該插件依賴插件包
flutter_localizations
,不然會出現某些地區支持會出錯app
在咱們的項目的pubspec.yaml
下添加flutter_localizations
less
....
dependencies:
flutter_localizations:
sdk: flutter
....
複製代碼
而後在命令行運行下Flutter packages get
回到咱們有MaterialApp
或者MaterialApp
或者CupertinoApp
的文件下,導入如下包,個人是main.dart
文件ide
import 'generated/i18n.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
複製代碼
我使用的是剛新建的Flutter
項目,添加下面的內容函數
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.red,
),
// new
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
supportedLocales: S.delegate.supportedLocales,
// new
home: MyHomePage(title: '本地化'),
);
}
}
複製代碼
來一個一個的解釋如下:工具
localizationsDelegates
本地化委託參數S.delegate
咱們項目的本地化委託類,這個你不用管,他會根據你的arb
文件自動生成對應的函數GlobalMaterialLocalizations.delegate
和GlobalWidgetsLocalizations.delegate
爲flutter_localizations
插件包提供的委託,若是你使用MaterialApp
這個部件的GlobalMaterialLocalizations.delegate
這個能夠不用supportedLocales
支持的本地化S.delegate.supportedLocales
咱們項目支持的本地化,這個你不用管,它會在你添加arb
文件時自動更新你的支持的本地化如今咱們能夠在.arb
文件下添加JSON內容了 string_en.arb
添加以下:學習
{
"appName":"Carpe Diem"
}
複製代碼
若是你想支持中文,能夠按上面的Ard
文件操做步驟進行建立 string_zn_CN.arb
內容以下:開發工具
{
"appName":"及時行樂"
}
複製代碼
支持香港 string_zn_HK.arb
內容以下:
{
"appName":"及時行樂"
}
複製代碼
使用資源,咱們只須要一行代碼
S.of(context).appName
複製代碼
why?這樣就能夠了?嗯,是的,插件會在你寫json
的時候會自動生成函數 S
類自動添加:
String get appName => "Carpe Diem";
複製代碼
$zh_CN
類自動添加
@override
String get appName => "及時行樂";
複製代碼
$zh_HK
類自動添加
@override
String get appName => "及時行樂";
複製代碼
{
"dialogTip":"Hello $name"
}
複製代碼
使用:
S.of(context).dialogTip("Rhyme");
複製代碼
zero
/one
/many
/other
{
"selectZero":"沒有了",
"selectOne":"一個",
"selectMany":"不少",
"selectOther":"其它"
}
複製代碼
使用:
S.of(context).select(0);//零個
S.of(context).select(1);//一個
S.of(context).select("many");//多個
S.of(context).select(null);//其它
複製代碼
$
符號 若是你要忽略該符號,請在前面加\
反斜槓不少時候,咱們須要像Android同樣,將光標放到字符串中,使用快捷鍵
alt+enter
對字符串進行快速提取,該插件也一樣適應
將編輯光標放在所要提取的字符串後,使用快捷鍵alt+enter
,能夠看到如圖所示:
Extract the string resource
,會出現以下界面:
String id
對應爲json
表中的key
String value
對應爲json
表中的value
Create the string for languages
爲須要添加到的語言文件,能夠多選點擊ok以後,就會自動替換
有時候,咱們須要指定一種語言,那麼咱們該怎麼操做呢,這裏直接上代碼
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: S.of(context).flutter_demo,
theme: ThemeData(
primarySwatch: Colors.red,
),
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
supportedLocales: S.delegate.supportedLocales,
// new
localeResolutionCallback:
S.delegate.resolution(fallback: const Locale('en', '')),
// new
home: MyHomePage(title: '本地化'),
);
}
}
複製代碼
或者
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: S.of(context).flutter_demo,
theme: ThemeData(
primarySwatch: Colors.red,
),
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
supportedLocales: S.delegate.supportedLocales,
// new
localeListResolutionCallback: S.delegate.listResolution(
fallback: const Locale('en', ''),),
// new
home: MyHomePage(title: '本地化'),
);
}
}
複製代碼
兩種方式也是一樣能夠的,設置以後就會忽略你當前設備的語言,直接指定爲英文語言環境!
若是你有切換語言的需求,能夠這樣實現
// new
ValueChanged<Locale> localeChange;
// new
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
// new
Locale _locale = const Locale('en', '');
@override
void initState() {
super.initState();
localeChange = (locale) {
setState(() {
_locale = locale;
});
};
}
// new
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
supportedLocales: S.delegate.supportedLocales,
// remove localeListResolutionCallback
// edit
home: Builder(
builder: (BuildContext context) {
return Localizations.override(
context: context,
locale: _locale,
child: MyHomePage(title: 'Flutter Demo Home Page'),
);
},
),
);
}
}
// edit
// 在其餘地方調用
localeChange(Locale('zh', ''));//zh爲中文
複製代碼
以上就是這篇文章的所有內容,閱讀完後就會發現,跟Android中的R文件有殊途同歸的效果!若是你學會了,但願能收到你的大禮包(****** 點亮紅心 ****** 關注 ****** 轉發 ******) 你的支持,是我創做和分享的動力!