W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
本節(jié)主要解答一下在國際化中常見的問題。
在一些非大陸行貨渠道買的一些 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(),
...
],
);
英語系的國家非常多,如美國、英國、澳大利亞等,這些英語系國家雖然說的都是英語,但也會有一些區(qū)別。如果我們的 APP 只想提供一種英語(如美國英語)供所有英語系國家使用,我們可以在前面介紹的localeListResolutionCallback
中來做兼容:
localeListResolutionCallback:
(List<Locale> locales, Iterable<Locale> supportedLocales) {
// 判斷當前l(fā)ocale是否為英語系國家,如果是直接返回Locale('en', 'US')
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: