为什么 Flutter 不生成国际化文件?

dre*_*kka 10 internationalization flutter

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

基本上它说将这些 mod 制作到 pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  intl: ^0.17.0-nullsafety.2
flutter:
  generate: true
Run Code Online (Sandbox Code Playgroud)

然后创建一个<project-root>/l10n.yaml包含以下内容的文件:

arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
Run Code Online (Sandbox Code Playgroud)

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

{
  "@@locale": "en",

  "helloWorld": "Hello World!",
  "@helloWorld": {
    "description": "The conventional newborn programmer greeting"
  }
}
Run Code Online (Sandbox Code Playgroud)

从那里导游说 flutter_gen/gen_l10n/app_localizations.dart将自动生成文件。

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

有任何想法吗?

DIE*_*SEL 27

当需要通过 CLI 生成这些文件而不需要 IDE 时(在 CircleCI 上),遇到了类似的问题。

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

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

flutter gen-l10n --template-arb-file=intl_en.arb
flutter pub run intl_utils:generate
Run Code Online (Sandbox Code Playgroud)

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

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

dart pub global activate intl_utils 2.1.0
Run Code Online (Sandbox Code Playgroud)

然后从项目目录运行:

flutter gen-l10n --template-arb-file=intl_en.arb
dart pub global run intl_utils:generate
Run Code Online (Sandbox Code Playgroud)

就我而言,由于项目尚未迁移到使用空安全性,因此intl_utils项目依赖性导致空安全性问题,因此技巧是intl_utils 1.9.0全局使用。


Thà*_*ảng 17

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

dart pub global run intl_utils:generate

  • 通过额外的支持信息可以改进您的答案。请[编辑]添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (5认同)

Sim*_*ham 16

除了@drekka 的回答,

你需要跑

flutter gen-l10n
Run Code Online (Sandbox Code Playgroud)

如果它不是自动生成的。

  • 谢谢!它没有很好的文档记录,因为在我的情况下翻译是自动生成的,但我想生成它们而不必运行应用程序。 (3认同)

dre*_*kka 13

好的。做了更多的挖掘,我已经解决了。基本上 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: ... ,
    );
  }
}

Run Code Online (Sandbox Code Playgroud)

这里有两件事:

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

聚苯乙烯

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

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

史诗般的失败 - 原因是在解析标题时,尚未设置代表和语言环境,因此返回的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.
Run Code Online (Sandbox Code Playgroud)

  • 我放弃了原生解决方案,转而使用“IDE 插件”,例如(https://localizely.com/flutter-localization-workflow)。`Dart intl tools` 也会自动生成翻译代码吗? (2认同)

小智 7

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

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


Som*_*m-1 7

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


Mar*_*rro 5

如果您在 pubspec.yaml 中添加此代码,它将自动生成

flutter_intl:
  enabled: true
  class_name: AppLocalizations
Run Code Online (Sandbox Code Playgroud)