Belarusian беларуская

BCP 47 language tag: be

Lokalized supports cardinality, cardinality range, and ordinality rules for Belarusian.

Belarusian is most often spoken in Belarus, Ukraine, and Poland.

Cardinalities

  • CARDINALITY_ONE

    Matches n % 10 = 1 and n % 100 != 11

    Example Integers: 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …

    Example Decimals: 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 71.0, 81.0, 101.0, 1001.0, …

  • CARDINALITY_FEW

    Matches n % 10 = 2..4 and n % 100 != 12..14

    Example Integers: 2, 4, 22, 24, 32, 34, 42, 44, 52, 54, 62, 102, 1002, …

    Example Decimals: 2.0, 3.0, 4.0, 22.0, 23.0, 24.0, 32.0, 33.0, 102.0, 1002.0, …

  • CARDINALITY_MANY

    Matches n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14

    Example Integers: 0, 5, 19, 100, 1000, 10000, 100000, 1000000, …

    Example Decimals: 0.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …

  • CARDINALITY_OTHER

    Matches all other values

    Example Decimals: 0.1, 0.9, 1.1, 1.7, 10.1, 100.1, 1000.1, …

Cardinality example

This localized strings example uses complete, page-local CLDR minimal-pair patterns to demonstrate every Cardinality category defined for the locale. Minimal-pair text contrasts grammatical forms; it is language-reference data, not reusable application copy.

Source: Unicode CLDR 48.2 be locale data.

Sample localized strings file
be.json Localized Strings File (Belarusian)
{
  "Cardinality.MinimalPair": {
    "commentary": "Demonstrates every CLDR cardinal category defined for this locale.",
    "translation": "{{cardinalityExample}}",
    "placeholders": {
      "cardinalityExample": {
        "value": "cardinalityValue",
        "translations": {
          "CARDINALITY_ONE": "з {{formattedCardinalityValue}} кнігі за {{formattedCardinalityValue}} дзень",
          "CARDINALITY_FEW": "з {{formattedCardinalityValue}} кніг за {{formattedCardinalityValue}} дні",
          "CARDINALITY_MANY": "з {{formattedCardinalityValue}} кніг за {{formattedCardinalityValue}} дзён",
          "CARDINALITY_OTHER": "з {{formattedCardinalityValue}} кнігі за {{formattedCardinalityValue}} дня"
        }
      }
    }
  }
}
Usage and expected results

The Java code passes each raw number for cardinality selection and formats its display value separately with NumberFormat.

Locale locale = Locale.forLanguageTag("be");

Strings strings = Strings.withFallbackLocale(locale)
  .localizedStringSupplier(() -> LocalizedStringLoader.loadFromFilesystem(Paths.get("strings")))
  .localeSupplier((matcher) -> matcher.bestMatchFor(locale))
  .build();

NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);

// Raw numbers select language forms; NumberFormat produces the display values

// CARDINALITY_ONE
Number oneCardinalityValue = 1;
String oneFormattedCardinalityValue = numberFormat.format(oneCardinalityValue);

assertEquals(Cardinality.ONE, Cardinality.forNumber(oneCardinalityValue, locale));

// Expected: з 1 кнігі за 1 дзень
assertEquals(
  "з " + oneFormattedCardinalityValue + " кнігі за " + oneFormattedCardinalityValue + " дзень",
  strings.get(
    "Cardinality.MinimalPair",
    Map.of(
      "cardinalityValue", oneCardinalityValue,
      "formattedCardinalityValue", oneFormattedCardinalityValue
    )
  )
);

// CARDINALITY_FEW
Number fewCardinalityValue = 2;
String fewFormattedCardinalityValue = numberFormat.format(fewCardinalityValue);

assertEquals(Cardinality.FEW, Cardinality.forNumber(fewCardinalityValue, locale));

// Expected: з 2 кніг за 2 дні
assertEquals(
  "з " + fewFormattedCardinalityValue + " кніг за " + fewFormattedCardinalityValue + " дні",
  strings.get(
    "Cardinality.MinimalPair",
    Map.of(
      "cardinalityValue", fewCardinalityValue,
      "formattedCardinalityValue", fewFormattedCardinalityValue
    )
  )
);

// CARDINALITY_MANY
Number manyCardinalityValue = 0;
String manyFormattedCardinalityValue = numberFormat.format(manyCardinalityValue);

assertEquals(Cardinality.MANY, Cardinality.forNumber(manyCardinalityValue, locale));

// Expected: з 0 кніг за 0 дзён
assertEquals(
  "з " + manyFormattedCardinalityValue + " кніг за " + manyFormattedCardinalityValue + " дзён",
  strings.get(
    "Cardinality.MinimalPair",
    Map.of(
      "cardinalityValue", manyCardinalityValue,
      "formattedCardinalityValue", manyFormattedCardinalityValue
    )
  )
);

// CARDINALITY_OTHER
Number otherCardinalityValue = new java.math.BigDecimal("0.1");
NumberFormat otherCardinalityValueFormat = NumberFormat.getNumberInstance(locale);
otherCardinalityValueFormat.setMinimumFractionDigits(1);
otherCardinalityValueFormat.setMaximumFractionDigits(1);
String otherFormattedCardinalityValue = otherCardinalityValueFormat.format(otherCardinalityValue);

assertEquals(Cardinality.OTHER, Cardinality.forNumber(otherCardinalityValue, locale));

// Expected: з 0,1 кнігі за 0,1 дня
assertEquals(
  "з " + otherFormattedCardinalityValue + " кнігі за " + otherFormattedCardinalityValue + " дня",
  strings.get(
    "Cardinality.MinimalPair",
    Map.of(
      "cardinalityValue", otherCardinalityValue,
      "formattedCardinalityValue", otherFormattedCardinalityValue
    )
  )
);

Cardinality Ranges

These are CLDR's explicit range mappings. For any start/end pair not listed, Cardinality.forRange(...) falls back to the ending cardinality.

  • CARDINALITY_ONE - CARDINALITY_ONE

    Matches CARDINALITY_ONE

  • CARDINALITY_ONE - CARDINALITY_FEW

    Matches CARDINALITY_FEW

  • CARDINALITY_ONE - CARDINALITY_MANY

    Matches CARDINALITY_MANY

  • CARDINALITY_ONE - CARDINALITY_OTHER

    Matches CARDINALITY_OTHER

  • CARDINALITY_FEW - CARDINALITY_ONE

    Matches CARDINALITY_ONE

  • CARDINALITY_FEW - CARDINALITY_FEW

    Matches CARDINALITY_FEW

  • CARDINALITY_FEW - CARDINALITY_MANY

    Matches CARDINALITY_MANY

  • CARDINALITY_FEW - CARDINALITY_OTHER

    Matches CARDINALITY_OTHER

  • CARDINALITY_MANY - CARDINALITY_ONE

    Matches CARDINALITY_ONE

  • CARDINALITY_MANY - CARDINALITY_FEW

    Matches CARDINALITY_FEW

  • CARDINALITY_MANY - CARDINALITY_MANY

    Matches CARDINALITY_MANY

  • CARDINALITY_MANY - CARDINALITY_OTHER

    Matches CARDINALITY_OTHER

  • CARDINALITY_OTHER - CARDINALITY_ONE

    Matches CARDINALITY_ONE

  • CARDINALITY_OTHER - CARDINALITY_FEW

    Matches CARDINALITY_FEW

  • CARDINALITY_OTHER - CARDINALITY_MANY

    Matches CARDINALITY_MANY

  • CARDINALITY_OTHER - CARDINALITY_OTHER

    Matches CARDINALITY_OTHER

Cardinality range example

The start and end cardinalities select the locale's CLDR range result. The selected form wraps a separately formatted display range.

Sample localized strings file
be.json Localized Strings File (Belarusian)
{
  "Delivery.Window": {
    "commentary": "Estimated delivery window, expressed as a range of days.",
    "translation": "{{window}}",
    "placeholders": {
      "window": {
        "range": {
          "start": "minDays",
          "end": "maxDays"
        },
        "translations": {
          "CARDINALITY_ONE": "{{formattedDayRange}} суткі",
          "CARDINALITY_FEW": "{{formattedDayRange}} сутак",
          "CARDINALITY_MANY": "{{formattedDayRange}} сутак",
          "CARDINALITY_OTHER": "{{formattedDayRange}} сутак"
        }
      }
    }
  }
}
Usage and expected results

The Java code passes raw range endpoints for selection. Because NumberFormat formats one number at a time, it formats both endpoints separately and joins them for display; choose range punctuation appropriate to your application.

Locale locale = Locale.forLanguageTag("be");

Strings strings = Strings.withFallbackLocale(locale)
  .localizedStringSupplier(() -> LocalizedStringLoader.loadFromFilesystem(Paths.get("strings")))
  .localeSupplier((matcher) -> matcher.bestMatchFor(locale))
  .build();

NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);

// Raw numbers select language forms; NumberFormat produces the display values

// CARDINALITY_ONE range
Number minDays = 1;
String formattedMinDays = numberFormat.format(minDays);
Number maxDays = 21;
String formattedMaxDays = numberFormat.format(maxDays);
String formattedDayRange = formattedMinDays + "-" + formattedMaxDays;

assertEquals(Cardinality.ONE, Cardinality.forRange(
  Cardinality.forNumber(minDays, locale),
  Cardinality.forNumber(maxDays, locale),
  locale
));

// Expected: 1-21 суткі
assertEquals(formattedDayRange + " суткі", strings.get(
  "Delivery.Window",
  Map.of("minDays", minDays, "maxDays", maxDays, "formattedDayRange", formattedDayRange)
));

Ordinalities

  • ORDINALITY_FEW

    Matches n % 10 = 2,3 and n % 100 != 12,13

    Example Integers: 2, 3, 22, 23, 32, 33, 42, 43, 52, 53, 62, 63, 72, 73, 82, 83, 102, 1002, …

  • ORDINALITY_OTHER

    Matches all other values

    Example Integers: 0, 1, 4, 17, 100, 1000, 10000, 100000, 1000000, …

Ordinality example

This localized strings example uses complete CLDR minimal-pair patterns to demonstrate every Ordinality category defined for the locale.

Source: Unicode CLDR 48.2 be locale data.

Sample localized strings file
be.json Localized Strings File (Belarusian)
{
  "Ordinal.MinimalPair": {
    "commentary": "Demonstrates every CLDR ordinal category defined for this locale.",
    "translation": "{{ordinalExample}}",
    "placeholders": {
      "ordinalExample": {
        "value": "ordinalValue",
        "translations": {
          "ORDINALITY_FEW": "{{formattedOrdinalValue}}-і дом злева",
          "ORDINALITY_OTHER": "{{formattedOrdinalValue}}-ы дом злева"
        }
      }
    }
  }
}
Usage and expected results

The Java code passes each raw number to Ordinality.forNumber(...) and formats its display value separately with NumberFormat.

Locale locale = Locale.forLanguageTag("be");

Strings strings = Strings.withFallbackLocale(locale)
  .localizedStringSupplier(() -> LocalizedStringLoader.loadFromFilesystem(Paths.get("strings")))
  .localeSupplier((matcher) -> matcher.bestMatchFor(locale))
  .build();

NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);

// Raw numbers select language forms; NumberFormat produces the display values

// ORDINALITY_FEW
Number fewOrdinalValue = 2;
String fewFormattedOrdinalValue = numberFormat.format(fewOrdinalValue);

assertEquals(Ordinality.FEW, Ordinality.forNumber(fewOrdinalValue, locale));

// Expected: 2-і дом злева
assertEquals(fewFormattedOrdinalValue + "-і дом злева", strings.get(
  "Ordinal.MinimalPair",
  Map.of("ordinalValue", fewOrdinalValue, "formattedOrdinalValue", fewFormattedOrdinalValue)
));

// ORDINALITY_OTHER
Number otherOrdinalValue = 1;
String otherFormattedOrdinalValue = numberFormat.format(otherOrdinalValue);

assertEquals(Ordinality.OTHER, Ordinality.forNumber(otherOrdinalValue, locale));

// Expected: 1-ы дом злева
assertEquals(otherFormattedOrdinalValue + "-ы дом злева", strings.get(
  "Ordinal.MinimalPair",
  Map.of("ordinalValue", otherOrdinalValue, "formattedOrdinalValue", otherFormattedOrdinalValue)
));

Addendum: Language Form Rules

The language form expressions above are specified by Unicode Technical Standard #35 and use the following notation:

  • n absolute value of the source number (integer and decimals)
  • i integer digits of n
  • v number of visible fraction digits in n, with trailing zeros
  • w number of visible fraction digits in n, without trailing zeros
  • f visible fractional digits in n, with trailing zeros
  • t visible fractional digits in n, without trailing zeros
  • c/e compact decimal exponent operands used by some CLDR compact-number rules