Kern 0.12.0 GitHub
Fundamentals

Localization

Formats come from Intl; texts come from Kern in English or German, and every one can be replaced.

Locale

Components that format dates, times, numbers or sizes take a locale (BCP 47). Without it they use <html lang>, then the browser language.

Texts

Buttons, hints, validation messages and names for screen readers are Kern texts. Kern ships them in English and German and picks the language in this order:

  1. the language set with setKernLocale(),
  2. <html lang>, also when it changes later,
  3. English.

The browser language is not used for texts, so they match the language of the app. A change re-renders all components at once, including validation messages already shown.

import { setKernLocale } from '@yfridelance/kern'; setKernLocale('de'); // German texts setKernLocale(); // follow <html lang> again

Up to version 0.8 the texts were German by default. An app that relies on this sets <html lang="de"> or calls setKernLocale('de').

More languages and own wording

setKernStrings() adds texts for a language or replaces single ones; missing texts fall back to the built-in ones of the base language, then English. Texts for a region (de-CH) win over those for the language (de).

import { setKernLocale, setKernStrings } from '@yfridelance/kern'; setKernStrings('fr', { 'kern-pagination.labelNext': 'Page suivante', 'kern-pagination.labelRange': '{from}–{to} sur {total}', }); setKernStrings('de-CH', { 'kern-table.labelEmpty': 'Nüt da' }); setKernLocale('fr');

Apps with their own i18n call setKernLocale() where they switch the language:

translate.onLangChange.subscribe(({ lang }) => setKernLocale(lang));

Language switcher

kern-language-select lets people pick the language: as a dropdown with names or codes, with or without flags, or side by side. It reports the choice with kernChange; the app switches its own texts and Kern's.

switcher.addEventListener('kernChange', (e) => setKernLocale(e.detail.value));

Single components

Every text is also a property, mostly starting with label, e.g. close-label on kern-dialog, label-invalid on typed fields, label-range on kern-pagination. A property set on a component wins over the Kern text. Placeholders like {n} or {name} are replaced. The property tables on each component page list them with their English and German default.

<kern-pagination total="380" label-range="{from}–{to} of {total} devices"></kern-pagination>

Functions take their texts as options (confirmLabel, cancelLabel for confirm(), closeLabel for toast()) and otherwise use the Kern texts too. setToastRegionLabel() fixes the name of the region all toasts share; without it the name follows the language.

All texts

Keys are <tag>.<property>, plus confirm.… and toast.… for the functions.

Keyende
kern-app-shell.labelSkipSkip to contentZum Inhalt springen
kern-app-shell.labelNavigationNavigationNavigation
kern-breadcrumb.labelPathPfad
kern-breadcrumb.labelMoreMore levelsWeitere Ebenen
kern-calendar.labelCalendarKalender
kern-calendar.labelPrevPrevious monthVorheriger Monat
kern-calendar.labelNextNext monthNächster Monat
kern-calendar.labelWeekWkKW
kern-chip.labelRemoveRemove {label}{label} entfernen
kern-code.labelCopyCopyKopieren
kern-code.labelCopiedCopiedKopiert
kern-code.labelLatestJump to latestZum Neuesten
kern-color-picker.labelOpenChoose colorFarbe wählen
kern-color-picker.labelAreaSaturation and brightnessSättigung und Helligkeit
kern-color-picker.labelHueHueFarbton
kern-color-picker.labelTemperatureColor temperatureFarbtemperatur
kern-color-picker.labelInvalidNot a valid colorKeine gültige Farbe
kern-command-palette.labelCommand paletteBefehlspalette
kern-command-palette.placeholderSearch pages, devices and actions …Seiten, Geräte und Aktionen suchen …
kern-command-palette.labelLoadingSearching …Suche läuft …
kern-command-palette.labelNoResultsNo resultsKeine Treffer
kern-command-palette.labelResults{n} results{n} Treffer
kern-command-palette.labelOneResult1 result1 Treffer
kern-copy.labelCopyKopieren
kern-date-picker.labelOpenOpen calendarKalender öffnen
kern-date-picker.labelClearClearLeeren
kern-date-picker.labelInvalidNot a valid dateKein gültiges Datum
kern-date-picker.labelOutOfRangeDate not allowedDatum nicht erlaubt
kern-date-range-picker.labelStartFromVon
kern-date-range-picker.labelEndToBis
kern-date-range-picker.labelOpenOpen calendarKalender öffnen
kern-date-range-picker.labelClearClearLeeren
kern-date-range-picker.labelInvalidNot a valid dateKein gültiges Datum
kern-date-range-picker.labelOutOfRangeDate not allowedDatum nicht erlaubt
kern-date-range-picker.labelIncompleteEnter start and endStart und Ende angeben
kern-date-range-picker.labelTooLongAt most {n} daysHöchstens {n} Tage
kern-dialog.closeLabelCloseSchliessen
kern-drawer.closeLabelCloseSchliessen
kern-empty-state.headingEmptyNo entries yetNoch keine Einträge
kern-empty-state.headingNoResultsNo matchesKeine Treffer
kern-empty-state.headingErrorCould not loadLaden fehlgeschlagen
kern-file-input.labelChooseChoose fileDatei wählen
kern-file-input.labelChooseMultipleChoose filesDateien wählen
kern-file-input.labelDropor drop hereoder hierher ziehen
kern-file-input.labelRemoveRemove {name}{name} entfernen
kern-file-input.labelTooLarge“{name}” is larger than {max}.«{name}» ist grösser als {max}.
kern-file-input.labelWrongType“{name}” is not an allowed file type.«{name}» hat keinen erlaubten Dateityp.
kern-ip-input.labelInvalidNot a valid IPv4 addressKeine gültige IPv4-Adresse
kern-ip-input.labelNotAllowedThis form is not allowed hereDiese Form ist hier nicht erlaubt
kern-ip-input.labelTooManyAt most {n} addressesHöchstens {n} Adressen
kern-ip-input.labelCount{n} addresses{n} Adressen
kern-ip-input.labelInvalidMaskNot a valid subnet maskKeine gültige Subnetzmaske
kern-ip-input.labelMaskCount/{prefix} · {n} hosts/{prefix} · {n} Hosts
kern-json-diff.labelBeforeBeforeVorher
kern-json-diff.labelAfterAfterNachher
kern-json-diff.labelPathPathPfad
kern-json-diff.labelKindKindArt
kern-json-diff.labelAddedaddedneu
kern-json-diff.labelRemovedremovedentfernt
kern-json-diff.labelChangedchangedgeändert
kern-json-diff.labelNoneNo differencesKeine Unterschiede
kern-json-diff.labelSummary{n} differences: {changed} changed, {added} added, {removed} removed{n} Unterschiede: {changed} geändert, {added} neu, {removed} entfernt
kern-language-select.labelLanguageSprache
kern-link.labelExternalopens in a new taböffnet in neuem Tab
kern-list.emptyNo entriesKeine Einträge
kern-log.labelLogLog
kern-log.labelSearchSearch logLog durchsuchen
kern-log.labelLevelLevelStufe
kern-log.labelAllLevelsAll levelsAlle Stufen
kern-log.labelSourceSourceQuelle
kern-log.labelAllSourcesAll sourcesAlle Quellen
kern-log.labelDebugDebugDebug
kern-log.labelInfoInfoInfo
kern-log.labelWarnWarningWarnung
kern-log.labelErrorErrorFehler
kern-log.labelPausePauseAnhalten
kern-log.labelResumeResumeFortsetzen
kern-log.labelCopyCopyKopieren
kern-log.labelCopyEntryCopy entryEintrag kopieren
kern-log.labelCopiedCopiedKopiert
kern-log.labelDownloadDownloadHerunterladen
kern-log.labelDetailsDetailsDetails
kern-log.labelLatestJump to latestZum Neuesten
kern-log.labelNew{n} new{n} neu
kern-log.labelAnnounceNew log entries: {n}Neue Log-Einträge: {n}
kern-log.labelCount{n} of {total}{n} von {total}
kern-log.labelResetReset filtersFilter zurücksetzen
kern-mac-input.labelInvalidNot a valid MAC addressKeine gültige MAC-Adresse
kern-pagination.labelPagesSeiten
kern-pagination.labelRange{from}–{to} of {total}{from}–{to} von {total}
kern-pagination.labelPageSizePer pagePro Seite
kern-pagination.labelPagePage {n}Seite {n}
kern-pagination.labelFirstFirst pageErste Seite
kern-pagination.labelPreviousPrevious pageVorherige Seite
kern-pagination.labelNextNext pageNächste Seite
kern-pagination.labelLastLast pageLetzte Seite
kern-range.labelFromFromVon
kern-range.labelToToBis
kern-rating.labelValue{n} of {max} stars{n} von {max} Sternen
kern-select.labelSearchSearch …Suchen …
kern-select.labelNoResultsNo resultsKeine Treffer
kern-select.labelRemoveRemove {label}{label} entfernen
kern-signal.labelWi-Fi signalWLAN-Signal
kern-sparkline.labelTrendVerlauf
kern-step-input.labelDecreaseDecreaseVerringern
kern-step-input.labelIncreaseIncreaseErhöhen
kern-step-input.labelInvalidNot a valid numberKeine gültige Zahl
kern-table.labelEmptyNo entriesKeine Einträge
kern-table.labelSelectAllSelect allAlle auswählen
kern-table.labelSelectRowSelect rowZeile auswählen
kern-table.labelExpandRowShow detailsDetails anzeigen
kern-table-columns.labelColumnsSpalten
kern-table-columns.labelMoveUpMove {label} up{label} nach oben
kern-table-columns.labelMoveDownMove {label} down{label} nach unten
kern-table-columns.labelPinnedStartPinned to startAm Anfang fixiert
kern-table-columns.labelPinnedEndPinned to endAm Ende fixiert
kern-table-columns.labelMoved{label}: position {position} of {count}{label}: Position {position} von {count}
kern-theme-toggle.labelLightSwitch to light themeZu hellem Design wechseln
kern-theme-toggle.labelDarkSwitch to dark themeZu dunklem Design wechseln
kern-time-picker.labelHourHoursStunden
kern-time-picker.labelMinuteMinutesMinuten
kern-time-picker.labelSecondSecondsSekunden
kern-time-picker.labelPeriodAM/PMVormittag/Nachmittag
kern-time-picker.labelListChoose timeZeit wählen
kern-time-picker.labelOutOfRangeTime not allowedZeit nicht erlaubt
kern-timeline.emptyNo events yetNoch keine Ereignisse
kern-timeline.labelMoreLoad moreWeitere laden
kern-timeline.labelLoaded{n} more events loaded{n} weitere Ereignisse geladen
kern-timeline-item.labelShowShow detailsDetails anzeigen
kern-timeline-item.labelHideHide detailsDetails ausblenden
kern-toast.closeLabelCloseSchliessen
kern-topbar.labelMenuMenuMenü
kern-topbar.navLabelMain navigationHauptnavigation
confirm.confirmLabelOKOK
confirm.cancelLabelCancelAbbrechen
confirm.typeToConfirmLabelType {list} to confirmZur Bestätigung {list} eintippen
confirm.quote“{text}”«{text}»
confirm.ororoder
toast.regionLabelNotificationsBenachrichtigungen