【问题标题】:Locale from web app is always 'en' FlutterWeb 应用程序的语言环境始终是“en” Flutter
【发布时间】:2020-08-23 06:14:48
【问题描述】:

我的应用可以从 Android 和 iOS 正确获取设备区域设置,但不能从 Web 获取。我使用ui.dart 包将网络语言环境语言代码设为ui.window.locale.languageCode。在我的 Mac 中,我将系统语言设置为意大利语,时区设置为意大利,定位服务设置为启用,但是当我在 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;
        },
...

【问题讨论】:

    标签: flutter locale flutter-web


    【解决方案1】:

    最后,master 分支上的语言环境按预期工作。 更新到 Channel master,1.19.0-4.0.pre.73 解决了这个问题。

    【讨论】:

      【解决方案2】:

      我昨天在 iOS 和 Web 上遇到了同样的问题。我用this answer 解决了iOS 问题。我想 Web 应用程序的问题将在未来得到解决(Web 不被视为稳定的 Flutter 功能)。

      如果您确实需要在 iOS、Android 和 Web 上创建国际化应用,可以使用this package

      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 页面的“问题”选项卡上查看问题是否已发出信号。也许我应该在今晚发出信号。

      【讨论】:

      • 您好,感谢您的回答。实际上,问题仅在于网络。 AFAIK 已经合并了一个修复程序,我们应该可以在下一个版本的颤振中使用它。我测试了实际的稳定 master 和 beta 分支,但仍然出现错误,因此尚未推出。由于我不急于将网络版本国际化,我将尝试等待下一个推出的版本是否会在实施建议的插件之前有效地解决问题,因为我应该重写很多。非常感谢您推荐插件面团。 ;) 干杯。
      • 我希望您对修复的看法是正确的。我提到的包不是很受欢迎(Github 上 6 星),所以我认为它不能被认为是可靠的。但我目前没有更好的选择。
      • 您可以在此处关注github.com/flutter/flutter/issues/54669 我希望它很快就会修复。干杯
      • 终于修好了。更新到最后一个主频道和区域设置现在也可以在网络上完美运行。
      猜你喜欢
      • 2018-09-01
      • 2016-12-28
      • 1970-01-01
      • 2015-10-03
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      相关资源
      最近更新 更多