Cce9de91df4883ab660e34173f73c11b
Flutter 组件国际化(四):MaterialApp和CupertinoApp中的国际化

《Flutter组件国际化(三):Localizations详解》文章中已经介绍了Localizations的使用方法。然而大多数应用程序都是通过MaterialApp或者CupertinoApp为入口,而它们都是WidgetsApp的一个包装。所以一般情况我们不需要直接使用Localizations,因为在WidgetsApp中已经包含了一个Localizations组件


// WidgetsApp部分源码
class _WidgetsAppState extends State<WidgetsApp> with WidgetsBindingObserver {
  ...
  @override
  Widget build(BuildContext context) {
    ...
    return Shortcuts(
      shortcuts: _keyMap,
      child: Actions(
        actions: _actionMap,
        child: DefaultFocusTraversal(
          policy: ReadingOrderTraversalPolicy(),
          child: _MediaQueryFromWindow(
            // 包含了一个Localizations组件
            child: Localizations(
              locale: appLocale,
              delegates: _localizationsDelegates.toList(),
              child: title,
            ),
          ),
        ),
      ),
    );
  }
}

Localizations需要的参数locale和delegates已经被提升到了上层组件WidgetsApp、MaterialApp或者CupertinoApp中去了。

默认情况下,Flutter SDK中的组件不管是Material组件还是Cupertino组件仅支持英语。要为这些组件添加多语言的支持,需要添加“flutter_localizations”依赖包。依赖包中包含:

  • GlobalWidgetsLocalizations.delegate代理,提供了组件文本方向的国际化支持。
  • GlobalMaterialLocalizations.delegate代理,提供了Material组件的国际化支持。
  • GlobalCupertinoLocalizations.delegate代理,提供了Cupertino组件的国际化支持。

使用“flutter_localizations”依赖包需要一些配置:


//添加依赖到pubspec.yaml文件中:
...
dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

把“flutter_localizations”依赖包中定义的代理加入到localizationsDelegates中去。localizationsDelegates中的各个代理互不干扰,各自加载自己的国际化资源,返回自己的国际化资源实例,提供给相关组件使用



MaterialApp(
locale: const Locale.fromSubtags(languageCode: 'zh'),

top Created with Sketch.