import { createI18n } from 'vue-i18n'; import store from '../store/index.js'; import enGeneral from './locales/en/general.json'; import enHeader from './locales/en/header.json'; import enNavigation from './locales/en/navigation.json'; import enHome from './locales/en/home.json'; import enChat from './locales/en/chat.json'; import enRegister from './locales/en/register.json'; import enError from './locales/en/error.json'; import enActivate from './locales/en/activate.json'; import enSettings from './locales/en/settings.json'; import enAdmin from './locales/en/admin.json'; import enSocialNetwork from './locales/en/socialnetwork.json'; import enFriends from './locales/en/friends.json'; import enFalukant from './locales/en/falukant.json'; import enPasswordReset from './locales/en/passwordReset.json'; import enBlog from './locales/en/blog.json'; import enMinigames from './locales/en/minigames.json'; import enMessage from './locales/en/message.json'; import enPersonal from './locales/en/personal.json'; import enSeo from './locales/en/seo.json'; import cebGeneral from './locales/ceb/general.json'; import cebHeader from './locales/ceb/header.json'; import cebNavigation from './locales/ceb/navigation.json'; import cebHome from './locales/ceb/home.json'; import cebRegister from './locales/ceb/register.json'; import cebActivate from './locales/ceb/activate.json'; import cebError from './locales/ceb/error.json'; import cebMessage from './locales/ceb/message.json'; import cebSettings from './locales/ceb/settings.json'; import cebAdmin from './locales/ceb/admin.json'; import cebPasswordReset from './locales/ceb/passwordReset.json'; import cebSocialNetwork from './locales/ceb/socialnetwork.json'; import cebFriends from './locales/ceb/friends.json'; import cebChat from './locales/ceb/chat.json'; import cebPersonal from './locales/ceb/personal.json'; import cebFalukant from './locales/ceb/falukant.json'; import cebBlog from './locales/ceb/blog.json'; import cebMinigames from './locales/ceb/minigames.json'; import cebSeo from './locales/ceb/seo.json'; import deGeneral from './locales/de/general.json'; import deHeader from './locales/de/header.json'; import deNavigation from './locales/de/navigation.json'; import deHome from './locales/de/home.json'; import deChat from './locales/de/chat.json'; import deRegister from './locales/de/register.json'; import deError from './locales/de/error.json'; import deActivate from './locales/de/activate.json'; import deSettings from './locales/de/settings.json'; import deAdmin from './locales/de/admin.json'; import deSocialNetwork from './locales/de/socialnetwork.json'; import deFriends from './locales/de/friends.json'; import deFalukant from './locales/de/falukant.json'; import dePasswordReset from './locales/de/passwordReset.json'; import deBlog from './locales/de/blog.json'; import deMinigames from './locales/de/minigames.json'; import deMessage from './locales/de/message.json'; import dePersonal from './locales/de/personal.json'; import deSeo from './locales/de/seo.json'; import esGeneral from './locales/es/general.json'; import esHeader from './locales/es/header.json'; import esNavigation from './locales/es/navigation.json'; import esHome from './locales/es/home.json'; import esChat from './locales/es/chat.json'; import esRegister from './locales/es/register.json'; import esError from './locales/es/error.json'; import esActivate from './locales/es/activate.json'; import esSettings from './locales/es/settings.json'; import esAdmin from './locales/es/admin.json'; import esSocialNetwork from './locales/es/socialnetwork.json'; import esFriends from './locales/es/friends.json'; import esFalukant from './locales/es/falukant.json'; import esPasswordReset from './locales/es/passwordReset.json'; import esBlog from './locales/es/blog.json'; import esMinigames from './locales/es/minigames.json'; import esMessage from './locales/es/message.json'; import esPersonal from './locales/es/personal.json'; import esSeo from './locales/es/seo.json'; import frGeneral from './locales/fr/general.json'; import frHeader from './locales/fr/header.json'; import frNavigation from './locales/fr/navigation.json'; import frHome from './locales/fr/home.json'; import frChat from './locales/fr/chat.json'; import frRegister from './locales/fr/register.json'; import frError from './locales/fr/error.json'; import frActivate from './locales/fr/activate.json'; import frSettings from './locales/fr/settings.json'; import frAdmin from './locales/fr/admin.json'; import frSocialNetwork from './locales/fr/socialnetwork.json'; import frFriends from './locales/fr/friends.json'; import frFalukant from './locales/fr/falukant.json'; import frPasswordReset from './locales/fr/passwordReset.json'; import frBlog from './locales/fr/blog.json'; import frMinigames from './locales/fr/minigames.json'; import frMessage from './locales/fr/message.json'; import frPersonal from './locales/fr/personal.json'; import frSeo from './locales/fr/seo.json'; function isPlainObject(value) { return value !== null && typeof value === 'object' && !Array.isArray(value); } /** Tiefes Zusammenführen von Locale-Chunks (ceb überschreibt en nur auf Blattebene, ohne ganze Teilbäume zu verwerfen). */ function deepMerge(target, source) { if (!isPlainObject(source)) return target; const base = isPlainObject(target) ? { ...target } : {}; for (const key of Object.keys(source)) { const sv = source[key]; const tv = base[key]; if (isPlainObject(sv) && isPlainObject(tv)) { base[key] = deepMerge(tv, sv); } else if (isPlainObject(sv)) { base[key] = deepMerge({}, sv); } else { base[key] = sv; } } return base; } function mergeLocaleChunks(chunks) { return chunks.reduce((acc, chunk) => deepMerge(acc, chunk), {}); } const cebLocaleChunks = [ enGeneral, enHeader, enNavigation, enHome, enChat, enRegister, enPasswordReset, enError, enActivate, enSettings, enAdmin, enSocialNetwork, enFriends, enFalukant, enBlog, enMinigames, enMessage, enPersonal, enSeo, cebGeneral, cebHeader, cebNavigation, cebHome, cebRegister, cebActivate, cebError, cebMessage, cebSettings, cebAdmin, cebPasswordReset, cebSocialNetwork, cebFriends, cebChat, cebPersonal, cebFalukant, cebBlog, cebMinigames, cebSeo, ]; const messages = { en: { ...enGeneral, ...enHeader, ...enNavigation, ...enHome, ...enChat, ...enRegister, ...enPasswordReset, ...enError, ...enActivate, ...enSettings, ...enAdmin, ...enSocialNetwork, ...enFriends, ...enFalukant, ...enBlog, ...enMinigames, ...enMessage, ...enPersonal, ...enSeo, }, ceb: mergeLocaleChunks(cebLocaleChunks), de: { 'Ok': 'Ok', ...deGeneral, ...deHeader, ...deNavigation, ...deHome, ...deChat, ...deRegister, ...dePasswordReset, ...deError, ...deActivate, ...deSettings, ...deAdmin, ...deSocialNetwork, ...deFriends, ...deFalukant, ...deBlog, ...deMinigames, ...deMessage, ...dePersonal, ...deSeo, }, es: { ...esGeneral, ...esHeader, ...esNavigation, ...esHome, ...esChat, ...esRegister, ...esPasswordReset, ...esError, ...esActivate, ...esSettings, ...esAdmin, ...esSocialNetwork, ...esFriends, ...esFalukant, ...esBlog, ...esMinigames, ...esMessage, ...esPersonal, ...esSeo, }, fr: { ...frGeneral, ...frHeader, ...frNavigation, ...frHome, ...frChat, ...frRegister, ...frPasswordReset, ...frError, ...frActivate, ...frSettings, ...frAdmin, ...frSocialNetwork, ...frFriends, ...frFalukant, ...frBlog, ...frMinigames, ...frMessage, ...frPersonal, ...frSeo, }, }; const i18n = createI18n({ locale: store.state.language, fallbackLocale: { ceb: ['en', 'de'], fr: ['de'], default: ['de'], }, messages }); function setGlobalLocale(next) { const loc = i18n.global.locale; if (loc && typeof loc === 'object' && 'value' in loc) { loc.value = next; } else { i18n.global.locale = next; } } // Überwache Änderungen der Sprache im Store und aktualisiere i18n (ohne Seiten-Reload) store.watch( (state) => state.language, (newLanguage) => { setGlobalLocale(newLanguage); } ); export default i18n;