Flutter - 基于设备的动态语言

6

我正在尝试使用Localizations获取移动设备的国家代码和语言代码。

Widget build(BuildContext context) {
        Locale myLocale = Localizations.localeOf(context);
        print(myLocale.countryCode);
        print(myLocale.languageCode);
        return MaterialApp(
          title: 'Title',
          debugShowCheckedModeBanner: false,
          theme: ThemeData(
            primarySwatch: Colors.blue,       
          ),
          home: LoginPage(),
          localizationsDelegates: [
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
          ],
          supportedLocales: [
            Locale('es' 'ES'),
          ],
        );
      }

但是返回错误信息 "找不到本地化祖先"。有人知道正确的解决方法吗?

2个回答

14

使用 LocaleResolutionCallback 来获取设备的区域设置:

 Widget build(BuildContext context) {
    Locale myLocale ;

    return MaterialApp(
      title: 'Title',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,       
      ),
      home: LoginPage(),
      localeResolutionCallback: (deviceLocale, supportedLocales) {
      myLocale = deviceLocale ; // here you make your app language similar to device language , but you should check whether the localization is supported by your app
      print(myLocale.countryCode);
      print(myLocale.languageCode);
      }
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('es' 'ES'),
      ],
    );
  }

supportedLocales: [ Locale(myLocale.languageCode,myLocale.countryCode), ], 我可以这样做吗? - El Hombre Sin Nombre
你可以这样做,但是它并没有太大的帮助,因为supportedLocales是内置在你的应用程序中并用于检查的语言环境。 - Mazin Ibrahim
1
我如何在创建深层小部件的情况下在小部件中使用此区域设置? - John Smith Optional
@JohnSmithOptional,你有什么进展吗? - TootsieRockNRoll
你可以使用 Bloc,并让它为你的应用程序提供本地化数据。 - Mazin Ibrahim
@ElJazouli 是的,请看我的问题,链接在这里 https://stackoverflow.com/questions/56992283/in-flutter-how-can-i-get-the-preferred-language-of-a-user-before-building-a-wid 以及用户10101010的回答:https://stackoverflow.com/a/56992886/1126971 - John Smith Optional

2

根据Ibrahim的回答,我能够解决另一个使用案例 - 如果您的应用程序不支持某种语言环境该怎么办。如何确保应用程序回退到适当的“基本”语言 - 在我的情况下是英语(en)。这是我的尝试 - 请随意评论。

  MaterialApp(
    localizationsDelegates: [
      AppLocalizations.delegate,
      GlobalMaterialLocalizations.delegate,
      GlobalWidgetsLocalizations.delegate,
      GlobalCupertinoLocalizations.delegate,
    ],
    //ensure that if a locale is not on the list the fallback is 'en'
    localeResolutionCallback: (
      locale,
      supportedLocales,
    ) {
      if (supportedLocales.contains(Locale(locale.languageCode))) {
        return locale;
      } else {
        return const Locale('en', '');
      }
    },
    supportedLocales: [
      const Locale('en', ''),
      const Locale('pl', ''),
    ],

谢谢。你的方法不是空安全的。这是我改进后的解决方案:if (locale != null && supportedLocales.contains(Locale(locale.languageCode))) { return locale; } else { return supportedLocales.first; } - Florian Knoll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接