Cardinalities
-
CARDINALITY_ONE
Matches
i = 1 and v = 0Example Integers:
1 -
CARDINALITY_OTHER
Matches
all other valuesExample Integers:
0, 2, 16, 100, 1000, 10000, 100000, 1000000, …Example Decimals:
0.0, 1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …
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 sv locale data.
Sample localized strings file
{ "Cardinality.MinimalPair": { "commentary": "Demonstrates every CLDR cardinal category defined for this locale.", "translation": "{{cardinalityExample}}", "placeholders": { "cardinalityExample": { "value": "cardinalityValue", "translations": { "CARDINALITY_ONE": "om {{formattedCardinalityValue}} dag", "CARDINALITY_OTHER": "om {{formattedCardinalityValue}} dagar" } } } } }
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("sv"); 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: om 1 dag assertEquals("om " + oneFormattedCardinalityValue + " dag", strings.get( "Cardinality.MinimalPair", Map.of( "cardinalityValue", oneCardinalityValue, "formattedCardinalityValue", oneFormattedCardinalityValue ) )); // CARDINALITY_OTHER Number otherCardinalityValue = 0; String otherFormattedCardinalityValue = numberFormat.format(otherCardinalityValue); assertEquals(Cardinality.OTHER, Cardinality.forNumber(otherCardinalityValue, locale)); // Expected: om 0 dagar assertEquals("om " + otherFormattedCardinalityValue + " dagar", 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_OTHER
Matches
CARDINALITY_OTHER -
CARDINALITY_OTHER - CARDINALITY_ONE
Matches
CARDINALITY_OTHER -
CARDINALITY_OTHER - CARDINALITY_OTHER
Matches
CARDINALITY_OTHER
Ordinalities
-
ORDINALITY_ONE
Matches
n % 10 = 1,2 and n % 100 != 11,12Example Integers:
1, 2, 21, 22, 31, 32, 41, 42, 51, 52, 61, 62, 71, 72, 81, 82, 101, 1001, … -
ORDINALITY_OTHER
Matches
all other valuesExample Integers:
0, 3, 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 sv locale data.
Sample localized strings file
{ "Ordinal.MinimalPair": { "commentary": "Demonstrates every CLDR ordinal category defined for this locale.", "translation": "{{ordinalExample}}", "placeholders": { "ordinalExample": { "value": "ordinalValue", "translations": { "ORDINALITY_ONE": "Ta {{formattedOrdinalValue}}:a svängen till höger", "ORDINALITY_OTHER": "Ta {{formattedOrdinalValue}}:e svängen till höger" } } } } }
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("sv"); 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_ONE Number oneOrdinalValue = 1; String oneFormattedOrdinalValue = numberFormat.format(oneOrdinalValue); assertEquals(Ordinality.ONE, Ordinality.forNumber(oneOrdinalValue, locale)); // Expected: Ta 1:a svängen till höger assertEquals("Ta " + oneFormattedOrdinalValue + ":a svängen till höger", strings.get( "Ordinal.MinimalPair", Map.of("ordinalValue", oneOrdinalValue, "formattedOrdinalValue", oneFormattedOrdinalValue) )); // ORDINALITY_OTHER Number otherOrdinalValue = 3; String otherFormattedOrdinalValue = numberFormat.format(otherOrdinalValue); assertEquals(Ordinality.OTHER, Ordinality.forNumber(otherOrdinalValue, locale)); // Expected: Ta 3:e svängen till höger assertEquals("Ta " + otherFormattedOrdinalValue + ":e svängen till höger", strings.get( "Ordinal.MinimalPair", Map.of("ordinalValue", otherOrdinalValue, "formattedOrdinalValue", otherFormattedOrdinalValue) ));
Language-Specific Examples
These examples show how Lokalized models grammatical choices and translation behavior that commonly affect Swedish application copy. Each example identifies the Lokalized language forms and other library features it uses.
Common and neuter adjective agreement
Swedish commonly distinguishes en words from ett words, and the adjective changes with that noun class: en ny bok but ett nytt brev.
Language references: Swedish Language Council - en/ett gender and adjective agreement, Swedish Academy - ny, nytt, nya
Lokalized forms used: Gender
Sample localized strings file
{ "Open {{item}}.": { "translation": "Öppna {{item}}.", "placeholders": { "item": { "value": "gender", "translations": { "GENDER_COMMON": "en ny bok", "GENDER_NEUTER": "ett nytt brev" } } } } }
Usage and expected results
Locale locale = Locale.forLanguageTag("sv"); Strings strings = Strings.withFallbackLocale(locale) .localizedStringSupplier(() -> LocalizedStringLoader.loadFromFilesystem(Paths.get("strings"))) .localeSupplier((matcher) -> matcher.bestMatchFor(locale)) .build(); assertEquals("Öppna en ny bok.", strings.get( "Open {{item}}.", Map.of("gender", Gender.COMMON) )); assertEquals("Öppna ett nytt brev.", strings.get( "Open {{item}}.", Map.of("gender", Gender.NEUTER) ));
Definite and indefinite noun phrases
Swedish definiteness is often expressed with a suffix on the noun rather than a separate article.
Language references: Swedish Academy Grammar - indefinite and definite noun forms, Svensk ordbok - fil, filen, filer
Lokalized forms used: Definiteness
Sample localized strings file
{ "Save {{document}}.": { "translation": "Spara {{document}}.", "placeholders": { "document": { "value": "definiteness", "translations": { "DEFINITENESS_INDEFINITE": "en fil", "DEFINITENESS_DEFINITE": "filen" } } } } }
Usage and expected results
Locale locale = Locale.forLanguageTag("sv"); Strings strings = Strings.withFallbackLocale(locale) .localizedStringSupplier(() -> LocalizedStringLoader.loadFromFilesystem(Paths.get("strings"))) .localeSupplier((matcher) -> matcher.bestMatchFor(locale)) .build(); assertEquals("Spara en fil.", strings.get( "Save {{document}}.", Map.of("definiteness", Definiteness.INDEFINITE) )); assertEquals("Spara filen.", strings.get( "Save {{document}}.", Map.of("definiteness", Definiteness.DEFINITE) ));
Addendum: Language Form Rules
The language form expressions above are specified by Unicode Technical Standard #35 and use the following notation:
nabsolute value of the source number (integer and decimals)iinteger digits ofnvnumber of visible fraction digits inn, with trailing zeroswnumber of visible fraction digits inn, without trailing zerosfvisible fractional digits inn, with trailing zerostvisible fractional digits inn, without trailing zerosc/ecompact decimal exponent operands used by some CLDR compact-number rules