55 lines
1.8 KiB
TypeScript
55 lines
1.8 KiB
TypeScript
// src/main.ts
|
||
import { createApp } from 'vue'
|
||
import { createPinia } from 'pinia'
|
||
import App from './App.vue'
|
||
import router from './router'
|
||
import '@/style.css'
|
||
import { useSettingsStore } from './stores/settings'
|
||
import { useUserStore } from './stores/user'
|
||
import { createI18n } from 'vue-i18n'
|
||
import en from '@/locales/en.json'
|
||
import ru from '@/locales/ru.json'
|
||
|
||
// Функция определения языка браузера
|
||
function getBrowserLocale(): string {
|
||
const browserLang = navigator.language.split('-')[0]
|
||
return browserLang === 'ru' ? 'ru' : 'en'
|
||
}
|
||
|
||
// Получаем сохраненный язык из localStorage (для неавторизованных)
|
||
const storedLocale = localStorage.getItem('locale')
|
||
const initialLocale = storedLocale || getBrowserLocale()
|
||
|
||
const i18n = createI18n({
|
||
legacy: false,
|
||
locale: initialLocale,
|
||
fallbackLocale: 'en',
|
||
messages: { en, ru }
|
||
})
|
||
|
||
const app = createApp(App)
|
||
const pinia = createPinia()
|
||
app.use(pinia)
|
||
app.use(router)
|
||
app.use(i18n)
|
||
|
||
const settingsStore = useSettingsStore()
|
||
const userStore = useUserStore()
|
||
|
||
// Загружаем настройки и профиль
|
||
Promise.all([
|
||
settingsStore.loadSettings(),
|
||
userStore.fetchProfile().catch(() => {})
|
||
]).then(() => {
|
||
// Если пользователь авторизован – используем язык из профиля
|
||
if (userStore.id && userStore.language) {
|
||
i18n.global.locale.value = userStore.language
|
||
// Сохраняем в localStorage для синхронизации (опционально)
|
||
localStorage.setItem('locale', userStore.language)
|
||
} else {
|
||
// Для неавторизованных – сохраняем текущий язык в localStorage
|
||
localStorage.setItem('locale', i18n.global.locale.value)
|
||
}
|
||
app.mount('#app')
|
||
})
|