# Mehrsprachigkeitsunterstützung (i18n) für Memoro Diese Komponente implementiert die Mehrsprachigkeitsunterstützung (Internationalisierung/i18n) für die Memoro-App mit Hilfe von `expo-localization`, `i18next` und `react-i18next`. ## Funktionen - Automatische Erkennung der Gerätesprache - Unterstützung für 45 Sprachen - Persistente Speicherung der Spracheinstellung - Benutzerfreundliche Sprachauswahl-Komponente - Vollständige Integration in die App-Einstellungen - Kulturspezifische Zeit- und Datumsformatierung ## Struktur ``` features/i18n/ ├── index.ts # Hauptkonfiguration für i18next ├── LanguageContext.tsx # React Context für die Sprachverwaltung ├── LanguageSelector.tsx # UI-Komponente für die Sprachauswahl ├── translations/ # Übersetzungsdateien │ ├── de.json # Deutsche Übersetzungen │ └── en.json # Englische Übersetzungen └── README.md # Diese Dokumentation ``` ## Verwendung ### Übersetzungen verwenden Um Texte in der App zu übersetzen, verwende den `useTranslation`-Hook: ```tsx import { useTranslation } from 'react-i18next'; function MyComponent() { const { t } = useTranslation(); return ( {t('common.save')} ); } ``` ### Sprache ändern Um die Sprache programmatisch zu ändern, verwende den `useLanguage`-Hook: ```tsx import { useLanguage } from '~/features/i18n/LanguageContext'; function MyComponent() { const { changeLanguage } = useLanguage(); const handleChangeLanguage = async (language: string) => { await changeLanguage(language); }; return ( ); } ``` ### Sprachauswahl-Komponente einbinden Die Sprachauswahl-Komponente kann wie folgt eingebunden werden: ```tsx import { useState } from 'react'; import LanguageSelector from '~/features/i18n/LanguageSelector'; function MyComponent() { const [isLanguageSelectorVisible, setIsLanguageSelectorVisible] = useState(false); return ( <> setIsLanguageSelectorVisible(false)} /> ); } ``` ## Neue Sprachen hinzufügen Um eine neue Sprache hinzuzufügen: 1. Erstelle eine neue Übersetzungsdatei in `translations/` (z.B. `fr.json`) 2. Füge die Sprache zur `LANGUAGES`-Konstante in `index.ts` hinzu: ```typescript export const LANGUAGES = { de: { nativeName: 'Deutsch', emoji: '🇩🇪' }, en: { nativeName: 'English', emoji: '🇬🇧' }, fr: { nativeName: 'Français', emoji: '🇫🇷' }, // Neue Sprache }; ``` 3. Importiere die neue Übersetzungsdatei in `index.ts` und füge sie zu den Ressourcen hinzu: ```typescript import fr from './translations/fr.json'; // ... resources: { de: { translation: de }, en: { translation: en }, fr: { translation: fr }, // Neue Sprache }, ``` ## Übersetzungsschlüssel Die Übersetzungsschlüssel sind hierarchisch organisiert: - `common`: Allgemeine Begriffe (Speichern, Abbrechen, etc.) - `auth`: Authentifizierungsbezogene Texte - `home`: Texte für die Home-Seite - `memo`: Texte für Memo-bezogene Funktionen - `settings`: Texte für die Einstellungsseite ## Zeit- und Datumsformatierung Die App unterstützt kulturspezifische Zeit- und Datumsformatierung für alle 45 Sprachen. ### Zeitformatierung Die Zeitanzeige wird automatisch an die jeweilige Sprache angepasst: #### Sprachen mit speziellen Suffixen/Präfixen: - 🇩🇪 **Deutsch**: "19:30 Uhr" - 🇳🇱 **Niederländisch**: "19:30 uur" - 🇩🇰 **Dänisch**: "kl. 19.30" (mit Punkt-Trenner) - 🇸🇪 **Schwedisch**: "kl. 19:30" - 🇫🇷 **Französisch**: "19h30" - 🇧🇬 **Bulgarisch**: "19:30 ч." - 🇱🇹 **Litauisch**: "19:30 val." - 🇫🇮 **Finnisch**: "klo 19.30" (mit Punkt-Trenner) - 🇹🇭 **Thailändisch**: "19:30 น." - 🇮🇩 **Indonesisch**: "19.30" (Punkt statt Doppelpunkt) #### 12-Stunden-Format Sprachen: - 🇬🇧 **Englisch**: "7:30 PM" - 🇮🇳 **Hindi**: "7:30 PM" - 🇵🇰 **Urdu**: "7:30 PM" - 🇵🇭 **Tagalog**: "7:30 PM" - 🇲🇾 **Malaiisch**: "7:30 PM" #### Einfaches 24-Stunden-Format: Alle anderen Sprachen verwenden "19:30" ohne Suffix. ### Datumsformatierung Die Datumsanzeige nutzt die native `toLocaleDateString()` Funktion mit der aktuellen App-Sprache: ```typescript // Beispiele: // Deutsch: "Montag, 7. Januar 2025" // Englisch: "Monday, January 7, 2025" // Französisch: "lundi 7 janvier 2025" ``` ### Implementierung Die Zeit- und Datumsformatierung ist in folgenden Dateien implementiert: - `/utils/formatters.ts` - Zentrale Formatierungsfunktionen - `/features/memos/utils/dateFormatters.ts` - React Hooks für locale-aware Formatierung - Komponenten nutzen `useFormatTime()` und `useFormatDate()` Hooks für konsistente Formatierung ### Verwendung in Komponenten ```typescript import { useFormatTime, useFormatDate } from '~/features/memos/utils/dateFormatters'; function MyComponent() { const formatTime = useFormatTime(); const formatDate = useFormatDate(); const now = new Date(); return ( <> {formatDate(now)} {formatTime(now)} ); } ``` ## Abhängigkeiten - `expo-localization`: Für die Erkennung der Gerätesprache - `i18next`: Hauptbibliothek für Internationalisierung - `react-i18next`: React-Bindings für i18next - `@react-native-async-storage/async-storage`: Für die persistente Speicherung der Spracheinstellung