我在我的应用程序上实现了 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(),
);
}
}
如果您想获取设备区域设置,请使用以下命令:
import 'dart:io';
final String defaultLocale = Platform.localeName;
请参阅 easy_localization 文档 (https://pub.dev/packages/easy_localization) 以更改语言:
在 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]);
要使用
Platform.localeName
,您需要导入仅适用于非 Web Flutter 应用程序的 dart.io
。我建议你这样使用 Intl
包:
String localeLanguageCode = Intl.shortLocale(Intl.defaultLocale ?? Intl.systemLocale);