如何在 BLOC、Cubit 和 Repositories 中使用 flutter 国际化来翻译消息?

How to use flutter internationalization inside BLOC, Cubit And Repositories for translate messages?

我正在使用 Flutter 开发多语言应用程序。

我使用 flutter_localizations 包进行本地化,intl 包进行国际化。

在 Widgets 中的正常方式,我可以在 Context 的帮助下使用它。

但问题是当我想在存储库或除 UI 层之外的其他层中使用国际化时。

除了 UI(我们无法访问 Context)之外的其他层内进行国际化的最佳实践是什么在 Api、Repository、Bloc 或 Cubit?

中使用国际化的示例

注意:我正在寻找一种在应用程序的 BLOC(业务逻辑)内部使用国际化的方法,而不是 UI!

一般来说,最好避免在 UI 层之外使用本地化。如果您使用的是 BLoC 库,则可以在 BlocListener 中显示对话框、快餐栏和类似的小部件。您还可以为您的状态编写一个扩展来处理 UI 层中的本地化。

但是,有一些方法可以在没有 BuildContext 的情况下使用本地化。例如:

  • 您可以使用像 GetIt 这样的服务定位器来访问 AppLocalizations。在 GetIt 的帮助下,您将能够在没有上下文的情况下按类型访问实例。但在 AppLocalizations 的情况下,我们需要将其注册为单例/惰性单例。请注意,您需要向您的应用程序提供这个确切的单例委托,因此您将访问与本地化委托列表中相同的对象。

简短示例:

import 'package:get_it/get_it.dart';

GetIt getIt= GetIt.instance;

void setupServiceLocator() {
  getIt.registerLazySingleton(() => AppLocalizations());
}
  • 您可以通过直接加载并指定语言环境来访问 LocalizationsDelegate 的实例。例如:

AppLocalizations i10n = await AppLocalizations.delegate.load(Locale('en'));

  • 您可以使用不同的本地化库,它不需要上下文来访问翻译对象(如 easy_localization)。通过使用代码生成,您将能够在没有上下文的情况下访问您的翻译密钥。