Slovenian slovenščina

BCP 47 language tag: sl

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

Slovenian is most often spoken in Slovenia, Italy, Austria, and Hungary.

Cardinalities

  • CARDINALITY_ONE

    Matches v = 0 and i % 100 = 1

    Example Integers: 1, 101, 201, 301, 401, 501, 601, 701, 1001, …

  • CARDINALITY_TWO

    Matches v = 0 and i % 100 = 2

    Example Integers: 2, 102, 202, 302, 402, 502, 602, 702, 1002, …

  • CARDINALITY_FEW

    Matches v = 0 and i % 100 = 3..4 or v != 0

    Example Integers: 3, 4, 103, 104, 203, 204, 303, 304, 403, 404, 503, 504, 603, 604, 703, 704, 1003, …

    Example Decimals: 0.0, 1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …

  • CARDINALITY_OTHER

    Matches all other values

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

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 sl locale data.

Sample localized strings file
sl.json Localized Strings File (Slovenian)
{
  "Cardinality.MinimalPair": {
    "commentary": "Demonstrates every CLDR cardinal category defined for this locale.",
    "translation": "{{cardinalityExample}}",
    "placeholders": {
      "cardinalityExample": {
        "value": "cardinalityValue",
        "translations": {
          "CARDINALITY_ONE": "{{formattedCardinalityValue}} dan",
          "CARDINALITY_TWO": "{{formattedCardinalityValue}} dneva",
          "CARDINALITY_FEW": "{{formattedCardinalityValue}} dnevi",
          "CARDINALITY_OTHER": "{{formattedCardinalityValue}} dni"
        }
      }
    }
  }
}
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("sl");

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 dan
assertEquals(oneFormattedCardinalityValue + " dan", strings.get(
  "Cardinality.MinimalPair",
  Map.of(
    "cardinalityValue", oneCardinalityValue,
    "formattedCardinalityValue", oneFormattedCardinalityValue
  )
));

// CARDINALITY_TWO
Number twoCardinalityValue = 2;
String twoFormattedCardinalityValue = numberFormat.format(twoCardinalityValue);

assertEquals(Cardinality.TWO, Cardinality.forNumber(twoCardinalityValue, locale));

// Expected: 2 dneva
assertEquals(twoFormattedCardinalityValue + " dneva", strings.get(
  "Cardinality.MinimalPair",
  Map.of(
    "cardinalityValue", twoCardinalityValue,
    "formattedCardinalityValue", twoFormattedCardinalityValue
  )
));

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

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

// Expected: 3 dnevi
assertEquals(fewFormattedCardinalityValue + " dnevi", strings.get(
  "Cardinality.MinimalPair",
  Map.of(
    "cardinalityValue", fewCardinalityValue,
    "formattedCardinalityValue", fewFormattedCardinalityValue
  )
));

// CARDINALITY_OTHER
Number otherCardinalityValue = 0;
String otherFormattedCardinalityValue = numberFormat.format(otherCardinalityValue);

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

// Expected: 0 dni
assertEquals(otherFormattedCardinalityValue + " dni", 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_FEW

  • CARDINALITY_ONE - CARDINALITY_TWO

    Matches CARDINALITY_TWO

  • CARDINALITY_ONE - CARDINALITY_FEW

    Matches CARDINALITY_FEW

  • CARDINALITY_ONE - CARDINALITY_OTHER

    Matches CARDINALITY_OTHER

  • CARDINALITY_TWO - CARDINALITY_ONE

    Matches CARDINALITY_FEW

  • CARDINALITY_TWO - CARDINALITY_TWO

    Matches CARDINALITY_TWO

  • CARDINALITY_TWO - CARDINALITY_FEW

    Matches CARDINALITY_FEW

  • CARDINALITY_TWO - CARDINALITY_OTHER

    Matches CARDINALITY_OTHER

  • CARDINALITY_FEW - CARDINALITY_ONE

    Matches CARDINALITY_FEW

  • CARDINALITY_FEW - CARDINALITY_TWO

    Matches CARDINALITY_TWO

  • CARDINALITY_FEW - CARDINALITY_FEW

    Matches CARDINALITY_FEW

  • CARDINALITY_FEW - CARDINALITY_OTHER

    Matches CARDINALITY_OTHER

  • CARDINALITY_OTHER - CARDINALITY_ONE

    Matches CARDINALITY_FEW

  • CARDINALITY_OTHER - CARDINALITY_TWO

    Matches CARDINALITY_TWO

  • CARDINALITY_OTHER - CARDINALITY_FEW

    Matches CARDINALITY_FEW

  • 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
sl.json Localized Strings File (Slovenian)
{
  "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}} dan",
          "CARDINALITY_TWO": "{{formattedDayRange}} dneva",
          "CARDINALITY_FEW": "{{formattedDayRange}} dni",
          "CARDINALITY_OTHER": "{{formattedDayRange}} dni"
        }
      }
    }
  }
}
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("sl");

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_FEW range
Number minDays = 1;
String formattedMinDays = numberFormat.format(minDays);
Number maxDays = 101;
String formattedMaxDays = numberFormat.format(maxDays);
String formattedDayRange = formattedMinDays + "-" + formattedMaxDays;

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

// Expected: 1-101 dni
assertEquals(formattedDayRange + " dni", strings.get(
  "Delivery.Window",
  Map.of("minDays", minDays, "maxDays", maxDays, "formattedDayRange", formattedDayRange)
));

Ordinalities

All ordinal numbers use ORDINALITY_OTHER; no value selects a different form.

Example: V 2. križišču zavijte desno..

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