All checks were successful
Deploy to production / deploy (push) Successful in 2m48s
- 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.
287 lines
8.3 KiB
JavaScript
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;
|