國際化命令:flutter --no-color pub global run intl_utils:generate
Flutter 國際化步驟
一:使用flutter intl進(jìn)行國際化
1:下載 flutter intl插件
2:在Android Studio中打開項(xiàng)目,在Tools -> flutter intl -> initiazlize for the project
此時(shí)pubspec.yaml底部會多出內(nèi)容:
flutter_intl:
enabled: true
3:添加中文
在Tools -> flutter intl -> add Locale中,輸入 zh
4. 按照網(wǎng)上寫法按部就班的進(jìn)行。
二:官方指導(dǎo)方式國際化- Flutter 中的本地化介紹
默認(rèn)情況下,F(xiàn)lutter 僅提供美國英語本地化。要添加對其他語言的支持,應(yīng)用程序必須指定附加MaterialApp(或CupertinoApp)屬性,并包含一個(gè)名為 flutter_localizations. 截至 2020 年 11 月,該軟件包支持 78 種語言。
1. 設(shè)置一個(gè)國際化的應(yīng)用程序:Flutter _localizations 包
- 要使用 flutter_localizations,請將包作為依賴項(xiàng)添加到您的pubspec.yaml文件中:
dependencies:
flutter:
sdk: flutter
flutter_localizations: # Add this line
sdk: flutter # Add this line
- 接下來,運(yùn)行pub get packages,然后導(dǎo)入flutter_localizations庫,并指定 localizationsDelegates和supportedLocales為MaterialApp:
import 'package:flutter_localizations/flutter_localizations.dart';
2. 添加您自己的本地化消息
-
一旦flutter_localizations包被添加,使用下面的說明本地化的文本添加到您的應(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" } }- 接下來,在同一目錄中添加一個(gè)app_zh.arb文件,用于同一消息的中文翻譯:
{ "helloWorld": "你好世界!" }- 現(xiàn)在,運(yùn)行您的應(yīng)用程序,以便進(jìn)行代碼生成。您應(yīng)該會在
${FLUTTER_PROJECT}/.dart_tool/flutter_gen/gen_l10n. - 添加的import語句
app_localizations.dart,并AppLocalizations.delegate在調(diào)用的構(gòu)造MaterialApp。
import 'package:flutter_gen/gen_l10n/app_localizations.dart';如果導(dǎo)入的時(shí)候,沒找到路徑,
import的時(shí)候沒有提示,但是在.dart_tool里面已經(jīng)看到該文件夾和路徑了,此時(shí)可以關(guān)閉Android Studio,重新打開,即可有提示了。- 在您的應(yīng)用程序中的任何位置使用
AppLocalizations。此處,翻譯后的消息用于文本小部件。
Text(AppLocalizations.of(context)!.helloWorld);- 您還可以使用生成的localizationsDelegates和supportedLocales列表,而不是手動提供它們。
const MaterialApp( title: 'Localizations Sample App', localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, ); 注意:如果需要繼續(xù)增加別的國際語言,只需要重復(fù)第5步即可,在同一目錄中添加一個(gè)app_es.arb文件,運(yùn)行項(xiàng)目,即可自動在.dart_tool/flutter_gen/gen_l10n目錄中新增相應(yīng)的文件,然后修改app_es.arb文件后,重新運(yùn)行即可,app_localizations_es.dart文件會自動更新,如果在app_es.arb中找不到app_en.arb對應(yīng)的值,會直接用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)用程序支持的語言環(huán)境,請使用以下說明:
打開項(xiàng)目的
ios/Runner.xcworkspaceXcode 文件。在Project Navigator 中,打開項(xiàng)目文件夾
Runner下的Runner文件夾下的Info.plist文件。選擇Information Property List 項(xiàng)。然后從Editor 菜單中選擇Add Item,并從彈出菜單中選擇Localizations。
選擇并展開新創(chuàng)建的
Localizations項(xiàng)目。對于您的應(yīng)用程序支持的每個(gè)區(qū)域設(shè)置,添加一個(gè)新項(xiàng)目并從值字段的彈出菜單中選擇您希望添加的區(qū)域設(shè)置。此列表應(yīng)與supportedLocales參數(shù)中列出的語言一致。添加所有支持的語言環(huán)境后,保存文件。
高級語言環(huán)境定義
一些具有多種變體的語言需要的不僅僅是語言代碼才能正確區(qū)分。
例如,完全區(qū)分中文的所有變體需要指定語言代碼、腳本代碼和國家代碼。這是由于簡繁體文字的存在,以及在同一文字類型中書寫字符的方式存在地區(qū)差異。
為了充分表達(dá)國家代碼CN、TW和HK的每個(gè)中文變體,支持的語言環(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ū)分這些國家/地區(qū)代碼的所有組合,并為這些國家/地區(qū)代碼的所有組合提供完全細(xì)致入微的本地化內(nèi)容。如果未指定用戶的首選語言環(huán)境,則使用最接近的匹配項(xiàng),這可能包含與用戶期望的差異。Flutter 僅解析為supportedLocales. Flutter 為常用語言提供了 scriptCode 差異化的本地化內(nèi)容。有關(guān)Localizations如何解析支持的語言環(huán)境和首選語言環(huán)境的信息,請參閱。
盡管中文是主要示例,但其他語言(如法語 ( fr_FR, fr_CA) )也應(yīng)完全區(qū)分,以實(shí)現(xiàn)更細(xì)微的本地化
跟蹤語言環(huán)境:Locale 類和 Localizations 小部件
本Locale類標(biāo)識用戶的語言。移動設(shè)備支持為所有應(yīng)用程序設(shè)置區(qū)域設(shè)置,通常使用系統(tǒng)設(shè)置菜單。國際化應(yīng)用程序通過顯示特定于區(qū)域設(shè)置的值來響應(yīng)。例如,如果用戶將設(shè)備的區(qū)域設(shè)置從英語切換到法語,那么Text最初顯示“Hello World”的小部件將使用“Bonjour le monde”重建。
該Localizations控件定義的區(qū)域設(shè)置為其子和本地化資源,孩子依賴。如果系統(tǒng)的區(qū)域設(shè)置更改,WidgetsApp小部件會創(chuàng)建一個(gè)Localizations小部件并重建它。
您始終可以使用以下命令查找應(yīng)用程序的當(dāng)前語言環(huán)境 Localizations.localeOf():
Locale myLocale = Localizations.localeOf(context);
指定應(yīng)用程序的 supportedLocales 參數(shù)
盡管該flutter_localizations庫目前支持 78 種語言和語言變體,但默認(rèn)情況下僅提供英語語言翻譯。由開發(fā)人員決定支持哪些語言。
該MaterialApp supportedLocales 參數(shù)限制區(qū)域設(shè)置更改。當(dāng)用戶更改其設(shè)備上的區(qū)域設(shè)置時(shí),Localizations只有當(dāng)新區(qū)域是此列表的成員時(shí),應(yīng)用程序的小部件才會隨之更改。如果找不到與設(shè)備區(qū)域設(shè)置的完全匹配,則使用具有匹配項(xiàng)的第一個(gè)支持的區(qū)域設(shè)置languageCode 。如果失敗,則supportedLocales使用列表的第一個(gè)元素 。
想要使用不同“區(qū)域設(shè)置解析”方法的應(yīng)用程序可以提供一個(gè)localeResolutionCallback. 例如,要讓您的應(yīng)用程序無條件接受用戶選擇的任何語言環(huán)境:
MaterialApp(
localeResolutionCallback: (
Locale? locale,
Iterable<Locale> supportedLocales,
) {
return locale;
},
);