【问题标题】:How to change the Application's language programmatically in Flutter?如何在 Flutter 中以编程方式更改应用程序的语言?
【发布时间】:2020-09-25 12:43:46
【问题描述】:

目前,我使用flutter_localizations 来翻译应用程序中的字符串。它工作得非常好,但需要能够通过按下按钮或从下拉列表中选择语言来从应用程序的设置中切换本地化。对于这个应用程序,使用了 BLoC 设计模式。

您能否就这个问题提出任何可能的解决方案?在此先感谢:)

【问题讨论】:

  • @DeanVillamia 没有帮助。我已经实现了本地化。当我切换系统语言时,它会更改应用程序的语言。但是,我需要能够通过按下按钮或与 UI 交互在应用程序中执行此操作。
  • 好的,所以这是一个状态管理问题,只需在更改下拉列表时重建小部件。抱歉,我对 bloc 不太熟悉,因为我使用 provider -> changenotifier。
  • @DeanVillamia 问题未完全连接到状态管理。重建小部件无济于事,因为我还没有对语言做任何事情。我确实有一个下拉菜单,但是应该怎么做才能更改应用程序语言而忽略系统语言?
  • 获取系统语言,然后将其保存到可以操作的变量stackoverflow.com/questions/50923906/…

标签: android flutter dart localization


【解决方案1】:

对于未来的读者,您可以通过以下方式实现这一目标:

LocalelocaleResolutionCallback 函数返回的结果定义,在 MaterialApp 小部件中。

就我而言,我将final Locale defaultValue; 传递给我的应用根目录,即树中的第一个小部件(在runApp() 中声明)。

那时,我只是做这个验证:

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

import 'package:intl/intl.dart';

import '../../localization.dart';
import '../views/home_view.dart';

class App extends StatelessWidget {
  App({Key key, this.defaultLanguage}) : super(key: key);
  final Locale defaultLanguage;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeView(),
      localizationsDelegates: [
        AppLocalization.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('en', null),
        const Locale('pl', null),
      ],
      localeResolutionCallback: (locale, supportedLocales) {
        if (defaultLanguage != null) {
          Intl.defaultLocale = defaultLanguage.toLanguageTag();
          return defaultLanguage;
        }
        if (locale == null) {
          Intl.defaultLocale = supportedLocales.first.toLanguageTag();
          return supportedLocales.first;
        }
        for (var supportedLocale in supportedLocales) {
          if (supportedLocale.languageCode == locale.languageCode) {
            Intl.defaultLocale = supportedLocale.toLanguageTag();
            return supportedLocale;
          }
        }
        Intl.defaultLocale = supportedLocales.first.toLanguageTag();
        return supportedLocales.first;
      },
    );
  }
}

如果defaultLanguage 由上面的 bloc 传递,那么它会在应用程序中使用,否则它会执行标准验证以从设备中获取语言环境。

请记住,您可能需要通过验证 defaultLanguage 变量是否属于受支持的语言环境来保护检查。就我而言,这是已处理的,所以这就是我不打扰的原因。

【讨论】:

  • 所以我们必须将整个 MaterialApp 小部件包装在某种 LocalizationBloc 中,对吧?
  • defaultLanguage 更改时是否会重新执行 localeResolutionCallback?
  • @Zuberu 这是一种选择,是的。在我的应用程序中,我处理提供程序中的默认值。
  • @Canastro 是的。更改设备语言设置也会执行回调。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 2019-05-09
  • 2012-03-01
  • 2021-04-13
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
相关资源
最近更新 更多