| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- import { createI18n } from 'vue-i18n';
- import en from './locales/en.json';
- import me from './locales/me.json';
- import ru from './locales/ru.json';
- import ua from './locales/ua.json';
- const savedLocale = localStorage.getItem('locale') || 'en';
- const i18n = createI18n({
- legacy: false,
- locale: savedLocale,
- fallbackLocale: 'en',
- messages: {
- en,
- me,
- ru,
- ua
- }
- });
- // Robust deep merge for locale objects
- const deepMerge = (target: any, source: any) => {
- if (!source) return target;
-
- Object.keys(source).forEach(key => {
- const sVal = source[key];
- const tVal = target[key];
-
- if (sVal !== null && typeof sVal === 'object' && !Array.isArray(sVal)) {
- if (!tVal || typeof tVal !== 'object') {
- target[key] = {};
- }
- deepMerge(target[key], sVal);
- } else {
- target[key] = sVal;
- }
- });
- return target;
- };
- export const loadAdminTranslations = async (lang?: string) => {
- const targetLang = lang || (i18n.global as any).locale.value;
- console.log(`[i18n] Loading admin translations for: ${targetLang}...`);
- try {
- const module = await import(`./locales/${targetLang}.admin.json`);
- let newMessages = module.default || module;
-
- // Ensure the structure is correct: { admin: { ... } }
- if (!newMessages.admin && (newMessages.tabs || newMessages.actions || newMessages.managementCenter)) {
- newMessages = { admin: newMessages };
- }
- // getLocaleMessage returns a copy in Composer mode
- const currentMessages = i18n.global.getLocaleMessage(targetLang);
-
- // Perform deep merge
- const merged = deepMerge({ ...currentMessages }, newMessages);
-
- // Explicitly set the updated message object back to the locale
- i18n.global.setLocaleMessage(targetLang, merged);
-
- console.log(`[i18n] Admin translations successfully loaded and merged for: ${targetLang}`);
- } catch (error) {
- console.error(`[i18n] Failed to load admin translations for ${targetLang}:`, error);
- }
- };
- export const setLanguage = async (lang: string) => {
- (i18n.global as any).locale.value = lang;
- localStorage.setItem('locale', lang);
-
- // If we are in an admin-related path, we might want to load admin translations for the new language
- if (window.location.pathname.startsWith('/admin')) {
- await loadAdminTranslations(lang);
- }
- };
- export const currentLanguage = () => (i18n.global as any).locale.value as string;
- export default i18n;
|