diff --git a/dashboard/src/Index.vue b/dashboard/src/Index.vue index 1c9f7fb50..d938d8d9f 100644 --- a/dashboard/src/Index.vue +++ b/dashboard/src/Index.vue @@ -2,6 +2,7 @@ import { onMounted, ref, useTemplateRef, provide } from 'vue'; import { Notification, fetcher, SideBar } from '@cloudron/pankow'; +import { setLanguage } from './i18n.js'; import { API_ORIGIN, TOKEN_TYPES } from './constants.js'; import { redirectIfNeeded } from './utils.js'; import ProfileModel from './models/ProfileModel.js'; @@ -225,6 +226,9 @@ onMounted(async () => { if (error) return console.error(error); profile.value = result; + // ensure language from profile if set + if (profile.value.language) await setLanguage(profile.value.language); + [error, result] = await dashboardModel.config(); if (error) return console.error(error); config.value = result; diff --git a/dashboard/src/i18n.js b/dashboard/src/i18n.js index 09b589900..b873af4c7 100644 --- a/dashboard/src/i18n.js +++ b/dashboard/src/i18n.js @@ -1,4 +1,4 @@ -import { createI18n } from 'vue-i18n'; +import { createI18n, } from 'vue-i18n'; import { fetcher } from '@cloudron/pankow'; import { API_ORIGIN } from './constants.js'; @@ -58,4 +58,21 @@ async function main() { return i18n; } +async function setLanguage(lang) { + window.localStorage.NG_TRANSLATE_LANG_KEY = lang; + + try { + const result = await fetcher.get(`${API_ORIGIN}/translation/${lang}.json`); + i18n.global.setLocaleMessage(lang, result.body); + } catch (e) { + console.error(`Failed to load language file for ${lang}`, e); + } + + i18n.global.locale = lang; +} + export default main; + +export { + setLanguage +}; diff --git a/dashboard/src/views/ProfileView.vue b/dashboard/src/views/ProfileView.vue index 265a521d4..02c780ed3 100644 --- a/dashboard/src/views/ProfileView.vue +++ b/dashboard/src/views/ProfileView.vue @@ -1,11 +1,11 @@