以编程方式更改Flutter i18n应用程序的语言在iOS中不起作用

时间:2018-12-07 18:07:43

标签: ios internationalization flutter

我使用flutter_i18n插件(Android Studio)生成i18n.dart(class S),S.of(context).locale_msg将返回语言环境字符串。主要代码如下所示。 单击主页中的按钮时,应通过调用onLocaleChange(locale)以编程方式更改语言。它在Android模拟器中效果很好,但在iOS模拟器中不会更改语言。想知道我的代码怎么了吗?

class _PaperMoonAppState extends State<PaperMoonApp> {
  SpecifiedLocalizationDelegate _localeOverrideDelegate;

  void onLocaleChange(Locale locale) {
    setState(() {
      if (appVars.appConfig.changeLanguage(locale)) {
        _localeOverrideDelegate = new SpecifiedLocalizationDelegate(locale);
        appVars.saveConfig(); //print save config file...
      }
    });
  }

  @override
  void initState() {
    SpecifiedLocalizationDelegate.onLocaleChange = this.onLocaleChange;
    appVars.loadConfig().then((AppConfig _config) {
      appVars.appConfig = _config;

      setState(() {
        _localeOverrideDelegate =
            new SpecifiedLocalizationDelegate(appVars.appConfig.getLocale());
      });
    });
    _localeOverrideDelegate =
        new SpecifiedLocalizationDelegate(Locale('zh', ''));
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    print(_localeOverrideDelegate.overriddenLocale);
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: "Paper Moon",
      color: Colors.blueAccent,
      localizationsDelegates: [
        _localeOverrideDelegate,
        S.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate
      ],
      supportedLocales: const <Locale>[
        Locale("ja", ""),
        Locale("en", ""),
        Locale("zh", ""),
      ],
      localeResolutionCallback:
          S.delegate.resolution(fallback: _localeOverrideDelegate.overriddenLocale),
      home: HomePage(),
//      routes: _buildRoutes(),
    );
  }
}

自定义LocalizationDelegate:

class SpecifiedLocalizationDelegate
    extends LocalizationsDelegate<WidgetsLocalizations> {
  //class static vars:
  //onLocaleChange should be bind to MaterialApp function containing setState().
  static LocaleChangeCallback onLocaleChange;

  // for instance
  final Locale overriddenLocale;

  const SpecifiedLocalizationDelegate(this.overriddenLocale);

  @override
  bool isSupported(Locale locale) => overriddenLocale != null;



  @override
  Future<WidgetsLocalizations> load(Locale locale) =>
      S.delegate.load(overriddenLocale);

  @override
  bool shouldReload(SpecifiedLocalizationDelegate old) => true;
}

2 个答案:

答案 0 :(得分:0)

根据您的代码,似乎唯一缺少的是:

打开ios/Runner/Info.plist并添加:

    <key>CFBundleLocalizations</key>
    <array>
        <string>ja</string>
        <string>en</string>
        <string>zh</string>
    </array>

据我所知,到目前为止(2019年3月),flutter尚未自动将支持的语言列表添加到此文件中。

答案 1 :(得分:0)

我正在使用 i18n_extensions,但有同样的问题...

对我有用的是使用这个:

supportedLocales: const <Locale>[
    const Locale('en'),
    const Locale('pt'),
],

取而代之的是:

  supportedLocales: const <Locale>[
    const Locale('en', 'US'),
    const Locale('pt', 'BR'),
  ],

然后,我的 i18n.dart。我从这里更改的文件:

extension Localization on String {
  static final _t = Translations.from("en_us", {
    passwordInput: {
      "en_us": "Password",
      "pt_br": "Senha",
    },
    searchingTitle: {
      "en_us": "Scanning for devices...",
      "pt_br": "Procurando dispositivos...",
    },
    ...

为此:

extension Localization on String {
  static final _t = Translations.from("en", {
    passwordInput: {
      "en": "Password",
      "pt": "Senha",
    },
    searchingTitle: {
      "en": "Scanning for devices...",
      "pt": "Procurando dispositivos...",
    },

它对我来说很好。