Files
yourpart3/frontend/src/i18n/index.js
Torsten Schulz (local) f7030bbabe
All checks were successful
Deploy to production / deploy (push) Successful in 2m48s
feat(i18n): add French language support and enhance localization
- Introduced French as a supported language across the application, updating locale files and adding translations for various components.
- Enhanced language handling logic to accommodate French, ensuring proper detection and fallback mechanisms.
- Updated UI elements to include French language options, improving accessibility for French-speaking users.
- Refactored SEO handling to include French in hreflang links, enhancing search engine indexing for multilingual content.
- Added new scripts for managing French translations and ensuring consistency across language files.
2026-04-07 18:04:03 +02:00

287 lines
8.3 KiB
JavaScript

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;