繁体   English   中英

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

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

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

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

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

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

在除 UI(我们无权访问Context )之外的其他层内进行国际化的最佳实践是什么,例如在 Api、存储库、Bloc 或 Cubit 内使用国际化?

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

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

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

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

简短示例:

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

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

使用easy_localization package 实际上很容易实现。您不需要上下文,可以像这样访问字符串:

final text = LocaleKeys.books_details_delete.tr();

此解决方案的唯一缺点是它使用代码生成,因此您需要在字符串更改后重建项目。

有关更多详细信息,我已经编写了一个带有教程的示例应用程序

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM