2222 <ArrowTopRightOnSquareIcon class =" -ml-1 mr-2 h-5 w-5" aria-hidden =" true" />
2323 {{ t('userProfile.actions.manageAccount') }}
2424 </button >
25- <Listbox v-model =" locale " as =" div" >
25+ <Listbox v-model =" languagePreference " as =" div" >
2626 <div class =" relative" >
2727 <ListboxButton class =" relative w-full inline-flex items-center justify-center px-4 py-2 border border-gray-300 shadow-xs text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-primary" >
2828 <LanguageIcon class =" -ml-1 mr-2 h-5 w-5" aria-hidden =" true" />
3333 </ListboxButton >
3434 <transition leave-active-class =" transition ease-in duration-100" leave-from-class =" opacity-100" leave-to-class =" opacity-0" >
3535 <ListboxOptions class =" absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 shadow-lg ring-1 ring-black/5 focus:outline-hidden text-sm" >
36- <ListboxOption v-slot =" { active, selected }" : value =" browserLocale " class =" relative cursor-default select-none py-2 pl-3 pr-9 ui-not-active:text-gray-900 ui-active:text-white ui-active:bg-primary" @click =" saveLanguage(undefined)" >
36+ <ListboxOption v-slot =" { active, selected }" value =" browser " class =" relative cursor-default select-none py-2 pl-3 pr-9 ui-not-active:text-gray-900 ui-active:text-white ui-active:bg-primary" @click =" saveLanguage(undefined)" >
3737 <span :class =" [selected || active ? 'font-semibold' : 'font-normal', 'block truncate']" >{{ t('userProfile.actions.changeLanguage.entry.browser') }}</span >
3838 <span v-if =" selected" :class =" [active ? 'text-white' : 'text-primary', 'absolute inset-y-0 right-0 flex items-center pr-4']" >
3939 <CheckIcon class =" h-5 w-5" aria-hidden =" true" />
@@ -76,7 +76,7 @@ import backend, { UserDto, VersionDto } from '../common/backend';
7676
7777import config from ' ../common/config' ;
7878import userdata from ' ../common/userdata' ;
79- import { Locale } from ' ../i18n' ;
79+ import { Locale , detectBrowserLocale } from ' ../i18n' ;
8080import DeviceList from ' ./DeviceList.vue' ;
8181import FetchError from ' ./FetchError.vue' ;
8282import LegacyDeviceList from ' ./LegacyDeviceList.vue' ;
@@ -85,16 +85,25 @@ import UserkeyFingerprint from './UserkeyFingerprint.vue';
8585
8686const { locale, t } = useI18n ({ useScope: ' global' });
8787
88+ type LanguagePreference = Locale | ' browser' ;
89+
90+ const languagePreference = ref <LanguagePreference >(' browser' );
91+
8892const me = ref <UserDto >();
8993const keycloakUserAccountURL = ref <string >();
9094const version = ref <VersionDto >();
9195const onFetchError = ref <Error >();
92- const browserLocale = ref <string >(navigator . language );
96+ const browserLocale = ref <string >(detectBrowserLocale () );
9397
9498onMounted (async () => {
9599 const cfg = config .get ();
96100 keycloakUserAccountURL .value = ` ${cfg .keycloakUrl }/realms/${cfg .keycloakRealm }/account ` ;
97101 await fetchData ();
102+ if (me .value ?.language ) {
103+ languagePreference .value = me .value .language as Locale ;
104+ } else {
105+ languagePreference .value = ' browser' ;
106+ }
98107});
99108
100109async function fetchData() {
0 commit comments