chahinebrini 10219e5f68 feat(i18n): add french as 3rd app language
Für Test-Kunden: vollständige fr-Locale mit Tonalität für Recovery-Kontext
(„addiction", „Série", „Période de blocage"). Eigenname „Lyra" und Brand
„Rebreak" bleiben unübersetzt.

- locales/fr.json: 1:1 key parity zu de.json/en.json (UI-Agent-Output)
- lib/i18n.ts: fr in resources + initialLng-Detection (Device-Locale fr → fr)
- stores/language.ts: AppLanguage union ergänzt um 'fr', init-Logic + persistence
- app/settings.tsx: Sprach-Picker mit dritter Option Français
- de.json/en.json: language_fr-Label + language_desc trilingual

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 11:03:37 +02:00

31 lines
894 B
TypeScript

import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import * as Localization from 'expo-localization';
import de from '../locales/de.json';
import en from '../locales/en.json';
import fr from '../locales/fr.json';
const deviceLocale = Localization.getLocales()[0]?.languageCode ?? 'en';
const initialLng =
deviceLocale === 'de' ? 'de' : deviceLocale === 'fr' ? 'fr' : 'en';
i18n.use(initReactI18next).init({
resources: {
de: { translation: de },
en: { translation: en },
fr: { translation: fr },
},
lng: initialLng,
fallbackLng: 'en',
// RN hat kein eingebautes Intl.PluralRules — v3 funktioniert nativ ohne Polyfill
compatibilityJSON: 'v3',
interpolation: {
escapeValue: false,
// Locale-Dateien verwenden Vue-i18n-Style %{var} (1:1 portiert aus der Nuxt-App).
prefix: '%{',
suffix: '}',
},
});
export default i18n;