71 lines
2.1 KiB
TypeScript
71 lines
2.1 KiB
TypeScript
import i18n from 'i18next';
|
|
import { initReactI18next } from 'react-i18next';
|
|
import LanguageDetector from 'i18next-browser-languagedetector';
|
|
|
|
import enTranslation from './locales/en/translation.json';
|
|
import arTranslation from './locales/ar/translation.json';
|
|
import { getFrappeTranslations } from './services/translationService';
|
|
|
|
// Initialize i18n with static translations first (fallback)
|
|
i18n
|
|
.use(LanguageDetector)
|
|
.use(initReactI18next)
|
|
.init({
|
|
resources: {
|
|
en: {
|
|
translation: enTranslation
|
|
},
|
|
ar: {
|
|
translation: arTranslation
|
|
}
|
|
},
|
|
fallbackLng: 'en',
|
|
defaultNS: 'translation',
|
|
interpolation: {
|
|
escapeValue: false
|
|
},
|
|
detection: {
|
|
order: ['localStorage', 'navigator'],
|
|
caches: ['localStorage']
|
|
}
|
|
});
|
|
|
|
// Load translations from Frappe and merge with static translations
|
|
export async function loadFrappeTranslations() {
|
|
try {
|
|
// Only load translations if user is logged in (to avoid 403 errors)
|
|
const user = localStorage.getItem('user');
|
|
if (!user) {
|
|
// User not logged in yet, skip loading translations from Frappe
|
|
// They will be loaded after login
|
|
return;
|
|
}
|
|
|
|
// Load English translations from Frappe
|
|
const enFrappeTranslations = await getFrappeTranslations('en');
|
|
if (Object.keys(enFrappeTranslations).length > 0) {
|
|
i18n.addResourceBundle('en', 'translation', enFrappeTranslations, true, true);
|
|
}
|
|
|
|
// Load Arabic translations from Frappe
|
|
const arFrappeTranslations = await getFrappeTranslations('ar');
|
|
if (Object.keys(arFrappeTranslations).length > 0) {
|
|
i18n.addResourceBundle('ar', 'translation', arFrappeTranslations, true, true);
|
|
}
|
|
|
|
console.log('✓ Translations loaded from Frappe');
|
|
} catch (error) {
|
|
// Silently fail - will use static translations
|
|
console.warn('⚠ Could not load translations from Frappe, using static translations:', error);
|
|
}
|
|
}
|
|
|
|
// Auto-load translations when i18n is ready (only if user is logged in)
|
|
i18n.on('initialized', () => {
|
|
loadFrappeTranslations();
|
|
});
|
|
|
|
export default i18n;
|
|
|
|
|