Crate icu_plurals

source ·
Expand description

Determine the plural category appropriate for a given number in a given language.

This module is published as its own crate (icu_plurals) and as part of the icu crate. See the latter for more details on the ICU4X project.

For example in English, when constructing a message such as { num } items, the user has to prepare two variants of the message:

  • 1 item
  • 0 items, 2 items, 5 items, 0.5 items etc.

The former variant is used when the placeholder variable has value 1, while the latter is used for all other values of the variable.

Unicode defines Language Plural Rules as a mechanism to codify those variants and provides data and algorithms to calculate appropriate PluralCategory.


use icu::locid::locale;
use icu::plurals::{PluralCategory, PluralRuleType, PluralRules};

let pr =
    PluralRules::try_new(&locale!("en").into(), PluralRuleType::Cardinal)
        .expect("locale should be present");

assert_eq!(pr.category_for(5_usize), PluralCategory::Other);

§Plural Rules

The crate provides the main struct PluralRules which handles selection of the correct PluralCategory for a given language and PluralRuleType.

§Plural Category

Every number in every language belongs to a certain PluralCategory. For example, the Polish language uses four:


Plural rules depend on the use case. This crate supports two types of plural rules:

  • Cardinal: 3 doors, 1 month, 10 dollars
  • Ordinal: 1st place, 10th day, 11th floor



  • 🚧 [Unstable] Data provider struct definitions for this ICU4X component.
  • 🚧 [Experimental] APIs and Data Structures for Plural Rules



  • The plural categories are used to format messages with numeric placeholders, expressed as decimal numbers.
  • A type of a plural rule which can be associated with the PluralRules struct.
  • A list of error outcomes for various operations in this module.