【问题标题】:Why is Flutter not generating the internationalization files?为什么 Flutter 不生成国际化文件?
【发布时间】:2020-12-07 13:14:29
【问题描述】:

我正在尝试遵循 https://flutter.dev/docs/development/accessibility-and-localization/internationalization#dart-toolshttps://docs.google.com/document/d/10e0saTfAv32OZLRmONy866vnaw0I2jwL8zukykpgWBc/edit#heading=h.upcu5w85cvc2 中的国际化文档,但它没有生成任何文件。

基本上它说要在 pub spec.yaml 文件中制作这些模组:

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  intl: ^0.17.0-nullsafety.2
flutter:
  generate: true

然后创建一个<project-root>/l10n.yaml 文件,其中包含:

arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart

最后用这样的东西创建app_en.arb

{
  "@@locale": "en",

  "helloWorld": "Hello World!",
  "@helloWorld": {
    "description": "The conventional newborn programmer greeting"
  }
}

从那里指南说将自动生成一个flutter_gen/gen_l10n/app_localizations.dart 文件。

除了什么都没有发生。我在 Android Studio 中工作并做了一个pub get,并尝试了一个flutter cleanflutter build ios 以及我想不到的所有其他内容,但没有构建该文件。

有什么想法吗?

【问题讨论】:

  • 对我来说,文件名和.yaml 配置名是i10n 而不是l10n
  • @ArieDov 这个名字确实是l10n(小写L),而不是i10n。如果这对你有用,那意味着你把它和其他地方的名字搞砸了。
  • 天啊,我刚刚注意到我的本地化文件没有在应用程序运行时自动生成,因为我在 lib/ 文件夹中创建了文件 l10n.yaml。但它清楚地写着to the root directory of the Flutter project。我更改了位置,现在它按预期工作。

标签: flutter internationalization


【解决方案1】:

除了@drekka 的回答,

你需要跑

flutter gen-l10n

如果不是自动生成的。

【讨论】:

  • 谢谢!它没有很好的记录,因为在我的案例中翻译是自动生成的,但我想生成它们而无需运行应用程序。
  • 其实在有翻译缺失的情况下,在手动生成l10n文件完成之前,无法通过vscode运行应用程序,TY
【解决方案2】:

好的。做了一些更多的挖掘,我已经解决了。基本上 Flutter 文档有点过时了。

首先,正在生成生成的文件,但它们位于 <project_dir>.dart_tools/flutter_gen/genl10n 中。生成器会创建一个可自动用于项目的合成包,因此无需进一步更改pubspec.yaml

其次,您的main.dart 必须如下所示:

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

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: AppLocalizations.localizationsDelegates,
      supportedLocales: AppLocalizations.supportedLocales,
      title: 'My app',
      home: ... ,
    );
  }
}

这里有两件事:

  1. app_localizations.dart 生成文件的导入(文档确实提到但可能解释得不好)和 ...
  2. 更改localizationsDelegatessupportedLocales。您不需要列出文档中提到的所有代表和语言环境,因为生成的本地化文件会自动包含它们。只需切换到AppLocalizations 的两个属性即可。

PS

写完上述内容后,我尝试将应用程序的标题国际化:

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: AppLocalizations.localizationsDelegates,
      supportedLocales: AppLocalizations.supportedLocales,
      title: AppLocalizations.of(context).applicationTitle,
      home: ... ,
    );
  }

史诗般的失败 - 原因是在解决标题时,还没有设置代表和语言环境,所以从 AppLocalizations.of(context) 返回的是 null。相反,您需要像这样更改为onGeneratedTitle

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: AppLocalizations.localizationsDelegates,
      supportedLocales: AppLocalizations.supportedLocales,
      onGenerateTitle: (context) => AppLocalizations.of(context).applicationTitle,
      home: ... ,
    );
  }
```.  

`onGeneratedTitle` is called after the widget is setup which means localisation is available.

【讨论】:

  • 我放弃了原生方案,改用IDE pluginlike(localizely.com/flutter-localization-workflow)。 Dart intl tools也会自动生成翻译码吗?
  • 我看不到。那里没有关于处理翻译的明显内容。在我开始工作后,我下载了一个应用程序 Babel,它是 *arb 文件的编辑器。这有点古怪,在某些地方,但总的来说似乎运作良好,我喜欢它自动为我运行谷歌翻译的事实。有点像作弊而不必先学习语言。希望它是合理准确的:-)
【解决方案3】:

当需要通过完全没有 IDE 的 CLI 生成这些文件时遇到类似问题(在 CircleCI 上)。

首先,您应该将intl_utils 作为项目依赖项或全局激活。

要将其安装为依赖项(并管理每个项目的版本) - 只需将intl_utils: ^2.1.0 添加到您的pubspec.yamldependencies 部分(不要忘记设置您需要的版本)。之后,从项目目录运行:

flutter gen-l10n --template-arb-file=intl_en.arb
flutter pub run intl_utils:generate

(将intl_en.arb 更改为您的实际.arb 文件名或省略整个参数以防匹配默认app_en.arb

要全局激活intl_utils(并在所有项目中使用intl_utils 的单一版本),请执行以下操作:

dart pub global activate intl_utils 2.1.0

然后从项目目录运行:

flutter gen-l10n --template-arb-file=intl_en.arb
dart pub global run intl_utils:generate

在我的例子中,由于项目尚未迁移到使用 null 安全性,将 intl_utils 作为项目依赖项会导致 null 安全性问题,因此诀窍是在全局范围内使用 intl_utils 1.9.0

【讨论】:

    【解决方案4】:

    我现在也遇到了同样的问题。我不知道为什么会这样,但我发现这个post 提供了相同的信息,并决定尝试使用它提到的插件。

    该插件名为“Flutter Intl”,可用于Android StudioVSCode。您需要在 IDE 中安装它并运行“Flutter Intl: initialize”命令。此操作应创建包含所有所需样板的“lib/generated”文件夹。

    【讨论】:

    • 是的,我已经看到了,但是我需要在 Bitrise 上构建应用程序,这意味着在没有 Android Studio 的情况下构建。所以我认为这行不通。 :-(
    • 查看我上面关于如何解决此问题的回复。
    • 我在 android studio IDE 中安装了插件,但没有得到“lib/generated”
    【解决方案5】:

    在终端或命令行上运行:dart pub global activate intl_utils 2.1.0

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案6】:

    遇到了同样的问题。偶然发现我在lib 目录而不是基本目录中创建了 l10n.yaml。将它移到应有的位置,一切正常!

    【讨论】:

    • 大声笑,在阅读您的答案之前,我刚刚注意到这是我的问题。
    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 2011-02-07
    • 2022-07-05
    • 2022-08-20
    • 2020-04-27
    • 2021-03-21
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多