【问题标题】:Flutter: Using Intl.message without args and name parametersFlutter:使用不带 args 和 name 参数的 Intl.message
【发布时间】:2019-04-27 15:08:29
【问题描述】:

当我运行flutter pub pub run intl_translation:extract_to_arb --output-dir=lib/l10n lib/localizations.dart 时,生成器会跳过所有仅包含字符串的 Intl.message 文件,打印:

Skipping invalid Intl.message invocation
    <Intl.message("MESSAGE")>
    reason: The 'args' argument for Intl.message must be specified for messages with parameters. Consider using rewrite_intl_messages.dart
    from lib/main.dart    line: 125, column: 9

doc for the internationalization package 表示 The name and args parameters must match the name (or ClassName_methodName) and arguments list of the function respectively. For messages without parameters, both of these can be omitted. 但在我看来,在这种情况下,我的消息没有参数!

我是否误解了 Dart 开发人员所说的参数是什么意思?

【问题讨论】:

  • 你没有误会。那应该行得通。您的包含消息是否也没有参数?这些也必须匹配。这是我唯一能想到的事。或者你可以提供一个失败的例子。
  • @AlanKnight 包含的消息是什么?
  • 包含函数
  • @AlanKnight 你是对的。它位于 AndroidNotificationDetails 的构造函数中,这是一个来自第三方库的对象,位于 main.dart 中。这里的最佳做法是什么?指定 args,将消息移出构造函数还是完全其他?
  • 您是否忘记将参数添加到方法 Intl.message(...)args 参数中?我遇到了同样的问题,现在如果我将字符串参数传递给args 参数(它采用List&lt;String>),它就可以工作。希望对您有所帮助。

标签: dart flutter internationalization flutter-dependencies


【解决方案1】:

将它从构造函数中移出到一个单独的函数中。您可以从构造函数中调用该函数,但它必须是函数中单独的一条消息。

原因是支持带参数的消息。翻译被生成,至少在概念上,作为一个单独的函数。所以我们有

foo(String name) => Intl.message('Hello $name', name: 'foo', args: [name]);

在某个延迟库 fr_FR 中

foo(String name) => 'Bonjour $name'

Intl.message 的实现是概念上的

currentLanguage.lookup('foo').call(args)

所以一个函数中只能有一个消息,因为我们要用其他东西替换那个函数。它不能是构造函数,因为我们不能仅仅委托给它。

【讨论】:

  • 那么,我是否理解正确,使用 Intl 的正确方法是为我想在应用程序中使用的每个字符串编写 getter?这适用于所有小部件还是仅适用于无状态小部件?如何处理字符串列表?
  • 是的,所有小部件。字符串列表只是通过调用返回字符串的getter/方法/函数填充的列表
  • 好的。这一切都使得使用 Intl 变得不必要的混乱,就像从更简洁的 Android XML 方法中退了一步。希望以后能变得更简洁一些。知道他们为什么选择这条路线并且不支持 Intl.message 的内联调用吗?
  • 需要在函数内部允许带有参数(复数等)的消息很容易。您可以使用不带参数的内联调用来初始化变量,但这可能不适用于任何地方,这是解析它们的方式的限制。
猜你喜欢
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多