From 68597c97091f92bbbad3a624e01971a80271005a Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 12 Jun 2023 16:08:31 +0200 Subject: [PATCH] feat(user): use user language from store after logging in --- src/i18n/index.ts | 17 +++++++++-------- src/modelTypes/IUserSettings.ts | 3 ++- src/stores/auth.ts | 5 ++--- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/i18n/index.ts b/src/i18n/index.ts index 77ebf216a..8feef3970 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -1,5 +1,6 @@ import {createI18n} from 'vue-i18n' import langEN from './lang/en.json' +import {useAuthStore} from '@/stores/auth' export const SUPPORTED_LOCALES = { 'en': 'English', @@ -54,9 +55,14 @@ export async function setLanguage(lang: SupportedLocale = getCurrentLanguage()): } export function getCurrentLanguage(): SupportedLocale { - const savedLanguage = localStorage.getItem('language') as SupportedLocale | null - if (savedLanguage !== null) { - return savedLanguage + try { + const authStore = useAuthStore() + if (authStore.settings.language !== null) { + return authStore.settings.language + } + } catch (e) { + // This may happen on the very first load of Vikunja because setting the language is attempted very early in the lifecycle + console.debug('could not load language from store:', e) } const browserLanguage = navigator.language @@ -67,8 +73,3 @@ export function getCurrentLanguage(): SupportedLocale { return language || DEFAULT_LANGUAGE } - -export async function saveLanguage(lang: SupportedLocale) { - localStorage.setItem('language', lang) - await setLanguage() -} \ No newline at end of file diff --git a/src/modelTypes/IUserSettings.ts b/src/modelTypes/IUserSettings.ts index b1c120799..9e3b3fb4b 100644 --- a/src/modelTypes/IUserSettings.ts +++ b/src/modelTypes/IUserSettings.ts @@ -3,6 +3,7 @@ import type {IAbstract} from './IAbstract' import type {IProject} from './IProject' import type {PrefixMode} from '@/modules/parseTaskText' import type {BasicColorSchema} from '@vueuse/core' +import type {SupportedLocale} from '@/i18n' export interface IFrontendSettings { playSoundWhenDone: boolean @@ -20,6 +21,6 @@ export interface IUserSettings extends IAbstract { defaultProjectId: undefined | IProject['id'] weekStart: 0 | 1 | 2 | 3 | 4 | 5 | 6 timezone: string - language: string + language: SupportedLocale frontendSettings: IFrontendSettings } \ No newline at end of file diff --git a/src/stores/auth.ts b/src/stores/auth.ts index e8a7d371e..f6de60557 100644 --- a/src/stores/auth.ts +++ b/src/stores/auth.ts @@ -2,7 +2,7 @@ import {computed, readonly, ref} from 'vue' import {acceptHMRUpdate, defineStore} from 'pinia' import {AuthenticatedHTTPFactory, HTTPFactory} from '@/helpers/fetcher' -import {getCurrentLanguage, i18n, saveLanguage, setLanguage} from '@/i18n' +import {getCurrentLanguage, i18n, setLanguage} from '@/i18n' import {objectToSnakeCase} from '@/helpers/case' import UserModel, {getAvatarUrl, getDisplayName} from '@/models/user' import UserSettingsService from '@/services/userSettings' @@ -331,10 +331,9 @@ export const useAuthStore = defineStore('auth', () => { const cancel = setModuleLoading(setIsLoadingGeneralSettings) try { const updateSettingsPromise = userSettingsService.update(settings) - const saveLanguagePromise = saveLanguage(settings.language) + await setLanguage() await updateSettingsPromise setUserSettings({...settings}) - await saveLanguagePromise if (showMessage) { success({message: i18n.global.t('user.settings.general.savedSuccess')}) }