【问题标题】:Change application locale programmatically以编程方式更改应用程序区域设置
【发布时间】:2019-03-22 23:35:51
【问题描述】:

按下按钮时我需要以编程方式更改应用程序区域设置

我的代码:

MaterialApp(

          localizationsDelegates: [
            _newLocaleDelegate,
            const AppTranslationsDelegate(),
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
          ],
          supportedLocales: [
            const Locale('en', ''),
            const Locale('ar', ''),
          ],
          locale: mylocale,
          title: appTitle,
          home: Scaffold(
            body: new MyCustomForm(),

          ),
           debugShowCheckedModeBanner: false
        );

    new MaterialButton(
    onPressed: () { 
    setState(() {
        mylocale=Locale("ar","");
_newLocaleDelegate =  AppTranslationsDelegate(newLocale:mylocale);
     });
    },

     ),

翻译代码:

AppTranslations.of(context).text("text")

AppTranslations 类:

class AppTranslations {
  Locale locale;
  static Map<dynamic, dynamic> _localisedValues;

  AppTranslations(Locale locale) {
    this.locale = locale;
    _localisedValues = null;
  }

  static AppTranslations of(BuildContext context) {
    return Localizations.of<AppTranslations>(context, AppTranslations);
  }

  static Future<AppTranslations> load(Locale locale) async {
    AppTranslations appTranslations = AppTranslations(locale);
    String jsonContent =
    await rootBundle.loadString("assets/locale/localization_${locale.languageCode}.json");
    _localisedValues = json.decode(jsonContent);
    return appTranslations;
  }

  get currentLanguage => locale.languageCode;

  String text(String key) {
    print(key);
    if(_localisedValues!=null)
    return _localisedValues[key] ?? "$key";
    else
      return key;
  }
}

我的问题:

当语言环境改变页面方向改变而没有翻译时, 要获得效果翻译需要刷新页面或转到另一个页面并返回,

任何帮助

【问题讨论】:

  • 你需要将你的materialApp包装到另一个小部件中,通过请求一个新的密钥来重新启动应用程序,这个简单的插件localize_and_translate已经准备好了这个名为LocalizedApp()的类,值得一试

标签: dart flutter


【解决方案1】:

您可以尝试将您的MaterialApp 包装在AnimatedSwitcher 中,如下所示:

AnimatedSwitcher(
  // Following two fields for your reference

  // duration: const Duration(milliseconds: 500),

  // transitionBuilder: (Widget child, Animation<double> animation) {
  //  return ScaleTransition(child: child, scale: animation);
  // },

  child: MaterialApp(
    // As before, the same code, however:

    key: ValueKey<Locale>(mylocale),
  ) 
) 

顺便说一句,用下划线作为私有变量前缀的好习惯,例如_myLocale.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2018-03-16
    相关资源
    最近更新 更多