программно изменить язык приложений Flutter i18n не работает в iOS - PullRequest
0 голосов
/ 07 декабря 2018

Я использовал плагин 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(),
    );
  }
}

Пользовательская локализацияДелегат:

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;
}

1 Ответ

0 голосов
/ 15 марта 2019

Исходя из вашего кода, единственное, что, кажется, отсутствует, это:

открыть ios/Runner/Info.plist и добавить:

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

Насколько я знаю, к настоящему времени (март / 2019), flutter еще не добавляет автоматически список поддерживаемых языков в этот файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...