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

nkcskrwz  于 2023-01-18  发布在  Flutter
关注(0)|答案(9)|浏览(183)

我尝试按照www.example.com和www.example.com中的国际化文档https://flutter.dev/docs/development/accessibility-and-localization/internationalization#dart-toolshttps://docs.google.com/document/d/10e0saTfAv32OZLRmONy866vnaw0I2jwL8zukykpgWBc/edit#heading=h.upcu5w85cvc2,但没有生成任何文件。
基本上它说,使这些mods到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以及其他我想不起来的东西,但没有任何东西在构建那个文件。
有什么想法吗?

rxztt3cl

rxztt3cl1#

除了@drekka的回答,
你得赶紧跑

flutter gen-l10n

如果不是自动生成的话。

jtoj6r0c

jtoj6r0c2#

好的。做了一些进一步的挖掘,我已经解决了这个问题。基本上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生成的文件(文档确实提到了,但可能没有很好地解释)和...
1.修改localizationsDelegatessupportedLocales。你不需要列出文档中提到的所有委托和语言环境,因为生成的本地化文件会自动包含它们。只需切换到AppLocalizations的两个属性即可。

PS

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

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

Epic fail -原因是在解析标题时,代理和语言环境尚未设置,因此从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.
zhte4eai

zhte4eai3#

当需要通过CLI生成这些文件而根本不使用IDE时(在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

jvidinwx

jvidinwx4#

在终端或命令行上运行此命令:

dart发布全局激活intl_utils 2.1.0

dart发布全局运行intl_utils:生成

70gysomp

70gysomp5#

我现在也遇到了同样的问题,我不知道为什么会这样,但是我发现这个post提供了同样的信息,我决定尝试使用它提到的插件。
该插件名为“Flutter Intl”,适用于Android StudioVSCode。您需要将其安装在IDE中并运行“Flutter Intl:初始化”命令。此操作应创建包含所有所需样板文件的“lib/generated”文件夹。

fivyi3re

fivyi3re6#

遇到了同样的问题。意外地发现我在lib目录中创建了l10 nidoyaml而不是base目录。把它移到了应该在的地方,一切都正常了!

9njqaruj

9njqaruj7#

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

flutter_intl:
  enabled: true
  class_name: AppLocalizations
m528fe3b

m528fe3b8#

flutter pub cache clean在这种情况下提供了帮助

zu0ti5jz

zu0ti5jz9#

我也遇到过同样的问题,因为我从另一个开发人员那里导入了这个项目,但是没有一个解决方案能帮到我。你必须在添加依赖项之后删除所有的东西,然后启动程序一次。然后这个文件就被创建了。只有这样你才能把这个文件导入到类中并使用它。

相关问题