flutter 应用程序无法加载本地设备语言

问题描述 投票:0回答:2

我在我的应用程序上实现了 Easy 本地化包,当我使用 应用程序单选按钮 在不同语言之间切换时,它工作得很好。但其目的不是让用户更改语言,而是加载本地设备语言并使用本地语言设置应用程序。 我在设备设置中更改了设备语言,但是当我重新打开应用程序时,语言没有改变。

这里是main.dart:

  void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await EasyLocalization.ensureInitialized();

  runApp(
    EasyLocalization(
      supportedLocales: [
        Locale('en', 'US'),
        Locale('it', 'IT'),
        Locale('fr', 'FR')
      ],
      path: 'assets/translations',
      // <-- change the path of the translation files
      fallbackLocale: Locale('en', 'US'),
      //assetLoader: CodegenLoader(),
      child: MyLangApp(),
    ),
  );
}

这里是 MyLangApp:

  class MyLangApp extends StatefulWidget {
  const MyLangApp({Key? key}) : super(key: key);

  @override
  State<MyLangApp> createState() => _MyLangAppState();
}

class _MyLangAppState extends State<MyLangApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: context.localizationDelegates,
      supportedLocales: context.supportedLocales,
      locale: context.locale,
      home: MainPage(),
    );
  }
}
flutter dart localization
2个回答
4
投票

如果您想获取设备区域设置,请使用以下命令:

import 'dart:io';

final String defaultLocale = Platform.localeName;

请参阅 easy_localization 文档 (https://pub.dev/packages/easy_localization) 以更改语言: enter image description here

在 Flutter 文档中找到了这个(https://docs.flutter.dev/development/accessibility-and-localization/internationalization):

高级语言环境定义 一些具有多种变体的语言需要的不仅仅是语言代码才能正确区分。

例如,完全区分中文的所有变体需要指定语言代码、脚本代码和国家代码。这是由于简体字和繁体字的存在,以及同一文字类型中汉字书写方式的地区差异。

为了充分表达国家代码 CN、TW 和 HK 的每种中文变体,支持的语言环境列表应包括:

supportedLocales: [
  Locale.fromSubtags(languageCode: 'zh'), // generic Chinese 'zh'
  Locale.fromSubtags(
      languageCode: 'zh',
      scriptCode: 'Hans'), // generic simplified Chinese 'zh_Hans'
  Locale.fromSubtags(
      languageCode: 'zh',
      scriptCode: 'Hant'), // generic traditional Chinese 'zh_Hant'
  Locale.fromSubtags(
      languageCode: 'zh',
      scriptCode: 'Hans',
      countryCode: 'CN'), // 'zh_Hans_CN'
  Locale.fromSubtags(
      languageCode: 'zh',
      scriptCode: 'Hant',
      countryCode: 'TW'), // 'zh_Hant_TW'
  Locale.fromSubtags(
      languageCode: 'zh',
      scriptCode: 'Hant',
      countryCode: 'HK'), // 'zh_Hant_HK'
],

这个明确的完整定义确保您的应用程序可以区分这些国家/地区代码的所有组合并为其提供完全细致入微的本地化内容。如果未指定用户的首选区域设置,则会使用最接近的匹配项,这可能与用户期望的内容有所不同。 Flutter 仅解析为supportedLocales 中定义的区域设置。 Flutter 为常用语言提供了 scriptCode 差异化的本地化内容。有关如何解析受支持的区域设置和首选区域设置的信息,请参阅本地化。

虽然中文是主要示例,但法语(fr_FR、fr_CA)等其他语言也应该完全区分,以实现更细致的本地化。

似乎你必须将它们全部包含在内,或者将

Platform.localeName
分成语言和区域,然后只使用语言...

更新

试试这个:

final deviceLocale= Locale(Platform.localeName) 

await context.setLocale(deviceLocale.split('-')[0]);

0
投票

要使用

Platform.localeName
,您需要导入仅适用于非 Web Flutter 应用程序的
dart.io
。我建议你这样使用
Intl
包:

String localeLanguageCode = Intl.shortLocale(Intl.defaultLocale ?? Intl.systemLocale);
© www.soinside.com 2019 - 2024. All rights reserved.