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,
);

Вот и все. Вы, конечно, можете использовать предпочитаемый вами инструмент управления состоянием, чтобы сделать это лучше, но это ядро ​​той реализации, которая вам нужна.

Другие вопросы по тегам