Flutter -使用Intl翻译对Cubit/ Bloc内的消息进行应用程序本地化

piah890a  于 2023-01-10  发布在  Flutter
关注(0)|答案(2)|浏览(143)

我正在Flutter中开发一个多语言应用程序。
我在官方文档后面的小部件/屏幕中实现本地化字符串没有问题:https://flutter.dev/docs/development/accessibility-and-localization/internationalization.
但是...我的应用会调用大量API,这些API由适当的Cubits和Repository在后台处理。对于这些调用和其他更深层的逻辑,我希望以适当的语言提供状态消息(例如,对于snackbars)。我面临的问题是,我无法访问cubits内部的本地化字符串来向国家提供消息。即使我试图将上下文传递给腕尺,它也看不到它们。
任何人都有一个想法吗?我宁愿按照官方的方法,而不必完全重构应用程序...谢谢期待!

pbgvytdp

pbgvytdp1#

有人帮我解决了这个问题。解决方案很简单。你必须把appLocalization本身传递到Cubits中。下面是我的main.dart:

runApp(
    MaterialApp(
      localizationsDelegates: [
        AppLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('en', ''),
        const Locale('pl', ''),
      ],
      title: 'MySuperApp',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.orange,
        accentColor: Colors.deepOrangeAccent,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      initialRoute: '/',
      routes: {
        UserAuthScreen.routeName: (context) => const UserAuthScreen(),
        HomePage.routeName: (context) => HomePage(),
        ...
      }, 
      builder: (context, child) {
        final appLocalizations = AppLocalizations.of(context); //IMPORTANT
        return MultiBlocProvider(
          providers: [
            BlocProvider<ConstantsCubit>(
              lazy: true,
              create: (context) => ConstantsCubit(
                constantsRepository: ConstantsRepository(),
              ),
            ),
            BlocProvider<UserAuthCubit>(
              lazy: true,
              create: (context) => UserAuthCubit(
                localizations: appLocalizations, //THIS IS WHERE THE MAGIC HAPPENS
                repository: UserAuthRepository(),
              ),
            ),
            BlocProvider<DoerInfoCubit>(
                lazy: true,
                create: (context) => DoerInfoCubit(
                      doerInfoRepository: DoerInfoRepository(),
                      userAuthCubit: BlocProvider.of<UserAuthCubit>(context),
                    )),
            ...
          ],
          child: child,
        );
      },
      home:
          BlocBuilder<UserAuthCubit, UserAuthState>(builder: (context, state) {
        if (state is UserAuthLogged) {
          return HomePage();
        } else {
          return const UserAuthScreen();
        }
      }),
    ),
  );

UserAuthCubit声明如下所示:

class UserAuthCubit extends Cubit<UserAuthState> {
  final UserAuthRepository repository;
  final AppLocalizations localizations; //THIS IS WHERE THE MAGIC HAPPENS

  UserAuthCubit({
    @required this.repository,
    @required this.localizations,
  }) : super(const UserAuthInitial()) {
    getUserAuthState();
  }

重要提示-为了确保解决方案有效- AppLocalizatons必须在main. dart中的Cubits之前**声明。另外-语言更改后,应用程序立即在小部件中采用新的本地化。但是,使用此设置,我无法为Cubits实现这一点。它们需要重新启动应用程序。在真实的生活中,这应该不是问题...我猜。

5sxhfpxr

5sxhfpxr2#

使用easy_localization包很容易做到,唯一的缺点是每次字符串更改都要生成代码,否则它不需要上下文来获取字符串,如下所示:

LocaleKeys.app_title.tr()

查看整个tutorial如何设置和使用EasyLocalization。

相关问题