---
title: "Why does my ICU plural translation show the wrong form?"
description: "Usually because `one` is treated as \"exactly 1\". In French `one` also matches 0 and in Russian 21 and 31, so use `=1` for an exact match. Other causes are translations that keep the source language's categories, a missing `other`, and `zero` used where `=0` was meant."
category: icu-message-format
date: 2026-10-09
canonical: https://localizely.com/i18n-questions/icu-message-format/why-does-my-icu-plural-translation-show-the-wrong-form/
---

# Why does my ICU plural translation show the wrong form?

Almost always because a branch name was read as a number. `one`, `few` and `many` are CLDR categories whose meaning depends on the language, and a category without a branch silently falls back to `other`. The usual causes, in order of frequency:

1. `one` is not "exactly 1". In English it covers only 1, but in French it also covers 0, and in Russian it covers 1, 21, 31 and 101 but not 11. A Russian branch `one {You have one new message}` is therefore shown for 21 messages too, because the category describes the grammatical form of the noun, not the quantity. For a sentence about exactly one, use the exact match `=1`, which is checked before the categories in every language.

2. The source language's categories were copied. English needs `one` and `other`; Polish needs `one`, `few`, `many` and `other`. A Polish translation that keeps the English structure, `{n, plural, one {# plik} other {# plików}}`, prints `2 plików` instead of `2 pliki`, because `few` is missing and 2 falls back to `other`. Translators must use the categories of their own language, listed per language on the [language plural rules](/language-plural-rules/) page.

3. `other` is missing. ICU refuses to parse a plural or select without it, so the whole message fails rather than a single form (ICU4J throws `IllegalArgumentException: Missing 'other' keyword in plural pattern`).

4. `zero` was used for 0. `zero` is a real category only in a few languages, such as Arabic and Latvian. In English it is never selected, so `zero {No items}` is dead text and 0 prints `0 items`. Use `=0` for a special case at zero.

5. The formatter's locale is wrong. The plural rules and the formatting of `#` come from the locale the message is formatted with, not from the text of the translation. A Russian message formatted with an English `MessageFormat` applies English rules, so 5 lands in `other` and prints `5 файла` instead of `5 файлов`, and `#` is grouped the English way (`1,000`).

A translation tool with plural validation catches the second and third causes before release. Localizely's [QA checks](/qa-checks/), for example, flag a plural translation that is missing one of the forms its language requires. To see which branch a value selects, paste the message and pick the language in the [ICU message editor](/icu-message-editor/).

Source: https://localizely.com/i18n-questions/icu-message-format/why-does-my-icu-plural-translation-show-the-wrong-form/
