Flutter 如何检测设备语言?

Flutter how to detect device language?

提问人:Rock 提问时间:6/17/2020 更新时间:7/16/2023 访问量:7130

问:

我有一个问题,我怎样才能检测设备语言,并据此在应用程序启动时最初给出适当的语言? 如果可能,请提供一个带有代码的示例。

Flutter 国际化

评论


答:

5赞 EdwynZN 6/18/2020 #1

调用应返回 languageCode。如果未提供,MaterialApp 会创建并使用默认本地化,然后您可以在 MaterialApp 之后调用它,以了解它当前使用设备的语言,并使用该信息更新您的应用程序。Localizations.localeOf(context).languageCode

对于一个简单的项目,我的建议是将此插件用于 VS IDE(或用于 Android Studio,它来自同一作者)。安装后,只需将依赖项添加到您的 pubspec.yaml 中

dependencies:
  // Other dependencies...
  flutter_localizations:
    sdk: flutter

  ...

  flutter_intl:
    enabled: true
    class_name: S # Optional. Sets the name for the generated localization class. Default: S
    main_locale: en # Optional. Sets the main locale used for generating localization files. Provided value should comply with ISO-639-1 and ISO-3166-1 (e.g. "en", "en_GB"). Default: en

在 Android Studio 中(我真的不知道 VS 中的哪个位置,对不起)检查(它应该在末尾),在那里您可以初始化您的项目并添加区域设置。现在你的项目中应该有一个带有 arb 文件的文件夹,它们看起来像 JSON 文件,只需添加一个带有字符串的键即可。为所需的每个区域设置创建一个区域设置,并为其提供每种语言的字符串 aprameterTools > Flutter intllib/l10n

intl_en.arb { “name”: “我有一个名字” }

intl_es.arb { “name”: “Yo tengo un Nombre” }

它应该自动运行生成。之后,创建委派 S 的 Material 应用程序(将生成的代码的名称,如果需要,您可以稍后更改名称)。

import 'package:flutter_localizations/flutter_localizations.dart';
import 'generated/l10n.dart';

class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
        return new MaterialApp(
            localizationsDelegates: [
                S.delegate, //The class S
                GlobalMaterialLocalizations.delegate,
                GlobalWidgetsLocalizations.delegate,
                GlobalCupertinoLocalizations.delegate,
            ],
            supportedLocales: S.delegate.supportedLocales,
            title: 'Flutter Demo',
            home: MyHomePage(),
        );
    }
}

现在您可以在 Widget 树中使用它

class MyHomePage extends StatelessWidget{
   @override
   Widget build(BuildContext context){
     return Text(S.of(context).name) 
     // now it prints the string of name depending the language the device is
   }
}

如果设备使用您不支持的语言(例如法语),它将使用类的默认语言 en('英语),如果您想使用另一种语言作为默认语言,请在 pubspec 中检查main_locale

如果您想尝试不同的东西,请查看此示例,了解如何将国际化与 JSON 密钥一起使用。

评论

0赞 Rock 6/18/2020
好的,谢谢,我会尝试检查
3赞 Ahmed El Rhaouti 8/23/2022 #2

您可以使用下面的代码来获取设备的当前区域设置:

import 'dart:ui'; //for mobile
import 'dart:html' as html; //for web

Locale deviceLocale = window.locale;// or html.window.locale
String langCode = deviceLocale.languageCode;