Ich erstelle eine App in Flutter. Bisher verwende ich die Internationalisierung mit JSON, wobei die Sprache der App auf der Sprache basiert, die der Benutzer standardmäßig auf seinem Telefon hat. Es funktioniert ziemlich gut, aber ich möchte es dem Benutzer geben Eine Möglichkeit, die Sprache zu ändern, ohne die Systemspracheneinstellungen des Telefons zu ändern, indem Sie einfach auf eine Schaltfläche klicken und dann die Anwendung die Sprache ändern, ohne die Einstellungen durchgehen zu müssen.
Ich würde empfehlen, sich das Get-Paket anzusehen: pub.dev/packages/get. Die Internationalisierungsunterstützung ist recht robust und einfach zu verwenden. Weitere Informationen finden Sie hier: pub.dev/packages/get#internationalization. Sobald Sie die Schaltfläche gedrückt haben, können Sie die unter „Gebietsschema ändern“ beschriebene Methode verwenden, um die Übersetzungen zu ändern.
Das hat bei mir funktioniert! Mit einer kleinen Änderung: Ich konnte es nicht zum Laufen bringen, wenn meine FlutterApp ein StatfulWidget (z. B. MyApp) als Haupt-„Zuhause“ hatte. Also habe ich das zustandsbehaftete MyApp-Widget in ein zustandsloses Widget (z. B. MyAppWrapper) verpackt. Das Einzige, was der MyAppWrapper tut, ist, dass er über eine Build-Methode verfügt, die MyApp() zurückgibt.
– drpawelo
2. Juli 2021 um 16:16 Uhr
Aber das würde App-Neustarts nicht überleben, oder?
– Marcus
16. Juli 2021 um 16:51 Uhr
@Marcus Es übersteht App-Neustarts tatsächlich nicht. Sie müssten die Daten beibehalten.
– Lautsprecher
12. August 2021 um 11:51 Uhr
Jedes Beispiel, das die Änderungen beibehält
– LearnFlutter
12. April 2022 um 13:07 Uhr
@LearnFlutter, du könntest das verwenden Gemeinsame Einstellungen Verpacken Sie die Daten und behalten Sie sie dort bei, wenn sich die Auswahl ändert. Um die Daten dann zu lesen, könnten Sie Folgendes tun: @override void didChangeDependencies() { SharedPreferencesHelper.getLanguageCode().then((languageCode) { setState(() { _locale = Locale(languageCode); }); }); super.didChangeDependencies(); }
– Sam Bains
21. Mai 2022 um 9:17 Uhr
Balaji Venkatraman
Sie müssen die von Flutter bereitgestellten Lokalisierungen verwenden. Sie müssen benutzerdefinierte Delegate- und JSON-Dateien für Ihre unterstützten Sprachen verwenden. Ich habe mit implementiert bloc
Schritte zum folgen,
Erstellen Sie einen Ordner assets/languages/ im Stammordner
Erstellen JSON Dateien für Ihre unterstützten Sprachen. Wie: en.json, es.json
Erstellen Sie in jeder Datei ein Schlüssel-Wert-Paar für Ihre Zeichenfolgen entsprechend den jeweiligen Sprachzeichenfolgen
In main.dart Standard erstellen locale, supportedLocales and localizationsDelegates.
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));
}
}
}
8.Erstellen Sie nun ein Ereignis
part of 'language_bloc.dart';
abstract class LanguageEvent {
const LanguageEvent();
}
class ToggleLanguageEvent extends LanguageEvent {
final LanguageEntity language;
ToggleLanguageEvent(this.language);
}
Erstellen Sie nun den Status
part of 'language_bloc.dart';
abstract class LanguageState {
const LanguageState();
}
class LanguageLoaded extends LanguageState {
final Locale locale;
LanguageLoaded(this.locale);
}
10.Schaltfläche „Jetzt erstellen“, um die Sprache zu ändern.
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();
},
);
Anmerkung 1: Ich wurde benutzt Gemeinsame Einstellungen Plugin zum Speichern des vom Client ausgewählten Gebietsschemas.
Hinweis 2: Ersetzen ar Und PS mit Ihrem Standardgebietsschema …
Vollständiger Code von main.dart Datei:
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;
}
Von jeder anderen Klasse aus, in der Sie das Gebietsschema ändern müssen, können Sie meinen Weg verwenden:
Importieren main.dart Datei, dann verwenden Sie meinen einfachen DropdownButton:
Hinweis: ersetzen Wert: AppLocalizations.of(context)!.locale.toString(), In dieser Zeile erfahren Sie, wie Sie das aktuelle Gebietsschema der App abrufen können …
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'
),
],
)
Wenn Sie einen Anbieter zur Statusverwaltung verwenden, können Sie diesem Artikel folgen.
Schauen Sie sich das Paket language_builder in pub.dev an. Es ist sehr einfach zu verwenden. Indem Sie Ihr Root-Widget mit LanguageBuilder umschließen, können Sie die Sprache Ihrer App konfigurieren. Weisen Sie Ihre App an, die Sprache des Telefons zu verwenden, oder ändern Sie sie manuell in der App.
Fragen, die nach Ressourcen fragen, gehören nicht zum Thema. Diese Antwort bietet nur einen Link zu einer neuen Ressource und zeigt nicht, wie die Ressource implementiert werden kann, um die Frage im OP zu lösen. Obwohl dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert. – Aus der Rezension
Fragen, die nach Ressourcen fragen, gehören nicht zum Thema. Diese Antwort bietet nur einen Link zu einer neuen Ressource und zeigt nicht, wie die Ressource implementiert werden kann, um die Frage im OP zu lösen. Obwohl dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert. – Aus der Rezension
– Trenton McKinney
28. September 2021 um 18:06 Uhr
14528300cookie-checkSchaltfläche zum Ändern der Sprache Flutteryes
Das könnte für Sie hilfreich sein,Developerlibs.com/2019/03/…
– Shirsh Shukla
18. Dezember 2020 um 12:14 Uhr
Ich würde empfehlen, sich das Get-Paket anzusehen: pub.dev/packages/get. Die Internationalisierungsunterstützung ist recht robust und einfach zu verwenden. Weitere Informationen finden Sie hier: pub.dev/packages/get#internationalization. Sobald Sie die Schaltfläche gedrückt haben, können Sie die unter „Gebietsschema ändern“ beschriebene Methode verwenden, um die Übersetzungen zu ändern.
– Tanay Neotia
19. Dezember 2020 um 20:24
Ich würde Folgendes vorschlagen: medium.com/@puneetsethi25/…
– puspak saha
23. Dezember 2020 um 12:01 Uhr