Локаль из веб-приложения всегда 'en' Flutter - PullRequest
3 голосов
/ 07 мая 2020

У меня есть приложение, которое правильно получает языковой стандарт устройства из Android и iOS, но не из Интернета. Я получаю код языка веб-локали как ui.window.locale.languageCode с использованием пакета ui.dart. В моем Ma c я установил системный язык на итальянский, часовой пояс установлен на Италию, а службы определения местоположения включены, но когда я запускаю свое приложение на Chrome, оно всегда возвращает 'en_'. Что-то мне не хватает? Это код в main ():

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
//    Locale myLocale = Localizations.localeOf(context);
    return MaterialApp(
        title: '',
        color: Colors.red,
        localizationsDelegates: [
          const AppLocalizationsDelegate(),
          GlobalMaterialLocalizations.delegate,
          GlobalCupertinoLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate,
        ],
        supportedLocales: [
          const Locale('en', 'US'),
          const Locale('it', 'IT')
//        const Locale('es', 'ES'),
        ],
        localeResolutionCallback:
            (Locale locale, Iterable<Locale> supportedLocales) {
          for (Locale supportedLocale in supportedLocales) {
            if (kIsWeb) {
              Locale webLocale = Locale(ui.window.locale.languageCode, '');
              print('system locale is ${webLocale}');
              return webLocale;
            } else if (supportedLocale.languageCode == locale.languageCode ||
                supportedLocale.countryCode == locale.countryCode) {
              print('device Locale is $locale');
              return supportedLocale;
            }
          }
          return supportedLocales.first;
        },
...

Ответы [ 2 ]

2 голосов
/ 05 июня 2020

Наконец, локаль на главной ветке работает должным образом. Обновление до мастера каналов 1.19.0-4.0.pre.73 решило проблему.

0 голосов
/ 15 мая 2020

У меня вчера была такая же проблема с iOS и Интернетом. Я решил проблему iOS с помощью этого ответа . Я полагаю, что проблема для веб-приложений будет исправлена ​​в будущем (веб не считается стабильной функцией Flutter).

Если вам действительно нужно создать интернационализированное приложение на iOS, Android и web, вы можете использовать этот пакет .

FutureBuilder<Locale>(
  future: DeviceLocale.getCurrentLocale(),
  builder: (context, localeData) {
    if(!localeData.hasData) return Container( color: Colors.white);
    Locale locale = localeData.data;
    return MaterialApp(
      // localizationsDelegates, supportedLocales, ...

      // « _ » is the locale detected by flutter
      // You should use the locale detected by the library instead
      localeResolutionCallback: (_, supportedLocales) {
        for (var supportedLocaleLanguage in supportedLocales) {
          if (supportedLocaleLanguage.languageCode == locale.languageCode) return supportedLocaleLanguage;
        }

        // If device not support with locale to get language code then default get first on from the list
        return supportedLocales.first;
      }
    );
  },
);

Вы можете вызвать «Localizations.localeOf (context)», чтобы получить языковой стандарт в дочернем элементе виджета MaterialApp.

Похоже, что этот пакет в настоящее время несовместим с настольными приложениями.

Я не проверял на вкладке «Проблемы» на странице Flutter Github, было ли обнаружено сообщение о проблеме. Может, мне стоит подать сигнал сегодня вечером.

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