Flutter實(shí)戰(zhàn) 國(guó)際化常見(jiàn)問(wèn)題

2021-03-09 14:42 更新

本節(jié)主要解答一下在國(guó)際化中常見(jiàn)的問(wèn)題。

#默認(rèn)語(yǔ)言區(qū)域不對(duì)

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

#如何對(duì)應(yīng)用標(biāo)題進(jìn)行國(guó)際化

MaterialApp有一個(gè)title屬性,用于指定 APP 的標(biāo)題。在 Android 系統(tǒng)中,APP 的標(biāo)題會(huì)出現(xiàn)在任務(wù)管理器中。所以也需要對(duì)title進(jìn)行國(guó)際化。但是問(wèn)題是很多國(guó)際化的配置都是在MaterialApp上設(shè)置的,我們無(wú)法在構(gòu)建MaterialApp時(shí)通過(guò)Localizations.of來(lái)獲取本地化資源,如:

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

上面代碼運(yùn)行后,DemoLocalizations.of(context).title 是會(huì)報(bào)錯(cuò)的,原因是Localizations.of會(huì)從當(dāng)前的 context 沿著 widget 樹(shù)向頂部查找DemoLocalizations,但是我們?cè)?code>MaterialApp中設(shè)置完DemoLocalizationsDelegate后,實(shí)際上DemoLocalizations是在當(dāng)前 context 的子樹(shù)中的,所以DemoLocalizations.of(context)會(huì)返回null,報(bào)錯(cuò)。那么我們?cè)撊绾翁幚磉@種情況呢?其實(shí)很簡(jiǎn)單,我們只需要設(shè)置一個(gè)onGenerateTitle回調(diào)即可:

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

#如何為英語(yǔ)系的國(guó)家指定同一個(gè)locale

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)