initial
This commit is contained in:
68
frontend/src/i18n.ts
Normal file
68
frontend/src/i18n.ts
Normal file
@@ -0,0 +1,68 @@
|
||||
import i18n from "i18next";
|
||||
import { initReactI18next } from "react-i18next";
|
||||
|
||||
import en from "./locales/en/common.json";
|
||||
import de from "./locales/de/common.json";
|
||||
|
||||
const LANGUAGE_STORAGE_KEY = "contract-companion.language";
|
||||
const SUPPORTED_LANGUAGES = ["en", "de"] as const;
|
||||
|
||||
type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];
|
||||
|
||||
function normalizeLanguage(value?: string | null): SupportedLanguage {
|
||||
if (!value) return "en";
|
||||
const lower = value.toLowerCase();
|
||||
const match = SUPPORTED_LANGUAGES.find((lang) => lower.startsWith(lang));
|
||||
return match ?? "en";
|
||||
}
|
||||
|
||||
function detectInitialLanguage(): SupportedLanguage {
|
||||
if (typeof window === "undefined") {
|
||||
return "en";
|
||||
}
|
||||
|
||||
try {
|
||||
const stored = window.localStorage.getItem(LANGUAGE_STORAGE_KEY);
|
||||
if (stored) {
|
||||
return normalizeLanguage(stored);
|
||||
}
|
||||
} catch {
|
||||
// Access to localStorage might be blocked (e.g., privacy mode); ignore and fall back to navigator.
|
||||
}
|
||||
|
||||
return normalizeLanguage(window.navigator.language);
|
||||
}
|
||||
|
||||
const initialLanguage = detectInitialLanguage();
|
||||
|
||||
i18n.use(initReactI18next).init({
|
||||
resources: {
|
||||
en: { translation: en },
|
||||
de: { translation: de }
|
||||
},
|
||||
lng: initialLanguage,
|
||||
fallbackLng: "en",
|
||||
supportedLngs: ["en", "de"],
|
||||
interpolation: {
|
||||
escapeValue: false
|
||||
}
|
||||
});
|
||||
|
||||
if (typeof window !== "undefined") {
|
||||
const applyLanguageSideEffects = (lang: string) => {
|
||||
const normalized = normalizeLanguage(lang);
|
||||
try {
|
||||
window.localStorage.setItem(LANGUAGE_STORAGE_KEY, normalized);
|
||||
} catch {
|
||||
// Ignore storage write failures (private mode, etc.)
|
||||
}
|
||||
if (typeof document !== "undefined") {
|
||||
document.documentElement.setAttribute("lang", normalized);
|
||||
}
|
||||
};
|
||||
|
||||
applyLanguageSideEffects(initialLanguage);
|
||||
i18n.on("languageChanged", applyLanguageSideEffects);
|
||||
}
|
||||
|
||||
export default i18n;
|
||||
Reference in New Issue
Block a user