Localization
CxJS supports culture-specific number, currency, and date formatting based on Intl helpers provided by modern browsers. It also offers translation of standard widget messages to different languages.
Example
<div>
<LabelsTopLayout columns={2} controller={PageController}>
<LookupField
value={m.culture.id}
options={m.cultures}
label="Culture"
required
/>
<LookupField
value={m.currency.id}
options={m.currencies}
label="Currency"
required
/>
</LabelsTopLayout>
<ContentResolver
params={{ culture: m.culture.id, currency: m.currency.id }}
onResolve={async ({ culture, currency }) => {
//console.log(culture, currency);
Culture.setCulture(culture)
Culture.setDefaultCurrency(currency)
switch (culture) {
case "de-de":
await import("cx/locale/de-de.js")
break
case "es-es":
await import("cx/locale/es-es.js")
break
case "fr-fr":
await import("cx/locale/fr-fr.js")
break
default:
await import("cx/locale/en-us.js")
break
}
return (
<LabelsTopLayout columns={2} controller={PageController}>
<NumberField value={m.number} label="Number" />
<NumberField value={m.number} label="Currency" format="currency" />
<Calendar value={m.date} label="Date" />
</LabelsTopLayout>
)
}}
/>
</div> English (US) | USD |
Culture
import { Culture } from 'cx/ui'; Copied The Culture object provides methods for selecting UI cultures used for formatting.
Setting Culture
import "cx/locale/de-de"; // Import locale data
Culture.setCulture("de-de");
Available locale packages include: de-de, en-us, es-es, fr-fr, nl-nl, pt-pt, sr-latn-ba.
Culture Methods
| Method | Description |
|---|---|
Culture.setCulture(code) | Sets the current culture for all formatting. |
Culture.setNumberCulture(code) | Sets culture for number formatting only. |
Culture.setDateTimeCulture(code) | Sets culture for date/time formatting only. |
Culture.setDefaultCurrency(code) | Sets the default currency (e.g., "EUR", "USD"). |
Culture.setDefaultTimezone(tz) | Sets the default timezone. |
Culture.setDefaultDateEncoding(fn) | Sets function for encoding dates. |
Dynamic Culture Loading
Use dynamic imports for code-splitting:
async function loadCulture(culture: string) {
switch (culture) {
case "de-de":
await import("cx/locale/de-de");
break;
case "fr-fr":
await import("cx/locale/fr-fr");
break;
default:
await import("cx/locale/en-us");
}
Culture.setCulture(culture);
store.notify(); // Force re-render
}
Localization
import { Localization } from 'cx/ui'; Copied The Localization object provides methods for translating widget messages.
Localization Methods
| Method | Description |
|---|---|
Localization.localize(culture, name, values) | Override widget properties for a given culture. |
Localization.override(name, values) | Override widget properties for all cultures. |
Localization.registerPrototype(name, type) | Register a component type for localization. |
Translating Widget Messages
Localization.localize("de", "cx/widgets/TextField", {
validationErrorText: "Ungültige Eingabe.",
minLengthValidationErrorText: "Mindestens {0} Zeichen erforderlich.",
maxLengthValidationErrorText: "Maximal {0} Zeichen erlaubt.",
});
Overriding Defaults
Use override to change defaults for all cultures:
Localization.override("cx/widgets/DateField", {
format: "dd.MM.yyyy",
});