W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
本節(jié)主要解答一下在國(guó)際化中常見(jiàn)的問(wèn)題。
在一些非大陸行貨渠道買的一些 Android 和 iOS 設(shè)備,會(huì)出現(xiàn)默認(rèn)的 Locale 不是中文簡(jiǎn)體的情況。這屬于正?,F(xiàn)象,但是為了防止設(shè)備獲取的 Locale 與實(shí)際的地區(qū)不一致,所有的支持多語(yǔ)言的 APP 都必須提供一個(gè)手動(dòng)選擇語(yǔ)言的入口。
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ó)家非常多,如美國(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')
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: