國(guó)際化命令:flutter --no-color pub global run intl_utils:generate
Flutter 國(guó)際化步驟
一:使用flutter intl
進(jìn)行國(guó)際化
1:下載 flutter intl
插件
2:在Android Studio中打開(kāi)項(xiàng)目,在Tools -> flutter intl -> initiazlize for the project
此時(shí)pubspec.yaml
底部會(huì)多出內(nèi)容:
flutter_intl:
enabled: true
3:添加中文
在Tools -> flutter intl -> add Locale
中呜笑,輸入 zh
4. 按照網(wǎng)上寫法按部就班的進(jìn)行瞬雹。
二:官方指導(dǎo)方式國(guó)際化- Flutter 中的本地化介紹
默認(rèn)情況下粗井,F(xiàn)lutter 僅提供美國(guó)英語(yǔ)本地化。要添加對(duì)其他語(yǔ)言的支持义锥,應(yīng)用程序必須指定附加MaterialApp(或CupertinoApp)屬性,并包含一個(gè)名為 flutter_localizations. 截至 2020 年 11 月,該軟件包支持 78 種語(yǔ)言姆坚。
1. 設(shè)置一個(gè)國(guó)際化的應(yīng)用程序:Flutter _localizations 包
- 要使用 flutter_localizations,請(qǐng)將包作為依賴項(xiàng)添加到您的pubspec.yaml文件中:
dependencies:
flutter:
sdk: flutter
flutter_localizations: # Add this line
sdk: flutter # Add this line
- 接下來(lái)实愚,運(yùn)行pub get packages兼呵,然后導(dǎo)入flutter_localizations庫(kù),并指定 localizationsDelegates和supportedLocales為MaterialApp:
import 'package:flutter_localizations/flutter_localizations.dart';
2. 添加您自己的本地化消息
-
一旦flutter_localizations包被添加腊敲,使用下面的說(shuō)明本地化的文本添加到您的應(yīng)用程序击喂。
- 將intl包添加到pubspec.yaml文件中:
dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter intl: ^0.17.0 # Add this line
- 此外,在pubspec.yaml文件中碰辅,啟用generate 標(biāo)志懂昂。這被添加到特定于 Flutter 的 pubspec 部分,并且通常出現(xiàn)在 pubspec 文件中没宾。
# The following section is specific to Flutter. flutter: generate: true # Add this line
- 在 Flutter 項(xiàng)目的根目錄添加一個(gè)新的 yaml 文件凌彬,調(diào)用l10n.yaml內(nèi)容如下
arb-dir: lib/l10n template-arb-file: app_en.arb output-localization-file: app_localizations.dart
- 該文件配置本地化工具;在此示例中循衰,輸入文件位于中
${FLUTTER_PROJECT}/lib/l10n
铲敛,app_en.arb
文件提供模板,生成的本地化放置在app_localizations.dart
文件中羹蚣。
{ "helloWorld": "Hello World!", "@helloWorld": { "description": "The conventional newborn programmer greeting" } }
- 接下來(lái)原探,在同一目錄中添加一個(gè)app_zh.arb文件,用于同一消息的中文翻譯:
{ "helloWorld": "你好世界顽素!" }
- 現(xiàn)在咽弦,運(yùn)行您的應(yīng)用程序,以便進(jìn)行代碼生成胁出。您應(yīng)該會(huì)在
${FLUTTER_PROJECT}/.dart_tool/flutter_gen/gen_l10n
. - 添加的import語(yǔ)句
app_localizations.dart
型型,并AppLocalizations.delegate
在調(diào)用的構(gòu)造MaterialApp。
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
如果導(dǎo)入的時(shí)候全蝶,沒(méi)找到路徑闹蒜,
import
的時(shí)候沒(méi)有提示寺枉,但是在.dart_tool
里面已經(jīng)看到該文件夾和路徑了,此時(shí)可以關(guān)閉Android Studio
,重新打開(kāi)绷落,即可有提示了姥闪。- 在您的應(yīng)用程序中的任何位置使用
AppLocalizations
。此處砌烁,翻譯后的消息用于文本小部件筐喳。
Text(AppLocalizations.of(context)!.helloWorld);
- 您還可以使用生成的localizationsDelegates和supportedLocales列表,而不是手動(dòng)提供它們函喉。
const MaterialApp( title: 'Localizations Sample App', localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, );
注意:
如果需要繼續(xù)增加別的國(guó)際語(yǔ)言避归,只需要重復(fù)第5步即可,在同一目錄中添加一個(gè)app_es.arb
文件管呵,運(yùn)行項(xiàng)目梳毙,即可自動(dòng)在.dart_tool/flutter_gen/gen_l10n
目錄中新增相應(yīng)的文件,然后修改app_es.arb
文件后捐下,重新運(yùn)行即可账锹,app_localizations_es.dart
文件會(huì)自動(dòng)更新,如果在app_es.arb
中找不到app_en.arb
對(duì)應(yīng)的值蔑担,會(huì)直接用app_en.arb
中給出的值為默認(rèn)值
iOS 本地化:更新 iOS 應(yīng)用程序包
iOS 應(yīng)用程序在內(nèi)Info.plist置于應(yīng)用程序包的文件中定義關(guān)鍵應(yīng)用程序元數(shù)據(jù)牌废,包括支持的區(qū)域設(shè)置咽白。要配置您的應(yīng)用程序支持的語(yǔ)言環(huán)境啤握,請(qǐng)使用以下說(shuō)明:
打開(kāi)項(xiàng)目的
ios/Runner.xcworkspace
Xcode 文件。在Project Navigator 中晶框,打開(kāi)項(xiàng)目文件夾
Runner
下的Runner
文件夾下的Info.plist
文件排抬。選擇Information Property List 項(xiàng)。然后從Editor 菜單中選擇Add Item授段,并從彈出菜單中選擇Localizations蹲蒲。
選擇并展開(kāi)新創(chuàng)建的
Localizations
項(xiàng)目。對(duì)于您的應(yīng)用程序支持的每個(gè)區(qū)域設(shè)置侵贵,添加一個(gè)新項(xiàng)目并從值字段的彈出菜單中選擇您希望添加的區(qū)域設(shè)置届搁。此列表應(yīng)與supportedLocales參數(shù)中列出的語(yǔ)言一致。添加所有支持的語(yǔ)言環(huán)境后窍育,保存文件卡睦。
高級(jí)語(yǔ)言環(huán)境定義
一些具有多種變體的語(yǔ)言需要的不僅僅是語(yǔ)言代碼才能正確區(qū)分。
例如漱抓,完全區(qū)分中文的所有變體需要指定語(yǔ)言代碼表锻、腳本代碼和國(guó)家代碼。這是由于簡(jiǎn)繁體文字的存在乞娄,以及在同一文字類型中書(shū)寫字符的方式存在地區(qū)差異瞬逊。
為了充分表達(dá)國(guó)家代碼CN显歧、TW和HK的每個(gè)中文變體,支持的語(yǔ)言環(huán)境列表應(yīng)包括:
supportedLocales: [
Locale.fromSubtags(languageCode: 'zh'), // generic Chinese 'zh'
Locale.fromSubtags(
languageCode: 'zh',
scriptCode: 'Hans'), // generic simplified Chinese 'zh_Hans'
Locale.fromSubtags(
languageCode: 'zh',
scriptCode: 'Hant'), // generic traditional Chinese 'zh_Hant'
Locale.fromSubtags(
languageCode: 'zh',
scriptCode: 'Hans',
countryCode: 'CN'), // 'zh_Hans_CN'
Locale.fromSubtags(
languageCode: 'zh',
scriptCode: 'Hant',
countryCode: 'TW'), // 'zh_Hant_TW'
Locale.fromSubtags(
languageCode: 'zh',
scriptCode: 'Hant',
countryCode: 'HK'), // 'zh_Hant_HK'
],
這種明確的完整定義可確保您的應(yīng)用程序能夠區(qū)分這些國(guó)家/地區(qū)代碼的所有組合确镊,并為這些國(guó)家/地區(qū)代碼的所有組合提供完全細(xì)致入微的本地化內(nèi)容士骤。如果未指定用戶的首選語(yǔ)言環(huán)境,則使用最接近的匹配項(xiàng)蕾域,這可能包含與用戶期望的差異敦间。Flutter 僅解析為supportedLocales
. Flutter 為常用語(yǔ)言提供了 scriptCode 差異化的本地化內(nèi)容。有關(guān)Localizations
如何解析支持的語(yǔ)言環(huán)境和首選語(yǔ)言環(huán)境的信息束铭,請(qǐng)參閱廓块。
盡管中文是主要示例,但其他語(yǔ)言(如法語(yǔ) ( fr_FR
, fr_CA
) )也應(yīng)完全區(qū)分契沫,以實(shí)現(xiàn)更細(xì)微的本地化
跟蹤語(yǔ)言環(huán)境:Locale 類和 Localizations 小部件
本Locale
類標(biāo)識(shí)用戶的語(yǔ)言带猴。移動(dòng)設(shè)備支持為所有應(yīng)用程序設(shè)置區(qū)域設(shè)置,通常使用系統(tǒng)設(shè)置菜單懈万。國(guó)際化應(yīng)用程序通過(guò)顯示特定于區(qū)域設(shè)置的值來(lái)響應(yīng)拴清。例如,如果用戶將設(shè)備的區(qū)域設(shè)置從英語(yǔ)切換到法語(yǔ)会通,那么Text
最初顯示“Hello World”的小部件將使用“Bonjour le monde”重建口予。
該Localizations
控件定義的區(qū)域設(shè)置為其子和本地化資源,孩子依賴涕侈。如果系統(tǒng)的區(qū)域設(shè)置更改沪停,WidgetsApp
小部件會(huì)創(chuàng)建一個(gè)Localizations
小部件并重建它。
您始終可以使用以下命令查找應(yīng)用程序的當(dāng)前語(yǔ)言環(huán)境 Localizations.localeOf()
:
Locale myLocale = Localizations.localeOf(context);
指定應(yīng)用程序的 supportedLocales 參數(shù)
盡管該flutter_localizations
庫(kù)目前支持 78 種語(yǔ)言和語(yǔ)言變體裳涛,但默認(rèn)情況下僅提供英語(yǔ)語(yǔ)言翻譯木张。由開(kāi)發(fā)人員決定支持哪些語(yǔ)言。
該MaterialApp
supportedLocales
參數(shù)限制區(qū)域設(shè)置更改端三。當(dāng)用戶更改其設(shè)備上的區(qū)域設(shè)置時(shí)舷礼,Localizations
只有當(dāng)新區(qū)域是此列表的成員時(shí),應(yīng)用程序的小部件才會(huì)隨之更改郊闯。如果找不到與設(shè)備區(qū)域設(shè)置的完全匹配妻献,則使用具有匹配項(xiàng)的第一個(gè)支持的區(qū)域設(shè)置languageCode
。如果失敗团赁,則supportedLocales
使用列表的第一個(gè)元素 育拨。
想要使用不同“區(qū)域設(shè)置解析”方法的應(yīng)用程序可以提供一個(gè)localeResolutionCallback
. 例如,要讓您的應(yīng)用程序無(wú)條件接受用戶選擇的任何語(yǔ)言環(huán)境:
MaterialApp(
localeResolutionCallback: (
Locale? locale,
Iterable<Locale> supportedLocales,
) {
return locale;
},
);