funkwhale/front/src/init/locale.ts

54 wiersze
1.6 KiB
TypeScript
Czysty Zwykły widok Historia

2022-04-18 08:24:47 +00:00
import { watch } from 'vue'
2022-04-30 18:04:01 +00:00
import locales from '~/locales.json'
import { usePreferredLanguages } from '@vueuse/core'
2022-04-18 08:24:47 +00:00
import { createGettext } from 'vue3-gettext'
2022-04-23 12:48:29 +00:00
import { InitModule } from '~/types'
2022-04-18 08:24:47 +00:00
import store from '~/store'
2022-04-18 08:24:47 +00:00
const defaultLanguage = store.state.ui.currentLanguage ?? 'en_US'
export const availableLanguages = locales.reduce((map: Record<string, string>, locale) => {
2022-04-18 08:24:47 +00:00
map[locale.code] = locale.label
return map
}, {})
2022-04-18 08:24:47 +00:00
export const gettext = createGettext({
availableLanguages,
defaultLanguage,
silent: true
})
2022-04-18 08:24:47 +00:00
export const install: InitModule = ({ store, app }) => {
app.use(gettext)
// Set default language
if (!store.state.ui.selectedLanguage) {
// NOTE: We're selecting the language only once, hence we don't need to make it reactive
const languages = usePreferredLanguages().value.map((code) => {
return code.replace(/-/g, '_')
})
let language = Object.keys(availableLanguages).find(code => {
return languages.includes(code)
})
if (!language) {
language = Object.keys(availableLanguages).find(code => {
return languages.map(lang => lang.split('_')[0]).includes(code.split('_')[0])
})
}
store.commit('ui/currentLanguage', language ?? defaultLanguage)
}
// Handle language change
watch(() => store.state.ui.currentLanguage, (locale) => {
const htmlLocale = locale.toLowerCase().replace('_', '-')
document.documentElement.setAttribute('lang', htmlLocale)
if (locale === 'en_US') {
2022-04-18 08:24:47 +00:00
gettext.current = locale
store.commit('ui/momentLocale', 'en')
}
}, { immediate: true })
}