# 13.4 国际化常见问题
本节主要解答一下在国际化中常见的问题。
# 13.4.1 默认语言区域不对
在一些非大陆行货渠道买的一些Android和iOS设备,会出现默认的Locale不是中文简体的情况。这属于正常现象,但是为了防止设备获取的Locale与实际的地区不一致,所有的支持多语言的APP都必须提供一个手动选择语言的入口。
# 13.4.2 如何对应用标题进行国际化
MaterialApp
有一个title
属性,用于指定APP的标题。在Android系统中,APP的标题会出现在任务管理器中。所以也需要对title
进行国际化。但是问题是很多国际化的配置都是在MaterialApp
上设置的,我们无法在构建MaterialApp
时通过Localizations.of
来获取本地化资源,如:
MaterialApp(
title: DemoLocalizations.of(context).title, //不能正常工作!
localizationsDelegates: [
// 本地化的代理类
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
DemoLocalizationsDelegate() // 设置Delegate
],
);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
上面代码运行后,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(),
...
],
);
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 13.4.3 如何为英语系的国家指定同一个locale
英语系的国家非常多,如美国、英国、澳大利亚等,这些英语系国家虽然说的都是英语,但也会有一些区别。如果我们的APP只想提供一种英语(如美国英语)供所有英语系国家使用,我们可以在前面介绍的localeListResolutionCallback
中来做兼容:
localeListResolutionCallback:
(List<Locale> locales, Iterable<Locale> supportedLocales) {
// 判断当前locale是否为英语系国家,如果是直接返回Locale('en', 'US')
}
1
2
3
4
2
3
4
请作者喝杯咖啡
版权所有,禁止私自转发、克隆网站。