Skip to main content

多國語言(i18n)

使用官方的 flutter_localization 實作,預設使用英文(en)

  • 繁體中文(zh-TW)
  • 英文(en)
caution

若未正確設定,會導致各個 ScaffoldWidget 內部所使用的字串無法正確被讀取

warning

請勿使用 apLocalizationsDelegate,在 v0.21.0 以前版本會使用 apLocalizationsDelegate,整合 multiple_localization 避免無法使用多重本地化初始化

設定#

MaterialApp 加入多國語言支援

app.dart
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: [
apLocalizationsDelegate
],
supportedLocales: [
const Locale('en'), // English
const Locale('zh', 'TW'), // Traditional Chinese
],
);
}

自訂使用的語言(可選)#

Localization 所使用的語言第一次會根據 localeResolutionCallback 回傳值的設定,預設讀取系統語言

可加入 Callback 修改預設語言,可參考以下範例

並透過 Preferences 載入上一次的設定,其參數為 Locale 中的 languageCode,若為 ApSupportLanguageConstants.system 則使用系統語言

app.dart
Locale locale;
@override
Widget build(BuildContext context) {
return MaterialApp(
// 若是不支援語言 預設為英文
locale: locale,
localeResolutionCallback:
(Locale locale, Iterable<Locale> supportedLocales) {
String languageCode = Preferences.getString(
ApConstants.prefLanguageCode,
ApSupportLanguageConstants.system,
);
if (languageCode == ApSupportLanguageConstants.system)
return this.locale = apLocalizationsDelegate.isSupported(locale)
? locale
: Locale('en');
else
return Locale(
languageCode,
languageCode == ApSupportLanguageConstants.ZH ? 'TW' : null,
);
},
);
}

動態載入語言(可選)#

若希望動態載入不同語言時可將 MaterailApp 包裝至 StatusfulWidget

並透過 load 載入新的設定

app.dart
void loadLocale(Locale locale) {
setState(() {
this.locale = locale;
apLocalizationsDelegate.load(locale);
});
}