Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 按钮更改语言颤振_Android_Flutter_Dart_Mobile_Internationalization - Fatal编程技术网

Android 按钮更改语言颤振

Android 按钮更改语言颤振,android,flutter,dart,mobile,internationalization,Android,Flutter,Dart,Mobile,Internationalization,我正在Flitter中构建一个应用程序,到目前为止,我使用的是JSON国际化,其中应用程序的语言基于用户在其手机中默认使用的语言,它工作得非常好,但我想让用户有机会在不更改手机系统语言设置的情况下更改语言,只需单击一个按钮,然后应用程序就可以更改语言,而无需进行设置 代码如下: 主要问题: import 'package:flutter/material.dart'; import 'package:flutter_app_darkmode/app_localizations.dart'; im

我正在Flitter中构建一个应用程序,到目前为止,我使用的是JSON国际化,其中应用程序的语言基于用户在其手机中默认使用的语言,它工作得非常好,但我想让用户有机会在不更改手机系统语言设置的情况下更改语言,只需单击一个按钮,然后应用程序就可以更改语言,而无需进行设置

代码如下:

主要问题:

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

  void main() => runApp(MyApp());

  class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) => MaterialApp(
      supportedLocales: [
      Locale('en', "ZA"),
      Locale('pt', "MZ"),
      ],
      localizationsDelegates: [
      AppLocalizations.delegate,
      GlobalMaterialLocalizations.delegate,
      GlobalWidgetsLocalizations.delegate
      ],
      localeResolutionCallback: (locale, supportedLocales) {
       for (var supportedLocale in supportedLocales) {
        if (supportedLocale.languageCode == locale.languageCode &&
            supportedLocale.countryCode == locale.countryCode) {
          return supportedLocale;
          } else {
          if (MyHomePage.local != null) {
            for (int i = 0; i < supportedLocales.length; i++) {
              if (MyHomePage.local == supportedLocales.elementAt(i)) {
                return supportedLocales.elementAt(i);
              }}}}}
            return supportedLocales.first;
            },
           home: MyHomePage(),
          );}

         class MyHomePage extends StatefulWidget {
         @override
         _MyHomePageState createState() => _MyHomePageState();

           class _MyHomePageState extends State<MyHomePage> {
           getLocale() {
           Locale myLocale = Localizations.localeOf(context);
            print(myLocale);}

            @override
             Widget build(BuildContext context) {
              getLocale();
               return Scaffold(
                body: Center(
                child: Padding(
                 padding: const EdgeInsets.all(8.0),
                  child: Column(
                  mainAxisSize: MainAxisSize.min,
                  children: <Widget>[
                   Text(
                   AppLocalizations.of(context).translate('first_string'),
                   style: TextStyle(fontSize: 25),
                   textAlign: TextAlign.center,),
                  Text(
                  AppLocalizations.of(context).translate('second_string'),
                    style: TextStyle(fontSize: 25),
                    textAlign: TextAlign.center,),
                    RaisedButton(
                      child: Text('PT'),
                    onPressed: () {},
                     ),],),),),);}}
导入“包装:颤振/材料.省道”;
导入“package:flatter_app_darkmode/app_localizations.dart”;
导入“package:flatter_本地化/flatter_本地化.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文)=>MaterialApp(
支持的区域设置:[
地区('en','ZA”),
语言环境('pt','MZ'),
],
本地化授权:[
AppLocalizations.delegate,
GlobalMaterialAllocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
localeResolutionCallback:(locale,supportedLocales){
for(supportedLocales中的var supportedLocale){
如果(supportedLocale.languageCode==locale.languageCode&&
supportedLocale.countryCode==locale.countryCode){
返回支持的语言环境;
}否则{
如果(MyHomePage.local!=null){
for(int i=0;i\u MyHomePageState();
类_MyHomePageState扩展状态{
getLocale(){
Locale myLocale=Localizations.localeOf(上下文);
打印(myLocale);}
@凌驾
小部件构建(构建上下文){
getLocale();
返回脚手架(
正文:中(
孩子:填充(
填充:常数边集全部(8.0),
子:列(
mainAxisSize:mainAxisSize.min,
儿童:[
正文(
AppLocalizations.of(context).translate('first_string'),
样式:TextStyle(字体大小:25),
textAlign:textAlign.center,),
正文(
AppLocalizations.of(context.translate)(“第二个字符串”),
样式:TextStyle(字体大小:25),
textAlign:textAlign.center,),
升起的按钮(
子项:文本('PT'),
按下:(){},
),],),),),);}}
应用程序位置类:

import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class AppLocalizations {
final Locale locale;

  AppLocalizations(this.locale);

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

    static const LocalizationsDelegate<AppLocalizations> delegate =
    _AppLocalizationsDelegate();

    Map<String, String> _localizedStrings;

       Future<bool> load() async {
       String jsonString =
        await rootBundle.loadString('lang/${locale.languageCode}.json');

        Map<String, dynamic> jsonMap = json.decode(jsonString);

       _localizedStrings = jsonMap.map((key, value) {
       return MapEntry(key, value.toString());
        });

        return true;}

       String translate(String key) {
      return _localizedStrings[key];}}

     class _AppLocalizationsDelegate
     extends LocalizationsDelegate<AppLocalizations> {
     const _AppLocalizationsDelegate();

       @override
       bool isSupported(Locale locale) {
       return ['en', 'pt'].contains(locale.languageCode);}

       @override
       Future<AppLocalizations> load(Locale locale) async {
       AppLocalizations localizations = new AppLocalizations(locale);
       await localizations.load();
       return localizations;}

        @override
        bool shouldReload(_AppLocalizationsDelegate old) => false;}
导入'dart:async';
导入“dart:convert”;
进口“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
类应用程序本地化{
最终地点;
应用程序本地化(this.locale);
的静态应用程序本地化(BuildContext上下文){
返回本地化(上下文、应用本地化);
}
静态常量本地化Legate委托=
_AppLocalizationsDelegate();
地图本地化字符串;
Future load()异步{
字符串jsonString=
等待rootBundle.loadString('lang/${locale.languageCode}.json');
Map jsonMap=json.decode(jsonString);
_localizedStrings=jsonMap.map((键,值){
返回MapEntry(key,value.toString());
});
返回true;}
字符串转换(字符串键){
返回_localizedStrings[key];}
类_AppLocalizationsDelegate
扩展本地化数据包{
const_AppLocalizationsDelegate();
@凌驾
bool isSupported(区域设置){
返回['en','pt'].contains(locale.languageCode);}
@凌驾
未来加载(区域设置)异步{
ApplLocalizations localizations=新的ApplLocalizations(区域设置);
等待本地化。加载();
返回本地化;}
@凌驾
bool应该重新加载(_applocalizationsdelegateold)=>false;}

您可以使用最喜欢的状态管理方法设置
MaterialApp
locale
属性。例如:

类MyApp扩展StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
(BuildContext上下文)的静态_MyAppState=>context.findAncestorStateOfType();
}
类MyAppState扩展了状态{
地点(Locale);;
void setLocale(区域设置值){
设置状态(){
_语言环境=值;
});
}
@凌驾
小部件构建(构建上下文){
返回材料PP(
地区:_地区,
主页:Dashboard(),
);
}
}
类Dashboard扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
文本按钮(
子项:文本(“将区域设置设置为德语”),
onPressed:()=>MyApp.of(context).setLocale(Locale.fromSubtags(languageCode:'de')),
),
文本按钮(
子项:文本(“将语言环境设置为英语”),
onPressed:()=>MyApp.of(context).setLocale(Locale.fromSubtags(languageCode:'en')),
),
],
);
}
}

您必须使用颤振提供的本地化。您必须为支持的语言使用自定义委托和JSON文件。 我使用
bloc

后续步骤

  • 在根文件夹中创建文件夹
    assets/languages/
  • 为支持的语言创建
    JSON
    文件。 比如:en.json,es.json
  • 为每个文件中的字符串创建键、值对,并相应地使用它们的特定语言字符串
  • main.dart
    create default
    locale、supportedLocales和
    
    import 'package:flutter/material.dart';
    import 'package:flutter_bloc/flutter_bloc.dart';
    import 'package:flutter_localizations/flutter_localizations.dart';
    
    import 'package:movie_app/common/constants/languages.dart';
    import 'package:movie_app/presentation/app_localizations.dart';
    import 'package:movie_app/presentation/blocs/language/language_bloc.dart';
    import 'package:movie_app/presentation/journeys/home/home_screen.dart';
    
    class MovieApp extends StatefulWidget {
      @override
      _MovieAppState createState() => _MovieAppState();
    }
    
    class _MovieAppState extends State<MovieApp> {
      LanguageBloc _languageBloc;
    
      @override
      void initState() {
        _languageBloc = LanguageBloc();
        super.initState();
      }
    
      @override
      void dispose() {
        _languageBloc.close();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return BlocProvider<LanguageBloc>.value(
          value: _languageBloc,
          child: BlocBuilder<LanguageBloc, LanguageState>(
            builder: (context, state) {
              if (state is LanguageLoaded) {
                return MaterialApp(
                    debugShowCheckedModeBanner: false,
                    title: 'Movie App',
                    home: HomeScreen(),
                    supportedLocales:
                        Languages.languages.map((e) => Locale(e.code)).toList(),
                    locale: state.locale,
                    localizationsDelegates: [
                      AppLocalizations.delegate,
                      GlobalMaterialLocalizations.delegate,
                      GlobalWidgetsLocalizations.delegate,
                    ],
                  );
              }
              return SizedBox.shrink();
            },
          ),
        );
      }
    }
    
    class LanguageEntity {
      final String code;
      final String value;
    
      const LanguageEntity({
         this.code,
         this.value,
      });
    }
    
    class Languages {
      const Languages._();
    
      static const languages = [
        LanguageEntity(code: 'en', value: 'English'),
        LanguageEntity(code: 'es', value: 'Spanish'),
      ];
    }
    
    
    import 'dart:convert';
    
    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    import 'package:movie_app/common/constants/languages.dart';
    
    class AppLocalizations {
      final Locale locale;
    
      AppLocalizations(this.locale);
    
      static const LocalizationsDelegate<AppLocalizations> delegate =
          _AppLocalizationDelagate();
    
      static AppLocalizations of(context) =>
          Localizations.of<AppLocalizations>(context, AppLocalizations);
    
      Map<String, String> _localisedString;
    
      Future<bool> load() async {
        final jsonString = await rootBundle
            .loadString('assets/languages/${locale.languageCode}.json');
        final Map<String, dynamic> jsonMap = json.decode(jsonString);
        _localisedString =
            jsonMap.map((key, value) => MapEntry(key, value.toString()));
        return true;
      }
    
      String translate(String key) {
        return _localisedString[key];
      }
    }
    
    class _AppLocalizationDelagate extends LocalizationsDelegate<AppLocalizations> {
      const _AppLocalizationDelagate();
    
      @override
      bool isSupported(Locale locale) {
        return Languages.languages
            .map((e) => e.code)
            .toList()
            .contains(locale.languageCode);
      }
    
      @override
      bool shouldReload(covariant LocalizationsDelegate old) {
        return false;
      }
    
      @override
      Future<AppLocalizations> load(Locale locale) async {
        AppLocalizations appLocalizations = AppLocalizations(locale);
        await appLocalizations.load();
        return appLocalizations;
      }
    }
    
    import 'dart:async';
    
    import 'package:bloc/bloc.dart';
    // import 'package:equatable/equatable.dart';
    import 'package:flutter/material.dart';
    import 'package:movie_app/common/constants/languages.dart';
    import 'package:movie_app/domain/entities/language_entity.dart';
    
    part 'language_event.dart';
    part 'language_state.dart';
    
    class LanguageBloc extends Bloc<LanguageEvent, LanguageState> {
      LanguageBloc() : super(LanguageLoaded(Locale(Languages.languages[0].code)));
    
      @override
      Stream<LanguageState> mapEventToState(
        LanguageEvent event,
      ) async* {
        if (event is ToggleLanguageEvent) {
          yield LanguageLoaded(Locale(event.language.code));
        }
      }
    }
    
    part of 'language_bloc.dart';
    
    abstract class LanguageEvent {
      const LanguageEvent();
    }
    
    class ToggleLanguageEvent extends LanguageEvent {
      final LanguageEntity language;
    
      ToggleLanguageEvent(this.language);
    }
    
    part of 'language_bloc.dart';
    
    abstract class LanguageState {
      const LanguageState();
    
    }
    
    class LanguageLoaded extends LanguageState {
      final Locale locale;
    
      LanguageLoaded(this.locale);
    }
    
    RaisedButton(child: ,RaisedButton(child: Text('Switch', 
         onPressed: (int index) {
            BlocProvider.of<LanguageBloc>(context).add(
              ToggleLanguageEvent(
                Languages.languages[index], // index value can be 0 or 1 in our case
              ),                            // 0 - en, 1 - es
            );
            Navigator.of(context).pop();
          },
    );
    
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    import 'package:flutter_localizations/flutter_localizations.dart';
    import 'package:flutter_easyloading/flutter_easyloading.dart';
    import 'package:shared_preferences/shared_preferences.dart';
    
    void main() {
      WidgetsFlutterBinding.ensureInitialized(); //To solve problem (ServicesBinding.defaultBinaryMessenger was accessed before the binding was initialized)
      runApp(MainApp());
    }
    
    class MainApp extends StatefulWidget {
      const MainApp({Key? key}) : super(key: key);
      
      /*
      To Change Locale of App
       */
      static void setLocale(BuildContext context, Locale newLocale) async {
        _MainAppState? state = context.findAncestorStateOfType<_MainAppState>();
    
        var prefs = await SharedPreferences.getInstance();
        prefs.setString('languageCode', newLocale.languageCode);
        prefs.setString('countryCode', "");
    
        state?.setState(() {
          state._locale = newLocale;
        });
        
      }
    
      @override
      _MainAppState createState() => _MainAppState();
    }
    
    class _MainAppState extends State<MainApp> {
      Locale _locale = Locale('ar', 'ps');
    
      @override
      void initState() {
        super.initState();
        this._fetchLocale().then((locale) {
          setState(() {
            this._locale = locale;
          });
        });
      }
    
    
      /*
      To get local from SharedPreferences if exists
       */
      Future<Locale> _fetchLocale() async {
        var prefs = await SharedPreferences.getInstance();
    
        String languageCode = prefs.getString('languageCode') ?? 'ar';
        String countryCode = prefs.getString('countryCode') ?? 'ps';
    
        return Locale(languageCode, countryCode);
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          locale: _locale,
          localizationsDelegates: [
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
            GlobalCupertinoLocalizations.delegate,
            const FallbackCupertinoLocalisationsDelegate(),
          ],
          supportedLocales: [
            const Locale('en', ''), // English, no country code
            const Locale('ar', ''), // Arabic, no country code
          ],
          theme: ThemeData(
            primarySwatch: Colors.deepPurple,
          ),
          home: InitializeApp(), // here use your own home name...
        );
      }
    }
    
    
    /*
      To solve problem of hold press on inputs
     */
    class FallbackCupertinoLocalisationsDelegate extends LocalizationsDelegate<CupertinoLocalizations> {
      const FallbackCupertinoLocalisationsDelegate();
    
      @override
      bool isSupported(Locale locale) => true;
    
      @override
      Future<CupertinoLocalizations> load(Locale locale) =>
          DefaultCupertinoLocalizations.load(locale);
    
      @override
      bool shouldReload(FallbackCupertinoLocalisationsDelegate old) => false;
    }
    
    import 'package:yout_project_name/main.dart';
    
    DropdownButton(
      onChanged: (v) => setState(() {
        MainApp.setLocale(context, Locale(v.toString(), ""));
      }),
      value: AppLocalizations.of(context)!.locale.toString(), // change this line with your way to get current locale to select it as default in dropdown
      items: [
        DropdownMenuItem(
          child: Text( 'English'), value: 'en'
        ),
        DropdownMenuItem(
          child: Text( 'العربية'), value: 'ar'
        ),
      ],
    )