How to handle pluralization across languages

Kinga Pomykała
Kinga Pomykała
Last updated: January 23, 20268 min read
How to handle pluralization across languages

Pluralization: it sounds simple at first. Just add an “s” when there's more than one, right? But as soon as you start translating your app into multiple languages, you quickly discover that languages handle quantities in wildly different ways. Getting plural forms right isn't just cosmetic, it's about clarity, professionalism, and trust in your product.

In this guide, you'll learn why pluralization matters in software localization, how plural rules differ across languages, and how to implement plural forms reliably in multilingual applications using standards like ICU MessageFormat and tools like SimpleLocalize.

Why pluralization isn't one-size-fits-all in software localization

Every language has its own grammar, and pluralization is one of its trickiest parts. In English, we generally distinguish between:

  • Singular / one: "1 apple"
  • Plural / other: "0 apples", "2 apples"

But other languages have many more rules. For example:

  • Polish uses one, few, and other, with few covering numbers like 2, 3, 4 and other covering most larger numbers. For example:
    • 1: "1 kot" (one cat)
    • 2: "2 koty" (few cats)
    • 5: "5 kotów" (other cats)
  • Arabic can have six different plural forms depending on the number.
Pluralization example: cat in Polish
Pluralization example: cat in Polish

This matters because a direct translation from English, even something as common as “You have booked 2 rooms”, can become grammatically incorrect or even confusing if its plural logic isn't adapted to the target language.

Why users notice bad pluralization in apps and websites

Plural errors are subtle, but users notice them immediately, especially native speakers. Incorrect plural forms can:

  • Make your product feel unfinished or poorly localized
  • Reduce trust in important flows like checkout, billing, or booking
  • Create ambiguity ("Did I book one room or several?")
  • Lead to misunderstandings that impact user experience

In customer-facing software, these small language details directly affect perceived quality.

Bad pluralization example
Bad pluralization example

How ICU MessageFormat solves pluralization challenges in multilingual software

To handle plurals correctly, most modern localization systems (including SimpleLocalize) use ICU MessageFormat, a standard syntax for defining plurals and other language variants in a single message.

In ICU, you define a plural with a syntax that looks like this:

{numRooms, plural,
    one {You have booked # room}
    other {You have booked # rooms}
}

Here:

  • numRooms is the variable representing the number of rooms.
  • plural tells ICU you're handling a plural case.
  • one and other are the plural categories for English.

When you translate this message into another language, you adjust the plural categories according to that language's rules. For example, in Polish, it would look like this:

{numRooms, plural,
    one {Zarezerwowano # pokój}
    few {Zarezerwowano # pokoje}
    other {Zarezerwowano # pokoi}
}

Notice how Polish needs extra categories to express the natural grammar of the language. Without those, translations would feel awkward or be technically incorrect.

Learn more about ICU in our ICU MessageFormat guide.

ICU plural categories explained (in plain terms)

ICU defines plural categories, not numeric rules. That means:

  • Categories like one, few, or many do not always correspond to the same numbers.
  • The mapping depends entirely on the language.

For example:

  • In English, one = exactly 1
  • In Polish, one = exactly 1, few = 2-4
  • In Arabic, two is a separate grammatical form

This is why plural logic should live in translations, not in application code.

Plural categories by language (ICU overview)

Here's a quick overview of plural categories for some common languages:

LanguagePlural categories
Englishone, other
Polishone, few, other
Spanishone, other
Germanone, other
Italianone, other
Portugueseone, other
Czechone, few, other
Arabiczero, one, two, few, many, other
Russianone, few, many, other
Frenchone, other
Japaneseother
Chineseother
Turkishone, other

For a complete and authoritative list, check the Unicode CLDR Plural Rules.

Best practices for pluralization with ICU MessageFormat

ICU MessageFormat is widely used across localization tools, frameworks, and platforms because it provides a language-aware way to handle plural forms. To get the most out of it, there are a few best practices worth following.

One key, many forms

A common mistake is creating separate translation keys for different quantities, for example:

  • room_single
  • room_plural

This approach doesn't scale once you introduce languages with more than two plural forms.

With ICU, you define one translation key, e.g. booking.rooms_booked, and express all plural variations directly in the message:

{numRooms, plural,
    one {You have booked # room}
    other {You have booked # rooms}
}

Why this works better:

  • Plural logic lives inside the translation, not in your application code.
  • Languages can define as many plural forms as they need.
  • The same key works consistently across all locales.
  • Translation files stay cleaner and easier to manage.
SimpleLocalize pluralization example
SimpleLocalize pluralization example

Keep plural logic out of code

Avoid writing conditional logic like if (count === 1) in your app. Different languages treat numbers differently, and assumptions based on English will eventually break.

Instead:

  • Pass the numeric value (e.g. count) to your translation layer.
  • Let ICU select the correct plural form for the active language.

This makes your app easier to maintain and far safer to localize.

Handle zero explicitly (when it matters)

Some languages have a dedicated zero category, while others reuse other. Even if ICU handles zero correctly, you may want to customize the message:

  • "No rooms booked" instead of "0 rooms booked"
  • "You have no unread messages" instead of "0 unread messages"

You can handle this by either:

  • Using a zero category (where supported)
  • Or combining plural rules with select

Always include the other category

In ICU plural rules, other is mandatory. It acts as a safety net:

  • It covers numbers that don't match any explicit rule.
  • It's required even in languages that appear to have only one form.
  • It prevents runtime errors and missing translations.

Even languages without grammatical plurals (like Japanese or Chinese) still rely on other.

Use language-specific categories

Plural categories like few or many are language-specific abstractions. Never assume their numeric meaning.

For example:

  • few means “2-4” in some Slavic languages (e.g. Polish and Czech)
  • few means something entirely different in Arabic
  • some languages use a special form for exactly 2

Always follow ICU and CLDR rules for each language.

Combine plurals with select for richer messages

ICU allows you to nest plural rules with select, which is useful for more expressive messages:

{count, plural,
  one {{roomType, select,
    suite {One suite booked}
    other {One room booked}
  }}
  other {{roomType, select,
    suite {# suites booked}
    other {# rooms booked}
  }}
}

This way, you can handle both quantity and context in a single message.

Test edge cases early

Always test your ICU messages with:

  • Zero quantities (0)
  • One (1)
  • Boundary values (2, 4, 5, 11, 21)
  • Large numbers (1000+)
  • Multiple languages

Plural rules can behave differently than expected, especially in Slavic and Semitic languages. Catching issues early saves time and prevents costly re-translation.

How SimpleLocalize helps manage pluralization

SimpleLocalize supports ICU MessageFormat out of the box, making it easy to:

  • Define plural forms in a single translation key
  • Preview plural behavior per language
  • Validate ICU syntax before deployment
  • Keep translators focused on language, not code

By centralizing plural logic in your translations, you reduce bugs, simplify development, and ensure your product reads naturally in every supported language.

Learn more about pluralization in SimpleLocalize.

Conclusion: building correctly localized plural forms

Pluralization is one of those details that separates "translated" software from truly localized software.

By using ICU MessageFormat, defining one key per message, and letting language-specific rules do the heavy lifting, you build products that feel natural, trustworthy, and professional, no matter the language.

If you're working with multiple languages, getting plurals right isn't optional, it's essential. With the right tools and practices, you can master pluralization and deliver a seamless experience to users worldwide.

Kinga Pomykała
Kinga Pomykała
Content creator of SimpleLocalize

Get started with SimpleLocalize

  • All-in-one localization platform
  • Web-based translation editor for your team
  • Auto-translation, QA-checks, AI and more
  • See how easily you can start localizing your product.
  • Powerful API, hosting, integrations and developer tools
  • Unmatched customer support
Start for free
No credit card required5-minute setup
"The product
and support
are fantastic."
Laars Buur|CTO
"The support is
blazing fast,
thank you Jakub!"
Stefan|Developer
"Interface that
makes any dev
feel at home!"
Dario De Cianni|CTO
"Excellent app,
saves my time
and money"
Dmitry Melnik|Developer