Flutter вручную меняет язык с помощью flutter_localizations и intl
Я создаю
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,
)),
],
);
}
}
Я реализовал flutter_localizations и intl в файле main.dart следующим образом:
localizationsDelegates: [
L.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: L.delegate.supportedLocales,
Поддерживаемые языки:
en
а также
de
и сгенерирован пакетом intl.
1 ответ
Виджет MaterialApp получает параметр locale, который получает экземпляр Locale. Вы должны сохранить (SQL, общие настройки, куст, 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,
);
Вот и все. Вы, конечно, можете использовать предпочитаемый вами инструмент управления состоянием, чтобы сделать это лучше, но это ядро той реализации, которая вам нужна.