Flutter實戰(zhàn) 國際化常見問題

2021-03-09 14:42 更新

本節(jié)主要解答一下在國際化中常見的問題。

#默認語言區(qū)域不對

在一些非大陸行貨渠道買的一些 Android 和 iOS 設備,會出現(xiàn)默認的 Locale 不是中文簡體的情況。這屬于正常現(xiàn)象,但是為了防止設備獲取的 Locale 與實際的地區(qū)不一致,所有的支持多語言的 APP 都必須提供一個手動選擇語言的入口。

#如何對應用標題進行國際化

MaterialApp有一個title屬性,用于指定 APP 的標題。在 Android 系統(tǒng)中,APP 的標題會出現(xiàn)在任務管理器中。所以也需要對title進行國際化。但是問題是很多國際化的配置都是在MaterialApp上設置的,我們無法在構建MaterialApp時通過Localizations.of來獲取本地化資源,如:

MaterialApp(
  title: DemoLocalizations.of(context).title, //不能正常工作!
  localizationsDelegates: [
    // 本地化的代理類
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    DemoLocalizationsDelegate() // 設置Delegate
  ],
);

上面代碼運行后,DemoLocalizations.of(context).title 是會報錯的,原因是Localizations.of會從當前的 context 沿著 widget 樹向頂部查找DemoLocalizations,但是我們在MaterialApp中設置完DemoLocalizationsDelegate后,實際上DemoLocalizations是在當前 context 的子樹中的,所以DemoLocalizations.of(context)會返回null,報錯。那么我們該如何處理這種情況呢?其實很簡單,我們只需要設置一個onGenerateTitle回調即可:

MaterialApp(
  onGenerateTitle: (context){
    // 此時context在Localizations的子樹中
    return DemoLocalizations.of(context).title;
  },
  localizationsDelegates: [
    DemoLocalizationsDelegate(),
    ...
  ],
);

#如何為英語系的國家指定同一個locale

英語系的國家非常多,如美國、英國、澳大利亞等,這些英語系國家雖然說的都是英語,但也會有一些區(qū)別。如果我們的 APP 只想提供一種英語(如美國英語)供所有英語系國家使用,我們可以在前面介紹的localeListResolutionCallback中來做兼容:

localeListResolutionCallback:
    (List<Locale> locales, Iterable<Locale> supportedLocales) {
  // 判斷當前l(fā)ocale是否為英語系國家,如果是直接返回Locale('en', 'US')     
}
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號