mirror of
https://github.com/IT4Change/gradido.git
synced 2026-02-06 09:56:05 +00:00
188 lines
5.4 KiB
Vue
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>
|