gradido/frontend/src/components/LanguageSwitch2.vue
2024-08-02 12:42:04 +02:00

188 lines
5.4 KiB
Vue

<template>
<div class="language-switch">
<div v-b-toggle.collapse-1>
<span
v-for="lang in locales"
:key="lang.code"
class="pointer"
:class="$store.state.language === lang.code ? 'c-grey' : 'c-blau'"
>
<span v-if="lang.code === $store.state.language" class="locales mr-1">
{{ lang.name }}
</span>
</span>
<!-- <b-icon icon="caret-down-fill" aria-hidden="true"></b-icon>-->
<IBiCaretDownFill />
</div>
<BCollapse id="collapse-1" class="mt-4">
<span
v-for="(lang, index) in locales"
@click.prevent="saveLocale(lang.code)"
:key="lang.code"
class="pointer"
:class="$store.state.language === lang.code ? 'c-grey' : 'c-blau'"
>
<span v-if="lang.code !== $store.state.language" v-b-toggle.collapse-1 class="locales">
{{ lang.name }}
</span>
<span
v-if="
lang.code !== $store.state.language &&
(indexOfSelectedLocale !== indexOfLastLocale ||
(indexOfSelectedLocale === indexOfLastLocale && index !== indexOfSecondLastLocale))
"
class="ml-3 mr-3"
>
{{ locales.length - 1 > index ? $t('math.pipe') : '' }}
</span>
</span>
</BCollapse>
</div>
</template>
<!--<script>-->
<!--import locales from '@/locales/'-->
<!--import { updateUserInfos } from '@/graphql/mutations'-->
<!--export default {-->
<!-- name: 'LanguageSwitch',-->
<!-- data() {-->
<!-- return {-->
<!-- locales: locales,-->
<!-- currentLanguage: {},-->
<!-- }-->
<!-- },-->
<!-- methods: {-->
<!-- setLocale(locale) {-->
<!-- this.$store.commit('language', locale)-->
<!-- this.currentLanguage = this.getLocaleObject(locale)-->
<!-- },-->
<!-- async saveLocale(locale) {-->
<!-- if (this.$i18n.locale === locale) return-->
<!-- this.setLocale(locale)-->
<!-- if (this.$store.state.gradidoID) {-->
<!-- this.$apollo-->
<!-- .mutate({-->
<!-- mutation: updateUserInfos,-->
<!-- variables: {-->
<!-- locale: locale,-->
<!-- },-->
<!-- })-->
<!-- .then(() => {-->
<!-- this.toastSuccess(this.$t('settings.language.success'))-->
<!-- })-->
<!-- .catch(() => {-->
<!-- this.toastSuccess(this.$t('error'))-->
<!-- })-->
<!-- }-->
<!-- },-->
<!-- getLocaleObject(code) {-->
<!-- return this.locales.find((l) => l.code === code)-->
<!-- },-->
<!-- getNavigatorLanguage() {-->
<!-- const lang = navigator.language-->
<!-- if (lang) return lang.split('-')[0]-->
<!-- return lang-->
<!-- },-->
<!-- setCurrentLanguage() {-->
<!-- let locale = this.$store.state.language || this.getNavigatorLanguage() || 'en'-->
<!-- let object = this.getLocaleObject(locale)-->
<!-- if (!object) {-->
<!-- locale = 'en'-->
<!-- object = this.getLocaleObject(locale)-->
<!-- }-->
<!-- this.setLocale(locale)-->
<!-- this.currentLanguage = object-->
<!-- },-->
<!-- },-->
<!-- computed: {-->
<!-- indexOfSelectedLocale() {-->
<!-- return this.locales.findIndex((element) => element.code === this.$store.state.language)-->
<!-- },-->
<!-- indexOfSecondLastLocale() {-->
<!-- return this.locales.length - 2-->
<!-- },-->
<!-- indexOfLastLocale() {-->
<!-- return this.locales.length - 1-->
<!-- },-->
<!-- },-->
<!-- created() {-->
<!-- this.setCurrentLanguage()-->
<!-- },-->
<!--}-->
<!--</script>-->
<script setup>
import { useStore } from 'vuex'
import { useI18n } from 'vue-i18n'
import { useMutation } from '@vue/apollo-composable'
import { useAppToast } from '../composables/useToast'
import locales from '@/locales/'
import { onMounted, ref, computed } from 'vue'
import { updateUserInfos } from '../graphql/mutations'
const store = useStore()
const { t, locale } = useI18n()
const { mutate } = useMutation(updateUserInfos)
const { toastSuccess, toastError } = useAppToast()
const currentLang = ref({})
const getLocaleObject = (localeCode) => {
return locales.find((lang) => lang.code === localeCode)
}
const setLocale = (newLocale) => {
store.commit('language', newLocale)
currentLang.value = getLocaleObject(newLocale)
}
const saveLocale = async (newLocale) => {
if (locale.value === newLocale) return
setLocale(newLocale)
if (store.state.gradidoID) {
try {
await mutate({ locale: newLocale })
toastSuccess(t('settings.language.success'))
} catch (error) {
toastError(t('settings.language.error'))
}
}
}
const getNavigatorLang = () => {
const navigatorLang = navigator.language
if (navigatorLang) return navigatorLang.split('-')[0]
return navigatorLang
}
const setCurrentLanguage = () => {
let newLocale = store.state.language || getNavigatorLang() || 'en'
let langObject = getLocaleObject(newLocale)
if (!langObject) {
newLocale = 'en'
langObject = getLocaleObject(newLocale)
}
setLocale(newLocale)
currentLang.value = langObject
}
const indexOfSelectedLocale = computed(() => {
return locales.findIndex((element) => element.code === store.state.language)
})
const indexOfSecondLastLocale = computed(() => {
return locales.length - 2
})
const indexOfLastLocale = computed(() => {
return locales.length - 1
})
onMounted(() => {
setCurrentLanguage()
})
</script>