mirror of
https://github.com/Lissy93/dashy.git
synced 2025-07-27 07:34:43 +02:00
💄 Nicer design for language swtitcher
This commit is contained in:
parent
e176b4bf71
commit
e7fb8e2d01
@ -5,16 +5,18 @@
|
|||||||
<v-select
|
<v-select
|
||||||
v-model="language"
|
v-model="language"
|
||||||
:selectOnTab="true"
|
:selectOnTab="true"
|
||||||
:options="availibleLanguages"
|
:options="languageList"
|
||||||
class="language-dropdown"
|
class="language-dropdown"
|
||||||
label="name"
|
label="friendlyName"
|
||||||
:input="setLangLocally()"
|
:input="applyLanguageLocally()"
|
||||||
/>
|
/>
|
||||||
<Button class="save-button" :click="saveLanguage" :disallow="!language">
|
<Button class="save-button" :click="saveLanguage" :disallow="!language">
|
||||||
{{ $t('language-switcher.save-button') }}
|
{{ $t('language-switcher.save-button') }}
|
||||||
<SaveConfigIcon />
|
<SaveConfigIcon />
|
||||||
</Button>
|
</Button>
|
||||||
<p v-if="language">{{ language.flag }} {{ language.name }}</p>
|
<p v-if="language" class="current-lang">
|
||||||
|
🌐 {{ language.flag }} {{ language.name }}
|
||||||
|
</p>
|
||||||
<p v-if="$i18n.availableLocales.length <= 1" class="sad-times">
|
<p v-if="$i18n.availableLocales.length <= 1" class="sad-times">
|
||||||
There are not currently any additional languages supported,
|
There are not currently any additional languages supported,
|
||||||
but stay tuned as more are on their way!
|
but stay tuned as more are on their way!
|
||||||
@ -37,18 +39,37 @@ export default {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
availibleLanguages: languages,
|
language: this.getCurrentLanguage(), // The currently selected language
|
||||||
language: '',
|
modalName: modalNames.LANG_SWITCHER, // Key for modal
|
||||||
modalName: modalNames.LANG_SWITCHER,
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
/* Return the array of language objects, plus a friends name */
|
||||||
|
languageList: () => languages.map((lang) => {
|
||||||
|
const newLang = lang;
|
||||||
|
newLang.friendlyName = `${lang.flag} ${lang.name}`;
|
||||||
|
return newLang;
|
||||||
|
}),
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
/* Check if language is supported */
|
||||||
|
checkLocale(selectedLanguage) {
|
||||||
|
if (!selectedLanguage || !selectedLanguage.code) return false;
|
||||||
|
const i18nLocales = this.$i18n.availableLocales;
|
||||||
|
return i18nLocales.includes(selectedLanguage.code);
|
||||||
|
},
|
||||||
|
/* Apply language locally */
|
||||||
|
applyLanguageLocally() {
|
||||||
|
if (this.language && this.language.code) {
|
||||||
|
this.$i18n.locale = this.language.code;
|
||||||
|
}
|
||||||
|
},
|
||||||
/* Save language to local storage, show success msg and close modal */
|
/* Save language to local storage, show success msg and close modal */
|
||||||
saveLanguage() {
|
saveLanguage() {
|
||||||
const selectedLanguage = this.language;
|
const selectedLanguage = this.language;
|
||||||
if (this.checkLocale(selectedLanguage)) {
|
if (this.checkLocale(selectedLanguage)) {
|
||||||
localStorage.setItem(localStorageKeys.LANGUAGE, selectedLanguage.code);
|
localStorage.setItem(localStorageKeys.LANGUAGE, selectedLanguage.code);
|
||||||
this.setLangLocally();
|
this.applyLanguageLocally();
|
||||||
const successMsg = `${selectedLanguage.flag} `
|
const successMsg = `${selectedLanguage.flag} `
|
||||||
+ `${this.$t('language-switcher.success-msg')} ${selectedLanguage.name}`;
|
+ `${this.$t('language-switcher.success-msg')} ${selectedLanguage.name}`;
|
||||||
this.$toasted.show(successMsg, { className: 'toast-success' });
|
this.$toasted.show(successMsg, { className: 'toast-success' });
|
||||||
@ -57,17 +78,11 @@ export default {
|
|||||||
this.$toasted.show('Unable to update language', { className: 'toast-error' });
|
this.$toasted.show('Unable to update language', { className: 'toast-error' });
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
/* Check language is supported, before saving */
|
/* Gets the users current language from local storage */
|
||||||
checkLocale(selectedLanguage) {
|
getCurrentLanguage() {
|
||||||
if (!selectedLanguage || !selectedLanguage.code) return false;
|
const getLanguageFromIso = (iso) => languages.find((lang) => lang.code === iso);
|
||||||
const i18nLocales = this.$i18n.availableLocales;
|
const current = localStorage[localStorageKeys.LANGUAGE] || this.config.appConfig.language;
|
||||||
return i18nLocales.includes(selectedLanguage.code);
|
return getLanguageFromIso(current);
|
||||||
},
|
|
||||||
/* Apply language locally */
|
|
||||||
setLangLocally() {
|
|
||||||
if (this.language && this.language.code) {
|
|
||||||
this.$i18n.locale = this.language.code;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -81,29 +96,43 @@ export default {
|
|||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
background: var(--config-settings-background);
|
background: var(--config-settings-background);
|
||||||
color: var(--config-settings-color);
|
color: var(--config-settings-color);
|
||||||
|
|
||||||
h3.title {
|
h3.title {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
p.intro {
|
p.intro {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
button.save-button {
|
button.save-button {
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
p.sad-times {
|
p.sad-times {
|
||||||
color: var(--warning);
|
color: var(--warning);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
p.current-lang {
|
||||||
.language-dropdown {
|
color: var(--success);
|
||||||
|
opacity: var(--dimming-factor);
|
||||||
|
text-align: center;
|
||||||
|
position: absolute;
|
||||||
margin: 1rem auto;
|
margin: 1rem auto;
|
||||||
div.vs__dropdown-toggle {
|
cursor: default;
|
||||||
padding: 0.2rem 0;
|
width: 100%;
|
||||||
}
|
bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
|
||||||
|
.language-dropdown {
|
||||||
|
margin: 1rem auto;
|
||||||
|
div.vs__dropdown-toggle {
|
||||||
|
padding: 0.2rem 0;
|
||||||
|
}
|
||||||
|
div, input {
|
||||||
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user