Internationalisierungssystem (i18n)
E-Cashpoint Web verwendet react-i18next mit 3 unterstützten Sprachen: Deutsch (Standard), Spanisch und Englisch.
Konfiguration
Das System wird in „src/i18n/index.js“ initialisiert:
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import es from './locales/es.json';
import de from './locales/de.json';
import en from './locales/en.json';
const resources = {
es: { translation: es },
de: { translation: de },
en: { translation: en },
};
i18n
.use(initReactI18next)
.init({
resources,
lng: 'de', // idioma por defecto: alemán
fallbackLng: 'de',
interpolation: { escapeValue: false },
});
export default i18n;
Dateistruktur
src/i18n/
├── index.js
└── locales/
├── de.json (alemán - fuente de verdad)
├── en.json (inglés)
└── es.json (español)
Jede Datei verfügt über +1700 Schlüssel, die in Namespaces organisiert sind:
{
"common": { ... },
"auth": { ... },
"client": { ... },
"comercio": { ... },
"setup": { ... },
"demoMarketing": { ... },
"handelsPanel": { ... },
"servicesPanel": { ... },
"restaurantCatalog": { ... },
...
}
Verwendung in Komponenten
Einfacher Haken
import { useTranslation } from 'react-i18next';
function MiComponente() {
const { t, i18n } = useTranslation();
return (
<div>
<h1>{t('common.welcome')}</h1>
<p>Idioma actual: {i18n.language}</p>
<button onClick={() => i18n.changeLanguage('es')}>
Español
</button>
</div>
);
}
Mit Interpolation
// de.json
{
"user": {
"greeting": "Hallo, {name}!"
}
}
<h1>{t('user.greeting', { name: 'María' })}</h1>
// Result: "Hallo, María!"
Mit Pluralisierung
{
"cart": {
"items": "{{count}} Artikel",
"items_plural": "{{count}} Artikel"
}
}
<span>{t('cart.items', { count: items.length })}</span>
###Zurückgreifen
Wenn ein Schlüssel in der aktuellen Sprache nicht existiert, wird fallbackLng (deutsch) verwendet:
t('non.existent.key')
// Devuelve "non.existent.key" si no existe en ningún idioma
// O usa el valor de fallbackLng si está disponible
Sprachwechsel zur Laufzeit
import { useTranslation } from 'react-i18next';
const { i18n } = useTranslation();
// Cambiar idioma
i18n.changeLanguage('es'); // a español
i18n.changeLanguage('en'); // a inglés
i18n.changeLanguage('de'); // a alemán
// Idioma actual
console.log(i18n.language); // 'es'
Neue Übersetzungen hinzufügen
Schritt 1: Schlüssel zu den 3 Dateien hinzufügen
// de.json
{
"miModulo": {
"saludo": "Willkommen",
"despedida": "Auf Wiedersehen"
}
}
// en.json
{
"miModulo": {
"saludo": "Welcome",
"despedida": "Goodbye"
}
}
// es.json
{
"miModulo": {
"saludo": "Bienvenido",
"despedida": "Adiós"
}
}
Schritt 2: Verwendung in der Komponente
const { t } = useTranslation();
return <h1>{t('miModulo.saludo')}</h1>;
Wichtige Regeln
✅ Tun Sie es
- ✅ Verwenden Sie beschreibenden Namensraum: „handelsPanel.modal.title“ anstelle von „title1“.
- ✅ Gruppierung nach Modul/Komponente: Alle Schlüssel eines Modals werden unter „modal.*“ angezeigt
- ✅ Gemeinsame Schlüssel wiederverwenden: „common.cancel“, „common.save“ statt zu duplizieren
- ✅ Halten Sie die 3 Dateien synchron (gleiche Schlüssel in allen 3)
- ✅ Verwenden Sie Parameter für dynamische Werte:
t('user.greeting', { name }) - ✅ Camelcase in Schlüsseln: „myModule.myKey“ (nicht „snake_case“)
- ✅ Verwenden Sie Fallback auf Deutsch, wenn ein Text sehr spezifisch ist
❌ Vermeiden
- ❌ Hardcode-Strings in Deutsch/Spanisch/Englisch in JSX
- ❌ Schlüssel mit Sonderzeichen erstellen (nur Buchstaben, Zahlen, Punkte, Bindestriche)
- ❌ Sprachen im selben Namensraum mischen
- ❌ Schlüssel in einer der 3 Dateien vergessen
- ❌ KI-Prompt-Marketing-Strings auf i18n (es handelt sich um Daten, nicht um die Benutzeroberfläche)
Muster für Arrays in Daten
Wenn Sie Arrays von Objekten haben, die gerendert werden, verwenden Sie „labelKey“:
// En constants.js
export const MY_OPTIONS = [
{ value: 'a', labelKey: 'options.a' },
{ value: 'b', labelKey: 'options.b' },
];
// En el componente
{MY_OPTIONS.map(opt => (
<option key={opt.value} value={opt.value}>
{t(opt.labelKey)}
</option>
))}
Nächste Schritte
- Lernen Sie die Stile und Themen → kennen
- Gehen Sie zurück zu Architektur →