Why a plural changes from one language to another
The zero, one, two, few, many and other categories follow each language's CLDR rules. In English, one only means 1; in French it covers 0 and 1; Russian and Polish add few and many; Arabic uses all six; Japanese has a single one, other. A two-branch message written for English is therefore incomplete as soon as you translate it.
The tool reads these rules in your browser (Intl.PluralRules): the categories and example numbers shown are the language's own, with no table to maintain.
The =1 trap with gen-l10n
An =1 branch becomes the one category in the code flutter gen-l10n generates. In French that category also applies to zero: with count = 0, "1 article restant" would show. Prefer the one category with the number in the text, or add an =0 branch: the tool offers it as a checkbox. Details are in the guide on ICU plurals and placeholders.
How to use the result
- Copy each language's
"key": "{count, plural, …}" line into the matching app_xx.arb file.
- Add the
@key metadata once, in the template file.
- Run
flutter gen-l10n: a missing other branch or an unclosed brace stops generation with the file name.
To then check that no translation dropped or renamed its placeholder, use the ARB missing keys checker.
Limits of the tool
The tool generates the structure; you write the text of each form. It does not handle select messages or nested plurals, and does not double apostrophes if you turned on use-escaping in l10n.yaml.