mirror of
https://github.com/elk-zone/elk
synced 2024-12-11 13:18:04 +09:00
27 lines
1.0 KiB
TypeScript
27 lines
1.0 KiB
TypeScript
|
import { COOKIE_MAX_AGE, STORAGE_KEY_LANG } from '~/constants'
|
||
|
|
||
|
export default defineNuxtPlugin(async (nuxt) => {
|
||
|
const i18n = nuxt.vueApp.config.globalProperties.$i18n
|
||
|
const { setLocale, locales } = nuxt.vueApp.config.globalProperties.$i18n
|
||
|
const cookieLocale = useCookie(STORAGE_KEY_LANG, { maxAge: COOKIE_MAX_AGE })
|
||
|
const isFirstVisit = cookieLocale.value == null
|
||
|
|
||
|
if (process.client && isFirstVisit) {
|
||
|
const userLang = (navigator.language || 'en-US').toLowerCase()
|
||
|
// cause vue-i18n not explicit export LocaleObject type
|
||
|
const supportLocales = unref(locales) as { code: string }[]
|
||
|
const lang = supportLocales.find(locale => userLang.startsWith(locale.code.toLowerCase()))?.code
|
||
|
|| supportLocales.find(locale => userLang.startsWith(locale.code.split('-')[0]))?.code
|
||
|
cookieLocale.value = lang || 'en-US'
|
||
|
}
|
||
|
|
||
|
if (cookieLocale.value && cookieLocale.value !== i18n.locale)
|
||
|
await setLocale(cookieLocale.value)
|
||
|
|
||
|
if (process.client) {
|
||
|
watchEffect(() => {
|
||
|
cookieLocale.value = i18n.locale
|
||
|
})
|
||
|
}
|
||
|
})
|