目前,我正在使用flutter_localizations
来翻译应用程序中的字符串。它工作得非常好,但需要能够通过按按钮或从下拉列表中选择语言来从应用程序的设置中切换本地化。对于这个应用程序,使用了BLoC设计模式。
请问你能否提供任何潜在解决该问题的建议?谢谢!
目前,我正在使用flutter_localizations
来翻译应用程序中的字符串。它工作得非常好,但需要能够通过按按钮或从下拉列表中选择语言来从应用程序的设置中切换本地化。对于这个应用程序,使用了BLoC设计模式。
请问你能否提供任何潜在解决该问题的建议?谢谢!
针对未来的读者,以下是如何实现此操作:
Locale
由 MaterialApp
小部件内的 localeResolutionCallback
函数返回的结果定义。
在我的情况下,我将 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
,则将在应用程序中使用它,否则进行标准验证以从设备中获取区域设置。defaultLanguage
变量是否是受支持的语言环境来保护检查。 在我的情况下,已经处理了这个问题,所以我不需要担心。MaterialApp
组件用某种 LocalizationBloc 进行包装,对吗? - ZuberudefaultLanguage
改变时,localeResolutionCallback
是否会被重新执行? - Canastro