【问题标题】:Flutter manually change Language with flutter_localizations and intlFlutter 使用 flutter_localizations 和 intl 手动更改语言
【发布时间】:2021-07-18 16:02:03
【问题描述】:

我正在创建 PopupMenuButton 以在本地更改应用程序的语言,但我不知道如何加载不同的语言。
这是我为更改语言而创建的小部件,我想将应用语言设置为 PopupMenu 项的值。

import 'package:flutter/material.dart';
import '../generated/l10n.dart';

class ChangeLanguage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return PopupMenuButton(
      offset: const Offset(0, 40),
      onSelected: (value) {
        //set language to value
        print(L.current);
        print(Localizations.localeOf(context).toString());
      },
      itemBuilder: (BuildContext context) => [
        PopupMenuItem(
            value: "de",
            child: Text(
              "Deutsch",
              style: Theme.of(context).textTheme.bodyText2,
            )),
        PopupMenuItem(
            value: "en",
            child: Text(
              "English",
              style: Theme.of(context).textTheme.bodyText2,
            )),
      ],
    );
  }
}

我在 main.dart 文件中实现了 flutter_localizations 和 intl,如下所示:

localizationsDelegates: [
  L.delegate,
  GlobalMaterialLocalizations.delegate,
  GlobalWidgetsLocalizations.delegate,
  GlobalCupertinoLocalizations.delegate,
],
supportedLocales: L.delegate.supportedLocales,

支持的语言是 ende,并使用 intl 包生成。

【问题讨论】:

    标签: flutter dart flutter-intl flutter-localizations


    【解决方案1】:

    MaterialApp 小部件接收一个参数 locale,该参数接收一个 Locale 实例。 您应该为您的客户存储(SQL、sharedpreferences、hive、firebase 或任何数据存储服务)首选语言的值。例如:如果客户端已将“en”语言设置为默认语言,您可以向 MaterialApp 提供语言环境:Locale('en', 'US')

    在 main.dart 中,您可以获取值并将其存储在变量中

    final language=await _getLanguage();//this method returns a String
    Locale locale;//late Locale locale if using null safety
    if(language=='de'){
      setState((){
        locale=Locale('de', 'DE');
      });
     
    }
    else{
      setState((){
        locale=Locale('en', 'US');//assuming that English is your default language.
      })
    }
    
    
    ...
    
    return MaterialApp(
      ...
      locale: locale,
    );
    

    就是这样。当然,您可以使用您喜欢的状态管理工具来更好地完成这项工作,但这是您需要的实现的核心

    【讨论】:

      猜你喜欢
      • 2021-07-31
      • 2016-06-17
      • 2020-07-06
      • 1970-01-01
      • 2021-08-18
      • 2022-01-17
      • 2020-03-07
      • 2021-03-26
      相关资源
      最近更新 更多