localization: ship de-DE
Complete German catalog across all three namespaces, 1129 keys, machine-translated then reviewed for terminology and plurals. Fixed on review: "composer" (the chat input box) had been translated as "Editor" in two shortcuts strings, colliding with this app's actual Editor/Code-Editor feature — changed to "Eingabefeld". scopeDockers had drifted from the lowercase, untranslated "dockers" every other locale (including this one's own pt-PT/fr-FR precedent) uses for that filter-scope label. All 17 plural entries verified at count 0/1/2 — German uses the same one/other split as English, so this was mostly confirming "0 Elemente" reads right, not hunting for a CLDR surprise the way French needed. SHIPPED_LOCALES and the three parity tests now include de-DE. es-ES is drafted and under review — held out of the picker until it passes its own pass.
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"button": {
|
||||
"cancel": "Abbrechen",
|
||||
"confirm": "Bestätigen",
|
||||
"ok": "OK",
|
||||
"close": "Schließen"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Suchen",
|
||||
"open": "Suche öffnen",
|
||||
"close": "Suche schließen",
|
||||
"clear": "Suche leeren"
|
||||
},
|
||||
"select": {
|
||||
"placeholder": "Auswählen..."
|
||||
},
|
||||
"tabs": {
|
||||
"filterPlaceholder": "Filtern"
|
||||
},
|
||||
"commandBlock": {
|
||||
"run": "Im Terminal ausführen",
|
||||
"copy": "Befehl kopieren"
|
||||
},
|
||||
"colorPicker": {
|
||||
"placeholder": "Hex-Farbe"
|
||||
},
|
||||
"state": {
|
||||
"loading": "Wird geladen…"
|
||||
},
|
||||
"dataTable": {
|
||||
"empty": "Keine Daten gefunden.",
|
||||
"pagination": {
|
||||
"showingPage": "Seite {{current}} von {{total}}",
|
||||
"showingPageShort": "S. {{current}}/{{total}}",
|
||||
"rowsPerPage": "Zeilen pro Seite",
|
||||
"perPage": "{{size}} / Seite",
|
||||
"perPageShort": "{{size}}/S.",
|
||||
"first": "Erste",
|
||||
"prev": "Zurück",
|
||||
"next": "Weiter",
|
||||
"last": "Letzte"
|
||||
}
|
||||
},
|
||||
"pagination": {
|
||||
"label": "Seitennummerierung",
|
||||
"previous": "Zurück",
|
||||
"next": "Weiter",
|
||||
"morePages": "Weitere Seiten",
|
||||
"goToPrevious": "Zur vorherigen Seite",
|
||||
"goToNext": "Zur nächsten Seite"
|
||||
},
|
||||
"carousel": {
|
||||
"previous": "Vorherige Folie",
|
||||
"next": "Nächste Folie"
|
||||
},
|
||||
"breadcrumb": {
|
||||
"more": "Mehr"
|
||||
},
|
||||
"theme": {
|
||||
"toggle": "Farbmodus umschalten"
|
||||
},
|
||||
"error": {
|
||||
"forbidden": {
|
||||
"title": "Zugriff nicht autorisiert",
|
||||
"description": "Sie sind nicht berechtigt, diese Aktion auszuführen.",
|
||||
"hint": "Wenn Sie das für einen Fehler halten, wenden Sie sich an Ihre zuständige Person."
|
||||
},
|
||||
"unauthorized": {
|
||||
"title": "Ungültige Anmeldedaten",
|
||||
"description": "Ihr Zugriffstoken ist abgelaufen",
|
||||
"hint": "Bitte melden Sie sich erneut an"
|
||||
},
|
||||
"server": {
|
||||
"title": "Serverfehler"
|
||||
}
|
||||
},
|
||||
"logo": {
|
||||
"icon": "Officer-Symbol",
|
||||
"logo": "Officer-Logo"
|
||||
}
|
||||
}
|
||||
@@ -3,11 +3,12 @@ import { findMissingKeys } from 'i18n';
|
||||
import en from './en-GB.json';
|
||||
import ptPT from './pt-PT.json';
|
||||
import frFR from './fr-FR.json';
|
||||
import deDE from './de-DE.json';
|
||||
|
||||
// D2: every shipped locale ships a COMPLETE catalog. A key en-GB has and another locale lacks is a red
|
||||
// build, not a warning — there is no regional fallback to paper over the gap.
|
||||
describe('shared components (ui.*) locale catalogs', () => {
|
||||
test('every shipped locale has every key en-GB has', () => {
|
||||
expect(findMissingKeys(en, { 'pt-PT': ptPT, 'fr-FR': frFR })).toEqual([]);
|
||||
expect(findMissingKeys(en, { 'pt-PT': ptPT, 'fr-FR': frFR, 'de-DE': deDE })).toEqual([]);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user