Flutter实战 国际化常见问题
本节主要解答一下在国际化中常见的问题。
#默认语言区域不对
在一些非大陆行货渠道买的一些 Android 和 iOS 设备,会出现默认的 Locale 不是中文简体的情况。这属于正常现象,但是为了防止设备获取的 Locale 与实际的地区不一致,所有的支持多语言的 APP 都必须提供一个手动选择语言的入口。
#如何对应用标题进行国际化
MaterialApp
有一个title
属性,用于指定 APP 的标题。在 Android 系统中,APP 的标题会出现在任务管理器中。所以也需要对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
英语系的国家非常多,如美国、英国、澳大利亚等,这些英语系国家虽然说的都是英语,但也会有一些区别。如果我们的 APP 只想提供一种英语(如美国英语)供所有英语系国家使用,我们可以在前面介绍的localeListResolutionCallback
中来做兼容:
localeListResolutionCallback:
(List<Locale> locales, Iterable<Locale> supportedLocales) {
// 判断当前locale是否为英语系国家,如果是直接返回Locale('en', 'US')
}