flutterdartflutter-localizations

How to fix ICU Lexing Error: Unexpected character in Flutter


I am using flutter_localizations to localize my app.

Since updating to Flutter 3.7 i am getting this error:

ICU Syntax Error: Expected "identifier" but found "}".

This =|(){}[] obviously

This =|\(){}[] obviously is the text that i have in my .arb file.

I understand that curly braces "{}" have a special meaning and should be escaped, but i can not find the way to correctly escape them, has anyone managed to do so?


One simple way to reproduce the issue is simply following the steps to add localization support here, and then instead of the hello world string, write anything that includes the character "{".


P.S.: There is a releted issue open on Github. Be sure to go and check there for updates!


Solution

  • There is an escaping syntax that is implemented but not enabled by default as it is a new feature that wasn't completely backward compatible with existing ICU message strings.

    First, add the following to your l10n.yaml file:

    use-escaping: true
    

    Then, this will allow you to wrap parts of your strings in single quotes to ignore any syntax within the single quotes; to use a single quote normally as a character and not an escape, use a double single quote. For example,

    {
      message: "This '{isn''t}' obvious"
    }
    

    becomes

    String get message => "This {isn't} obvious";
    

    See here for information on the syntax. I'll add this to the documentation later.