Skip to main content

Lokalizácia

Localizer slúži na dve veci: preklady textov a locale-aware formátovanie čísel, dátumov a relatívneho času.

Rýchly štart

Ak chcete localization rozbehať čo najjednoduchšie, stačí:

  1. nastaviť lang na <html>,
  2. vytvoriť window.translations = new Map(),
  3. zaregistrovať preklad cez Localizer.registerTranslation(...),
  4. vytvoriť new Localizer(...),
  5. volať translate(), translateWithParams(), translatePlural(), formatNumber(), formatDate() a relativeTime().

index.html

<!doctype html>
<html lang="sk-sk">
<head>
<script>
window.translations = new Map();
</script>
<script type="module" src="/src/main.js"></script>
</head>
<body></body>
</html>

main.js

import 'wj-elements';
import { Localizer } from 'wj-elements';

Localizer.registerTranslation({
code: 'sk-sk',
name: 'Slovenčina',
dir: 'ltr',
'app.hello': 'Ahoj',
'app.greeting': 'Ahoj {name}',
'cart.items.one': '{count} položka',
'cart.items.few': '{count} položky',
'cart.items.other': '{count} položiek',
});

const localizer = new Localizer(document.documentElement);

console.log(localizer.translate('app.hello'));
console.log(localizer.translateWithParams('app.greeting', { name: 'Ján' }));

const template = localizer.translatePlural('cart.items', 3);
console.log(template.replace('{count}', 3));

console.log(localizer.formatNumber(1234.56, {
style: 'currency',
currency: 'EUR',
}));

console.log(localizer.formatDate(new Date(), { dateStyle: 'long' }));
console.log(localizer.relativeTime(undefined, -1, 'day'));

V tomto príklade sa jazyk berie z <html lang="sk-sk">, preklady sa zaregistrujú pri štarte aplikácie a localizer sa potom používa kdekoľvek v kóde.

Jazyk

Localizer hľadá jazyk v tomto poradí:

  1. element.lang
  2. document.documentElement.lang
  3. interný default en-GB
important

V praxi sa na implicitný default nespoliehajte. Nastavte lang vždy explicitne a používajte lowercase jazykové kódy, napríklad sk-sk a en-gb. Registrované preklady sa ukladajú lowercase a rovnaký tvar očakáva aj aktuálna implementácia.

Komponent

Vo web komponente býva najbežnejší pattern tento:

import { Localizer, WJElement } from 'wj-elements';

export default class AppGreeting extends WJElement {
constructor() {
super();
this.localizer = new Localizer(this);
}

draw() {
const div = document.createElement('div');
div.textContent = this.localizer.translateWithParams('app.greeting', {
name: 'Ján',
});

return div;
}
}

Mimo komponentu sa typicky používa new Localizer(document.body) alebo new Localizer(document.documentElement).

Setup

new Localizer()

Vytvorí novú inštanciu localizeru.

ParameterTypPopis
elementHTMLElement | Element | { lang?: string; dir?: string }Element, z ktorého sa číta lang a dir.

Najčastejšie použitie:

const appLocalizer = new Localizer(document.documentElement);
const serviceLocalizer = new Localizer(document.body);
const componentLocalizer = new Localizer(this);

registerTranslation()

Zaregistruje jeden alebo viac prekladových objektov.

ParameterTypPopis
...translationobject[]Jeden alebo viac objektov s poľom code.

Prekladový objekt je obyčajný objekt:

PoleTypPovinnéPopis
codestringánoJazykový kód, napríklad sk-sk, en-gb, de-de.
namestringnieČitateľný názov jazyka.
dirstringnieSmer textu, zvyčajne ltr alebo rtl.
ostatné poliastringniePrekladové kľúče a ich hodnoty.

Príklad:

window.translations = new Map();

Localizer.registerTranslation(
{
code: 'sk-sk',
name: 'Slovenčina',
'global.save': 'Uložiť',
},
{
code: 'en-gb',
name: 'English',
'global.save': 'Save',
}
);

Správanie:

  • window.translations musí existovať ešte pred prvým volaním,
  • ak zaregistrujete rovnaký jazyk viackrát, kľúče sa zlúčia,
  • ak nový objekt obsahuje už existujúci kľúč, prepíše ho,
  • ak objekt nemá code, vypíše sa chyba do konzoly.

localizer.setLanguage()

Znovu vyhodnotí aktívny jazyk podľa localizer.lang.

Použite ju po tom, čo zmeníte lang počas behu aplikácie.

document.documentElement.lang = 'en-gb';
localizer.lang = 'en-gb';
localizer.setLanguage();

convertLangCode()

Prevedie frontendový kód jazyka na tvar, ktorý sa často používa v API dátach.

localizer.convertLangCode('sk-sk');
// sk_SK

Praktický príklad:

const apiKey = localizer.convertLangCode(localizer.currentLang);
const label = item.name?.values?.[apiKey];

Preklady

translate()

Vráti preklad pre daný kľúč.

ParameterTypPopis
keystringPrekladový kľúč.

Ak kľúč neexistuje, vráti sa pôvodný kľúč.

localizer.translate('app.hello');
// 'Ahoj'

translateWithParams()

Preloží text a doplní placeholdery vo formáte {name}.

ParameterTypPredvolená hodnotaPopis
keystring-Prekladový kľúč.
paramsRecord<string, unknown>{}Hodnoty pre placeholdery.

Správanie:

  • placeholder sa nahradí, ak hodnota existuje,
  • hodnota sa prevedie na string,
  • ak hodnota chýba alebo je null, placeholder zostane nezmenený.
localizer.translateWithParams('app.greeting', {
name: 'Ján',
});
// 'Ahoj Ján'

translatePlural()

Vyberie správny pluralizačný tvar cez Intl.PluralRules.

ParameterTypPredvolená hodnotaMožné hodnotyPopis
keystring--Základný kľúč bez suffixu.
countnumber0ľubovoľné čísloPočet, podľa ktorého sa vyberie tvar.
typestring'cardinal''cardinal', 'ordinal'Typ pluralizácie.

Metóda hľadá kľúče v tvare:

  • <key>.zero
  • <key>.one
  • <key>.two
  • <key>.few
  • <key>.many
  • <key>.other

Ak presný tvar neexistuje, použije fallback <key>.other.

const template = localizer.translatePlural('cart.items', 3);
const text = template.replace('{count}', 3);
// '3 položky'
note

translatePlural() iba vyberie správny string. Ak máte v texte placeholdery ako {count}, doplňte ich následne sami.

Formátovanie

formatNumber()

Funkcia pre čísla sa v API volá formatNumber(). Samostatné translateNumber() tu nie je.

Formátuje číslo cez Intl.NumberFormat.

ParameterTypPopis
numbernumberČíslo na formátovanie.
optionsIntl.NumberFormatOptionsVoľby formátovania.

Najčastejšie voľby:

VoľbaMožné hodnoty
style'decimal', 'currency', 'percent', 'unit'
currencynapríklad 'EUR', 'USD'
currencyDisplay'code', 'symbol', 'narrowSymbol', 'name'
currencySign'standard', 'accounting'
unitnapríklad 'byte', 'kilobyte', 'meter', 'celsius'
unitDisplay'short', 'long', 'narrow'
notation'standard', 'scientific', 'engineering', 'compact'
compactDisplay'short', 'long'
signDisplay'auto', 'never', 'always', 'exceptZero', 'negative'
useGroupingtrue, false, 'auto', 'always', 'min2'
minimumIntegerDigitsnumber
minimumFractionDigitsnumber
maximumFractionDigitsnumber
minimumSignificantDigitsnumber
maximumSignificantDigitsnumber
roundingPriority'auto', 'morePrecision', 'lessPrecision'
roundingIncrement1, 2, 5, 10, 20, 25, 50, 100, 200, 250, 500, 1000, 2000, 2500, 5000
roundingMode'ceil', 'floor', 'expand', 'trunc', 'halfCeil', 'halfFloor', 'halfExpand', 'halfTrunc', 'halfEven'
trailingZeroDisplay'auto', 'stripIfInteger'

Príklady:

localizer.formatNumber(1234.56, {
style: 'currency',
currency: 'EUR',
});

localizer.formatNumber(2048, {
style: 'unit',
unit: 'kilobyte',
unitDisplay: 'short',
});

formatDate()

Formátuje dátum cez Intl.DateTimeFormat.

ParameterTypPopis
datestring | Date | numberDátum, timestamp alebo parsovateľný string.
optionsIntl.DateTimeFormatOptionsVoľby formátovania.

Najčastejšie voľby:

VoľbaMožné hodnoty
dateStyle'full', 'long', 'medium', 'short'
timeStyle'full', 'long', 'medium', 'short'
weekday'long', 'short', 'narrow'
era'long', 'short', 'narrow'
year'numeric', '2-digit'
month'numeric', '2-digit', 'long', 'short', 'narrow'
day'numeric', '2-digit'
dayPeriod'narrow', 'short', 'long'
hour'numeric', '2-digit'
minute'numeric', '2-digit'
second'numeric', '2-digit'
fractionalSecondDigits1, 2, 3
hour12true, false
hourCycle'h11', 'h12', 'h23', 'h24'
timeZonenapríklad 'Europe/Bratislava', 'UTC'
timeZoneName'short', 'long', 'shortOffset', 'longOffset', 'shortGeneric', 'longGeneric'
calendarnapríklad 'gregory'
numberingSystemnapríklad 'latn', 'arab'
localeMatcher'lookup', 'best fit'
formatMatcher'basic', 'best fit'

Príklady:

localizer.formatDate(new Date(), {
dateStyle: 'long',
});

localizer.formatDate('2026-03-29T15:45:00Z', {
dateStyle: 'short',
timeStyle: 'short',
timeZone: 'Europe/Bratislava',
});

relativeTime()

Formátuje relatívny čas cez Intl.RelativeTimeFormat.

ParameterTypPredvolená hodnotaMožné hodnotyPopis
langstringthis.currentLanglocale kód alebo undefinedJazyk výstupu.
valuenumber0záporné aj kladné číslaPosun v čase.
unitstring'day''year', 'years', 'quarter', 'quarters', 'month', 'months', 'week', 'weeks', 'day', 'days', 'hour', 'hours', 'minute', 'minutes', 'second', 'seconds'Jednotka času.
optionsIntl.RelativeTimeFormatOptions{ numeric: 'auto' }viď nižšieVoľby formátovania.

Voľby options:

VoľbaMožné hodnoty
numeric'always', 'auto'
style'long', 'short', 'narrow'
localeMatcher'lookup', 'best fit'

Príklady:

localizer.relativeTime(undefined, -1, 'day');
// napríklad 'včera'

localizer.relativeTime('en-gb', 3, 'week', {
numeric: 'always',
style: 'short',
});
// 'in 3 wk.'
note

Prvý parameter je lang. Ak chcete použiť aktuálny jazyk localizeru, pošlite undefined, null alebo prázdny string.