Локализация флаттера без контекста - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь локализовать свое приложение во флаттере. Я создал необходимые файлы string.arb для поддерживаемых языков. Теперь мой вопрос: зачем AppLocalizations.of(context) нужен контекст?

Я просто хочу получить доступ к именованным строкам в файлах / классах файлов / классах. В какой-то момент в приложении я создаю список и заполняю его позже, переопределяя некоторые поля отдельным классом.

Однако этот класс не имеет контекста, но я хочу использовать в нем локализованные строки. Могу ли я написать метод, который дает мне локализацию строки, в которую я положил?

1 Ответ

0 голосов
/ 02 мая 2020

Существует библиотека с именем easy_localization , которая выполняет локализацию без контекста, вы можете просто использовать ее. Библиотека также предоставляет более удобный подход для написания меньшего количества кода и локализации всех сегментов приложения. Пример основного класса:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
  ]).then((_) {
    runApp(EasyLocalization(
      child: MyApp(),
      useOnlyLangCode: true,
      startLocale: Locale('nl'),
      fallbackLocale: Locale('nl'),
      supportedLocales: [
        Locale('nl'),
        Locale('en'),
      ],
      path: 'lang',
    ));
  });
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SplashScreen(),
      supportedLocales: EasyLocalization.of(context).supportedLocales,
      locale: EasyLocalization.of(context).locale,
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        DefaultCupertinoLocalizations.delegate,
        EasyLocalization.of(context).delegate,
      ],
      localeResolutionCallback: (locale, supportedLocales) {
        if (locale == null) {
          EasyLocalization.of(context).locale = supportedLocales.first;
          Intl.defaultLocale = '${supportedLocales.first}';
          return supportedLocales.first;
        }

        for (Locale supportedLocale in supportedLocales) {
          if (supportedLocale.languageCode == locale.languageCode) {
            EasyLocalization.of(context).locale = supportedLocale;
            Intl.defaultLocale = '$supportedLocale';
            return supportedLocale;
          }
        }

        EasyLocalization.of(context).locale = supportedLocales.first;
        Intl.defaultLocale = '${supportedLocales.first}';
        return supportedLocales.first;
      },
    );
  }
}

Также не забудьте указать путь к локализации для вашего pubspec.yamal файла!

После всего этого вы можете просто использовать его в Text виджет вроде этого:

Text(tr('someJsonKey'),),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...