单一存储库中的国际化

问题描述 投票:0回答:3

我有一个应用程序(只是前端),其代码是在 monorepo 中构建的。每个自定义小部件都有单独的包。我还想要一个包含所有翻译的软件包。这样,如果另一个包需要翻译,我只需要导入该包即可。所以我创建了翻译包,并在我刚刚编写的主文件中(这里我使用

intl
):

export 'package:flutter_gen/gen_l10n/app_localizations.dart';

现在,如果我将该包导入到另一个包中,并使用以下命令导入该文件:

import 'package:l10n/l10n.dart';

它告诉我未使用该导入,并且当我使用翻译时出现错误

AppLocalizations.of(context)!.foo

flutter dart internationalization monorepo
3个回答
0
投票

如果你使用VScode(不知道其他编辑器)你必须手动导入生成的翻译包:

import 'package:flutter_gen/gen_l10n/app_localizations.dart';

0
投票

似乎无法按设计导出生成的文件(查看此 github 问题)。我发现解决我的问题的最佳解决方案如下:

  1. 在项目内创建一个翻译包,如
    packages/translations
    中所示,并将该包添加到主项目的
    pubspec.yaml
    中。像这样:
dependencies:
  flutter:
    sdk: flutter
  translations:
    path: packages/translations
  1. 在该包中创建一个
    l10n.yaml
    文件,如下所示:
arb-dir: lib
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
synthetic-package: false
  1. 如果您在 git 存储库中工作,请在
    packages/translations/lib/app_localizations*.dart
     中添加 
    .gitignore
  2. 现在,如果您在该翻译包中运行
    flutter packages get && flutter gen-l10n
    ,所有翻译都将自动生成(假设它们位于
    packages/translations/lib/app_xx.arb
    中)
  3. 现在您可以使用
    import 'package:translations/app_localizations.dart';
  4. 从主包导入翻译文件

唯一的缺点是,当您输入

flutter pub get
时,翻译不会自动生成(请参阅此问题)。为了重新生成它们,您每次都必须在
flutter gen-l10n
包中键入
translations
。可以通过使用管理 Dart monorepo 项目的工具(如 melos)来改进该解决方案。

我所描述的示例实现(包括 melos)可以在 this github repo

中找到

0
投票

如果我使用 intl 和 flutter_localizations 包会怎么样? 我应该如何实现这个?

© www.soinside.com 2019 - 2024. All rights reserved.