微信交流群

老孟公众号

# Localizations

Localizations 控件用于国际化,也就是多语言支持。

在项目中基本不会用到这个控件,不会用到并不代表这个控件不重要,这个控件非常重要,只不过系统提供的MaterialApp已经集成了此控件,所以我们基本不会直接使用。

定义我们自己的多语言支持:

class AppLocalizations {
  AppLocalizations(this.locale);

  final Locale locale;

  static AppLocalizations of(BuildContext context) {
    return Localizations.of<AppLocalizations>(context, AppLocalizations);
  }

  static Map<String, Map<String, String>> _localizedValues = {
    'zh': {
      'name': '你好',
    },
    'en': {
      'name': 'Hello World',
    },
  };

  String get name {
    return _localizedValues[locale.languageCode]['name'];
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

_localizedValues在实际项目中通常一种语言写在一个文件中,这里为了方便放在了一起。

定义Delegate:

class AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
  const AppLocalizationsDelegate();

  @override
  bool isSupported(Locale locale) => ['zh', 'en'].contains(locale.languageCode);

  @override
  Future<AppLocalizations> load(Locale locale) {
    return SynchronousFuture<AppLocalizations>(AppLocalizations(locale));
  }

  @override
  bool shouldReload(AppLocalizationsDelegate old) => false;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

MaterialApp下定义支持的Delegate

MaterialApp(
  localizationsDelegates: [
    AppLocalizationsDelegate()
  ],
  supportedLocales: [
    const Locale('zh', 'CH'),
    const Locale('en', 'US'),
  ],
  ...
)
1
2
3
4
5
6
7
8
9
10

使用如下:

Text('${AppLocalizations.of(context).name}')
1

image-20200601151303789

还可以通过Localizations获取当前系统的语言环境:

Locale myLocale = Localizations.localeOf(context);
1