我有一个应用程序(只是前端),其代码是在 monorepo 中构建的。每个自定义小部件都有单独的包。我还想要一个包含所有翻译的软件包。这样,如果另一个包需要翻译,我只需要导入该包即可。所以我创建了翻译包,并在我刚刚编写的主文件中(这里我使用
intl
):
export 'package:flutter_gen/gen_l10n/app_localizations.dart';
现在,如果我将该包导入到另一个包中,并使用以下命令导入该文件:
import 'package:l10n/l10n.dart';
它告诉我未使用该导入,并且当我使用翻译时出现错误
AppLocalizations.of(context)!.foo
如果你使用VScode(不知道其他编辑器)你必须手动导入生成的翻译包:
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
似乎无法按设计导出生成的文件(查看此 github 问题)。我发现解决我的问题的最佳解决方案如下:
packages/translations
中所示,并将该包添加到主项目的 pubspec.yaml
中。像这样:dependencies:
flutter:
sdk: flutter
translations:
path: packages/translations
l10n.yaml
文件,如下所示:arb-dir: lib
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
synthetic-package: false
packages/translations/lib/app_localizations*.dart
中添加
.gitignore
flutter packages get && flutter gen-l10n
,所有翻译都将自动生成(假设它们位于 packages/translations/lib/app_xx.arb
中)import 'package:translations/app_localizations.dart';
唯一的缺点是,当您输入
flutter pub get
时,翻译不会自动生成(请参阅此问题)。为了重新生成它们,您每次都必须在 flutter gen-l10n
包中键入 translations
。可以通过使用管理 Dart monorepo 项目的工具(如 melos)来改进该解决方案。
我所描述的示例实现(包括 melos)可以在 this github repo
中找到如果我使用 intl 和 flutter_localizations 包会怎么样? 我应该如何实现这个?