Przejdź do głównej zawartości

Admin UI Translations

This page covers Admin UI string bundles only (each module's own i18n/ directory). The documentation site (docs/) uses a separate manual bilingual workflow — cache entries, materialised markdown under docs/i18n/pl/, and check:docs-translations. See Documentation site i18n.

The Admin UI is bilingual at launch — every user-visible string is shipped in both English (the platform-wide source of truth) and Polish. The mechanism is a set of filesystem bundles per module, the lifecycle reconciler that loads them, the in-process resolver and the language picker. This page is the source of truth for the in-house Polish glossary and the workflow for adding new strings without regressing coverage.

Polish glossary​

Use the canonical Polish rendering of every recurring B2B-commerce term on every screen. Consistency beats local cleverness — when in doubt, look here first and only propose a glossary edit if the term genuinely does not fit.

English termPolish termNotes
sales channelkanał sprzedażyalways lowercase mid-sentence
sales channelskanały sprzedażyplural
price listcennik
price listscennikiplural
quote requestzapytanie ofertowethe "RFQ" concept
quote requestszapytania ofertoweplural
orderzamówienie
orderszamówieniaplural
customerklientindividual; B2B-buyer side
organisationorganizacjacorporate buyer
accountkontologin/admin context
admin userużytkownik admina
rolerola
permissionuprawnienie
audit logdziennik audytu
productprodukt
productsproduktynom. plural for 2-4; produktów for 5+
variantwariant
attributeatrybut
attributesatrybuty
attribute setzestaw atrybutów
categorykategoria
gallerygaleria
attachmentzałącznik
inventorystany magazynowethe noun for "warehouse stock"
inventory levelpoziom stanu
stockstan magazynowy
warehousemagazyn
warehousesmagazynyplural
promotionpromocja
promotionspromocjeplural
tax ratestawka podatku
megamenumegamenuproper noun; remains untranslated
blog postwpis na blogu
CMS pagestrona CMS
dictionary entrywpis słownika
dictionarysłownik
settingustawienie
settingsustawieniaalso the screen name
setting groupgrupa ustawień
global valuewartość globalnasettings inheritance
channel overridenadpisanie kanałusettings inheritance
value (setting)wartość
comparisonporównaniethe customer-facing compare feature
shopping listlista zakupów
credit limitlimit kredytowy
assetzasóbgeneric file/image asset
integrationintegracja
webhookwebhookproper noun; remains untranslated
API keyklucz API
importimport
exporteksport
SEOSEOproper noun; remains untranslated
profileprofil"My profile" → "Mój profil"
loginlogowaniethe noun; the action is "zaloguj się"
sign in (verb)zaloguj się
sign out (verb)wyloguj się
savezapiszbutton label; lowercase in sentences
save changeszapisz zmianybutton label
discardodrzućbutton label
cancelanulujbutton label
deleteusuńbutton label
resetresetujbutton label
reset to defaultprzywróć domyślnebutton label
editedytujbutton label
createutwórzbutton label
adddodajbutton label
removeusuńreuse "usuń" — context disambiguates
searchszukajverb (button); the noun is "wyszukiwarka"
loadingwczytywanieprogress label
savingzapisywanieprogress label
empty / no resultsbrak wyników
settings page titleUstawieniacapitalised page title
products page titleProdukty
categories page titleKategorie
customers page titleKlienci
organisations pageOrganizacje

Adding a new term​

When a new module or screen introduces a B2B-domain concept that needs a canonical Polish rendering, add a row to the glossary table above in the same PR that introduces the strings. Include:

  • the English term as it appears in the UI source-of-truth strings,
  • the agreed Polish rendering,
  • a one-line note when the term is conditional (gender, capitalisation, mid-sentence form, abbreviation rules).

If the team disagrees on a Polish rendering, the PR author files a glossary amendment as a separate PR and references the open module PR — the module PR unblocks once the glossary lands.

Adding a new user-visible string​

Workflow for any developer adding a new string to the Admin UI:

  1. Find the owning module: usually packages/modules/<module>/i18n/. Chrome strings (AppShell, top bar, command palette, profile, login, language picker) live in packages/modules/_i18n/i18n/ under the core scope — the _i18n module ships as the package @endora-commerce/mod-i18n, and a module package keeps its bundles at its own root rather than under src/.
  2. Pick a stable key path: dotted lowercase, e.g. page.title, actions.save, editor.applyTo.label. Reuse existing keys where the meaning is identical; do not invent parallel keys for "Save".
  3. Add the English entry to en.json. This is the canonical meaning; if it includes a count or a name, use {name} placeholders.
  4. Add the Polish entry to pl.json. Consult the glossary above. Match the placeholder list exactly. For counts in running text use the three-pattern strategy described under Polish quality bar.
  5. Replace the hard-coded literal in the source:
    <Button>{t('actions.save')}</Button> // where t = useTranslation('moduleId')
    For server-emitted strings:
    await i18nService.translate('moduleId', 'key', recipientLanguage, params);
  6. Restart the backend so the lifecycle reconciler upserts the bundle into translation_bundles. (Bundle files are read by readFileSync, not by tsx watch — JSON edits don't trigger a hot reload.)
  7. Local check:
    pnpm --filter backend run i18n:coverage --modules <moduleId> --strict
    Exit code 0 = clean. Any non-zero exit lists the keys to fix.
  8. CI gate: every PR that adds a user-visible string MUST add both English and Polish entries in the owning bundle. CI runs pnpm --filter backend run i18n:coverage -- --strict for bundle parity and pnpm --filter backend run i18n:hardcoded -- ../admin/src --strict for JSX literals. The coverage diagnostic enforces bundle-side completeness; the hardcoded-string lint enforces the Admin UI source side. A PR that drops a Polish entry or ships a hard-coded user-visible JSX string fails before merge.

Polish quality bar​

  • Native, not literal: Polish strings are written for a native Polish reader, not transliterated from English. A reviewer pass before merge is required.
  • Locale formatting: numbers, dates, currencies, and relative times must use Polish locale conventions. Use browser-native Intl.NumberFormat('pl-PL', …) / Intl.DateTimeFormat('pl-PL', …) at the rendering layer; never encode locale assumptions in the bundle entry itself.
  • Plurals: the translation mechanism deliberately ships singular-vs-plural only — ICU MessageFormat is deferred. For Polish counts in running text follow the three-pattern strategy: avoid the count in text, use a colon phrasing, or branch on the count in code.
  • Length: Polish strings tend to be longer than English. UI containers must grow, wrap, or expose a tooltip — never clip or overflow.