【问题标题】:How to fix "ICU Syntax Error: Expected > "identifier" but found "0"." error in Flutter 3.7.0如何修复 Flutter 3.7.0 中的 \"ICU Syntax Error: Expected > \"identifier\" but found \"0\".\" 错误
【发布时间】:2023-02-03 08:46:57
【问题描述】:

更新到 Flutter 3.7.0 后,我在构建应用程序时收到此错误消息:

[app_en.arb:scanCode_fieldNotMatched] ICU 语法错误:预期 “标识符”但发现“0”。 要匹配的字段是“{0}”

变量在 .arb 本地化文件中的写入方式似乎发生了变化。

【问题讨论】:

    标签: flutter dart messageformat


    【解决方案1】:

    更新 1:转义语法字符!

    如果您尝试在字符串中使用字符 {}'(或与此相关的任何其他语法字符),那么您将不得不对它们进行转义。为此,通过添加以下内容来启用 use-escaping 标志l10n.yaml

    use-escaping: true
    
    

    现在使用成对的单引号来转义语法字符,例如“{”。要转义单引号,您只需将其写成双单引号,如下所示:

    {
      "some_text": "Using the '{' character '{isn''t}' trivial?"
    }
    

    flutter docu 中的更多详细信息。


    更新 2:如果你使用的是 Flutter 中文镜像

    按照this issue中的详细信息。


    我的准时问题的原始答案

    我发现这个错误的原因是颤振 3.7

    国际化支持已经完全改进! [他们]已经完全重写了 gen-l10n 工具......

    release post 中所述。


    以前我在我的.arb文件如下

    "scanCode_fieldNotMatched": "field to match is "{0}"",
    

    之后我将 {0} 替换为其他值。

    好吧,现在 gen-l10n 工具似乎将括号之间的内容作为特殊参数,并且名称 "0" 不被接受所以我不得不将我的字符串更改为

    "scanCode_fieldNotMatched": "field to match is "{value0}"",
    

    AppLocalizations 现在可以称为:

    AppLocalizations.of(context)!.scanCode_fieldNotMatched("something here to replace value0!")
    

    可以在此处找到有关此的更多详细信息:Placeholders, plurals, and selects in Flutter

    【讨论】:

    • 你知道在翻译中如何使用大括号吗?例如。 “密码中允许的字符”的用例。我们会有类似 ...=|\(){}[]... 的东西,但现在不允许这样做了,因为我们在那里有 {}
    • 遗憾的是,这并不能解决问题,因为在他们的样本 arb 文件中没有“{0}”,
    • @AxisStarstreamer,要了解如何转义语法字符,请查看我更新的答案(更新 1)。
    • @zakiblacki,如果您使用的是 Flutter China 镜像,也许我的回答的“更新 2”可以帮助您。
    【解决方案2】:

    就我而言,这是由于我的arb 文件中的 i18n 包的翻译字符串。我有:

    "{x, plural, =1{item}, other{items}}"(在以前的版本中工作正常)

    这在 Flutter 3.7 中被打破了。我的解决方案是删除逗号:

    "{x, plural, =1{item} other{items}}"(适用于 Flutter 3.7)

    【讨论】:

      猜你喜欢
      • 2021-02-08
      • 2023-02-04
      • 2021-07-31
      • 2021-03-01
      • 2023-01-03
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多