From b8c108504443ce66082792a4567755f1c27af3d1 Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Thu, 22 Jul 2021 22:19:07 +0100 Subject: [PATCH 01/28] =?UTF-8?q?=E2=9E=95=20Adds=20i18n=20dependency,=20f?= =?UTF-8?q?or=20multi-language=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 ++- yarn.lock | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 95db1abe..1a2fbf4f 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "v-tooltip": "^2.1.3", "vue": "^2.6.10", "vue-cli-plugin-yaml": "^1.0.2", + "vue-i18n": "^8.25.0", "vue-js-modal": "^2.0.0-rc.6", "vue-material-tabs": "^0.1.2", "vue-prism-editor": "^1.2.2", @@ -87,4 +88,4 @@ "> 1%", "last 2 versions" ] -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 440b69bd..d534c905 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8866,6 +8866,11 @@ vue-hot-reload-api@^2.3.0: resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== +vue-i18n@^8.25.0: + version "8.25.0" + resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.25.0.tgz#1037d9295fa2845a230b771de473481edb2cfc4c" + integrity sha512-ynhcL+PmTxuuSE1T10htiSXzjBozxYIE3ffbM1RfgAkVbr/v1SP+9Mi/7/uv8ZVV1yGuKjFAYp9BXq+X7op6MQ== + vue-js-modal@^2.0.0-rc.6: version "2.0.0-rc.6" resolved "https://registry.yarnpkg.com/vue-js-modal/-/vue-js-modal-2.0.0-rc.6.tgz#2fd596c79a713d2cbf447150abb5fefce65efd2d" From 0606cb07aec1219cb450066877482f90e71e7217 Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Thu, 22 Jul 2021 22:20:03 +0100 Subject: [PATCH 02/28] :sparkles: Implements localisation --- src/assets/locales/en-GB.json | 4 ++++ src/main.js | 29 +++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 src/assets/locales/en-GB.json diff --git a/src/assets/locales/en-GB.json b/src/assets/locales/en-GB.json new file mode 100644 index 00000000..0288acea --- /dev/null +++ b/src/assets/locales/en-GB.json @@ -0,0 +1,4 @@ +{ + "test": "Hello World!", + "test2": "Im a fallback" +} \ No newline at end of file diff --git a/src/main.js b/src/main.js index ca08f56d..1004cfc1 100644 --- a/src/main.js +++ b/src/main.js @@ -1,18 +1,25 @@ +// Import core framework and essential utils import Vue from 'vue'; +import VueI18n from 'vue-i18n'; // i18n for localization -/* Import component Vue plugins, used throughout the app */ +// Import component Vue plugins, used throughout the app import VTooltip from 'v-tooltip'; // A Vue directive for Popper.js, tooltip component import VModal from 'vue-js-modal'; // Modal component import VSelect from 'vue-select'; // Select dropdown component import VTabs from 'vue-material-tabs'; // Tab view component, used on the config page import Toasted from 'vue-toasted'; // Toast component, used to show confirmation notifications -import { toastedOptions } from '@/utils/defaults'; +// Import base Dashy components and utils import Dashy from '@/App.vue'; import router from '@/router'; import registerServiceWorker from '@/registerServiceWorker'; import clickOutside from '@/utils/ClickOutside'; +import { toastedOptions } from '@/utils/defaults'; +// Locales - Import translation files here! +import en from '@/assets/locales/en-GB.json'; + +Vue.use(VueI18n); Vue.use(VTooltip); Vue.use(VModal); Vue.use(VTabs); @@ -22,10 +29,20 @@ Vue.directive('clickOutside', clickOutside); Vue.config.productionTip = false; +// Setup translations +const messages = { en }; // <-- Add new language files here! + +const i18n = new VueI18n({ + locale: 'en', + fallbackLocale: 'en', + messages, +}); + // Register Service Worker registerServiceWorker(); -new Vue({ - router, - render: (awesome) => awesome(Dashy), -}).$mount('#app'); +// Render function +const render = (awesome) => awesome(Dashy); + +// All done, now just initialize main Vue app! +new Vue({ router, render, i18n }).$mount('#app'); From e02d33b0dfdd78e377beed2f3c36d4871e06fc8b Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Thu, 22 Jul 2021 22:33:47 +0100 Subject: [PATCH 03/28] :globe_with_meridians: Adds en translations for Home and Search components --- src/assets/locales/en-GB.json | 11 +++++++++-- src/components/Settings/SearchBar.vue | 6 +++--- src/views/Home.vue | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/assets/locales/en-GB.json b/src/assets/locales/en-GB.json index 0288acea..35e86637 100644 --- a/src/assets/locales/en-GB.json +++ b/src/assets/locales/en-GB.json @@ -1,4 +1,11 @@ { - "test": "Hello World!", - "test2": "Im a fallback" + "home": { + "no-results": "No Search Results", + "no-data": "No Data Configured" + }, + "search": { + "search-label": "Search", + "search-placeholder": "Start typing to filter", + "clear-search-tooltip": "Clear Search" + } } \ No newline at end of file diff --git a/src/components/Settings/SearchBar.vue b/src/components/Settings/SearchBar.vue index 160edbc3..a78976c6 100644 --- a/src/components/Settings/SearchBar.vue +++ b/src/components/Settings/SearchBar.vue @@ -1,16 +1,16 @@ diff --git a/src/views/Home.vue b/src/views/Home.vue index 4bd0494b..53425eed 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -34,7 +34,7 @@
- {{searchValue ? 'No Search Results' : 'No Data Configured'}} + {{searchValue ? $t('home.no-results') : $t('home.no-data')}}
From b90b612f916b6f785db5851563c27d4a5c189c5c Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Sat, 24 Jul 2021 11:36:37 +0100 Subject: [PATCH 04/28] :rotating_light: Updates indentation, fixes linter warning --- src/views/Home.vue | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/views/Home.vue b/src/views/Home.vue index 53425eed..4ce017dc 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -13,7 +13,7 @@ :appConfig="appConfig" :pageInfo="pageInfo" :modalOpen="modalOpen" - class="filter-container" + class="settings-outer" />
@@ -63,6 +63,7 @@ export default { modalOpen: false, // When true, keybindings are disabled }), computed: { + /* Updates layout (when button clicked), and saves in local storage */ layoutOrientation: { get() { return this.appConfig.layout || Defaults.layout; }, set: function setLayout(layout) { @@ -70,6 +71,7 @@ export default { this.layout = layout; }, }, + /* Updates icon size (when button clicked), and saves in local storage */ iconSize: { get() { return this.appConfig.iconSize || Defaults.iconSize; }, set: function setIconSize(iconSize) { @@ -192,6 +194,7 @@ export default { return itemsFound; } }, + /* If user has a background image, then generate CSS attributes */ getBackgroundImage() { if (this.appConfig && this.appConfig.backgroundImg) { return `background: url('${this.appConfig.backgroundImg}');background-size:cover;`; @@ -267,6 +270,7 @@ export default { .no-results { display: none; } } +/* Custom styles only applied when there is no sections in config */ .no-data { font-size: 2rem; color: var(--background); @@ -277,7 +281,8 @@ export default { border-radius: var(--curve-factor); } -section.filter-container { +/* Settings section, includes search, config and user settings */ +section.settings-outer { border-bottom: 1px solid var(--outline-color); @include phone { flex-direction: column; From 1a2731220a92415f3c4f979c40f74efa32d5c03a Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Sat, 24 Jul 2021 12:01:12 +0100 Subject: [PATCH 05/28] :globe_with_meridians: Adds translations for Login page --- src/assets/locales/en-GB.json | 11 ++++++ src/views/Login.vue | 63 +++++++++++++++++++++++------------ 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/src/assets/locales/en-GB.json b/src/assets/locales/en-GB.json index 35e86637..51daec2d 100644 --- a/src/assets/locales/en-GB.json +++ b/src/assets/locales/en-GB.json @@ -7,5 +7,16 @@ "search-label": "Search", "search-placeholder": "Start typing to filter", "clear-search-tooltip": "Clear Search" + }, + "login": { + "title": "Dashy", + "username-label": "Username", + "password-label": "Password", + "login-button": "Login", + "remember-me-label": "Remember me for", + "remember-me-never": "Never", + "remember-me-hour": "4 Hours", + "remember-me-day": "1 Day", + "remember-me-week": "1 Week" } } \ No newline at end of file diff --git a/src/views/Login.vue b/src/views/Login.vue index f3d75dc6..1dd35b15 100644 --- a/src/views/Login.vue +++ b/src/views/Login.vue @@ -1,20 +1,31 @@ @@ -29,6 +36,7 @@ import IconSpanner from '@/assets/interface-icons/config-editor.svg'; import IconCloud from '@/assets/interface-icons/cloud-backup-restore.svg'; import ConfigContainer from '@/components/Configuration/ConfigContainer'; import CloudBackupRestore from '@/components/Configuration/CloudBackupRestore'; +import LanguageSwitcher from '@/components/Settings/LanguageSwitcher'; import { topLevelConfKeys, localStorageKeys, modalNames } from '@/utils/defaults'; export default { @@ -43,6 +51,7 @@ export default { IconCloud, ConfigContainer, CloudBackupRestore, + LanguageSwitcher, }, props: { sections: Array, From 1faa36f7df0583cdd45fc0c85052f9faf3f8e6d7 Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Sat, 24 Jul 2021 21:38:38 +0100 Subject: [PATCH 13/28] :zap: Writes handler util for managing languages --- src/utils/languages.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/utils/languages.js b/src/utils/languages.js index 1819c83c..5f43353a 100644 --- a/src/utils/languages.js +++ b/src/utils/languages.js @@ -1,14 +1,21 @@ // Locales - Import translation files here! -import enGB from '@/assets/locales/en-GB.json'; +import en from '@/assets/locales/en.json'; +import de from '@/assets/locales/de.json'; // Language data - Add your country name, locale code and imported file here export const languages = [ { name: 'English', - code: 'en-GB', - locale: enGB, + code: 'en', + locale: en, flag: '🇬🇧', }, + { + name: 'German', + code: 'de', + locale: de, + flag: '🇩🇪', + }, // Including: // name - Human readable name for your language // code - ISO language code From 075e63f9b5130aa71e0cf44dff3b700bb7324956 Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Sat, 24 Jul 2021 21:39:14 +0100 Subject: [PATCH 14/28] :fire: Adds language into Config handlers --- src/utils/ConfigAccumalator.js | 3 +++ src/utils/ConfigHelpers.js | 20 +++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/utils/ConfigAccumalator.js b/src/utils/ConfigAccumalator.js index a93efb51..1237897c 100644 --- a/src/utils/ConfigAccumalator.js +++ b/src/utils/ConfigAccumalator.js @@ -11,6 +11,7 @@ import { pageInfo as defaultPageInfo, iconSize as defaultIconSize, layout as defaultLayout, + language as defaultLanguage, } from '@/utils/defaults'; import conf from '../../public/conf.yml'; @@ -33,6 +34,8 @@ export default class ConfigAccumulator { || appConfigFile.layout || defaultLayout; usersAppConfig.iconSize = localStorage[localStorageKeys.ICON_SIZE] || appConfigFile.iconSize || defaultIconSize; + usersAppConfig.language = localStorage[localStorageKeys.LANGUAGE] + || appConfigFile.language || defaultLanguage; return usersAppConfig; } diff --git a/src/utils/ConfigHelpers.js b/src/utils/ConfigHelpers.js index a1848b66..d282c297 100644 --- a/src/utils/ConfigHelpers.js +++ b/src/utils/ConfigHelpers.js @@ -1,5 +1,11 @@ import ConfigAccumulator from '@/utils/ConfigAccumalator'; -import { visibleComponents, localStorageKeys, theme as defaultTheme } from '@/utils/defaults'; +import { languages } from '@/utils/languages'; +import { + visibleComponents, + localStorageKeys, + theme as defaultTheme, + language as defaultLanguage, +} from '@/utils/defaults'; /** * Initiates the Accumulator class and generates a complete config object @@ -74,3 +80,15 @@ export const getCustomKeyShortcuts = () => { }); return results.flat(); }; + +/** + * Gets the users chosen language. Defaults to English. + * @returns {object} Language, including code, name and flag + */ +export const getUsersLanguage = () => { + const langCode = localStorage[localStorageKeys.LANGUAGE] + || config.appConfig.language + || defaultLanguage; + const langObj = languages.find(lang => lang.code === langCode); + return langObj; +}; From b1f176260b8615da91bbcf7930e7a2a2e3e7f961 Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Sat, 24 Jul 2021 21:40:21 +0100 Subject: [PATCH 15/28] :world_map: Adds default value for language, English --- src/utils/defaults.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/utils/defaults.js b/src/utils/defaults.js index bde25c4c..d146508c 100644 --- a/src/utils/defaults.js +++ b/src/utils/defaults.js @@ -11,6 +11,8 @@ module.exports = { }, /* Default appConfig to be used, if user does not specify their own */ appConfig: {}, + /* Default language code */ + language: 'en', /* Default icon size to be applied on initial load */ iconSize: 'medium', /* Default layout to be applied on initial load */ @@ -58,6 +60,7 @@ module.exports = { }, /* Key names for local storage identifiers */ localStorageKeys: { + LANGUAGE: 'language', HIDE_WELCOME_BANNER: 'hideWelcomeHelpers', LAYOUT_ORIENTATION: 'layoutOrientation', COLLAPSE_STATE: 'collapseState', @@ -87,6 +90,7 @@ module.exports = { REBUILD_APP: 'REBUILD_APP', THEME_MAKER: 'THEME_MAKER', ABOUT_APP: 'ABOUT_APP', + LANG_SWITCHER: 'LANG_SWITCHER', }, /* Key names for the top-level objects in conf.yml */ topLevelConfKeys: { From a18574dcd670ea0a990c36465c036e20caa198d9 Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Sat, 24 Jul 2021 21:41:16 +0100 Subject: [PATCH 16/28] :sparkles: Auto loads users prefered language --- src/App.vue | 21 +++++++++++++++++++++ src/main.js | 6 +++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/App.vue b/src/App.vue index 806c33e4..775769d9 100644 --- a/src/App.vue +++ b/src/App.vue @@ -70,9 +70,30 @@ export default { this.isLoading = false; } }, + /* Checks local storage, then appConfig, and if a custom language is specified, its applied */ + applyLanguage() { + // If user has specified a language, then check and apply it + const lang = localStorage[localStorageKeys.LANGUAGE] || this.appConfig.language; + if (lang && this.$i18n.availableLocales.includes(lang)) { + this.$i18n.locale = lang; + } else { + // Attempt to apply language automatically, based on their system language + let locale; + const usersBorwserLang1 = window.navigator.language || ''; // e.g. en-GB or or '' + const usersBorwserLang2 = usersBorwserLang1.split('-')[0]; // e.g. en or undefined + const availibleLocales = this.$i18n.availableLocales; + if (availibleLocales.includes(usersBorwserLang1)) { + locale = usersBorwserLang1; + } else if (availibleLocales.includes(usersBorwserLang2)) { + locale = usersBorwserLang2; + } + if (locale) this.$i18n.locale = locale; // If lanuage was found, apply it + } + }, }, /* When component mounted, hide splash and initiate the injection of custom styles */ mounted() { + this.applyLanguage(); this.hideSplash(); if (this.appConfig.customCss) { const cleanedCss = this.appConfig.customCss.replace(/<\/?[^>]+(>|$)/g, ''); diff --git a/src/main.js b/src/main.js index 6de769f3..7af5b0aa 100644 --- a/src/main.js +++ b/src/main.js @@ -14,7 +14,7 @@ import Dashy from '@/App.vue'; import router from '@/router'; import registerServiceWorker from '@/registerServiceWorker'; import clickOutside from '@/utils/ClickOutside'; -import { toastedOptions } from '@/utils/defaults'; +import { toastedOptions, language as defaultLanguage } from '@/utils/defaults'; import { messages } from '@/utils/languages'; Vue.use(VueI18n); @@ -29,8 +29,8 @@ Vue.config.productionTip = false; // Setup i18n translations const i18n = new VueI18n({ - locale: 'en-GB', - fallbackLocale: 'en-GB', + locale: defaultLanguage, + fallbackLocale: defaultLanguage, messages, }); From 107ead5046654072b7d254fde381c8eeb565f46c Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Sat, 24 Jul 2021 21:41:50 +0100 Subject: [PATCH 17/28] :lipstick: Updates styling for dropdown component --- src/styles/global-styles.scss | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/styles/global-styles.scss b/src/styles/global-styles.scss index 1855ad2b..a5b7c25e 100644 --- a/src/styles/global-styles.scss +++ b/src/styles/global-styles.scss @@ -24,8 +24,8 @@ html { /* Overriding styles for the modal component */ .vm--modal, .dashy-modal { box-shadow: 0 40px 70px -2px hsl(0deg 0% 0% / 60%), 1px 1px 6px var(--primary) !important; - min-width: 300px; - min-height: 500px; + min-width: 350px; + min-height: 200px; } .vm--overlay { background: #00000080; @@ -48,4 +48,32 @@ html { background: var(--success) !important; color: var(--white) !important; font-size: 1.25rem !important; +} + +/* v-select, dropdown styles */ +.v-select { + .vs__dropdown-toggle { + border-color: var(--primary); + background: var(--background); + cursor: pointer; + span.vs__selected { + color: var(--primary); + } + .vs__actions svg path { fill: var(--primary); } + } + ul.vs__dropdown-menu { + background: var(--background); + border-color: var(--primary); + li { + color: var(--primary); + &:hover { + color: var(--background); + background: var(--primary); + } + &.vs__dropdown-option--highlight { + color: var(--background); + background: var(--primary); + } + } + } } \ No newline at end of file From bb82e312b01aa921fdd81671b502add7b401dfc9 Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Sat, 24 Jul 2021 21:42:37 +0100 Subject: [PATCH 18/28] :globe_with_meridians: Updates translations, adds test German lang --- src/assets/locales/de.json | 130 +++++++++++++++++++++ src/assets/locales/{en-GB.json => en.json} | 1 + 2 files changed, 131 insertions(+) create mode 100644 src/assets/locales/de.json rename src/assets/locales/{en-GB.json => en.json} (96%) diff --git a/src/assets/locales/de.json b/src/assets/locales/de.json new file mode 100644 index 00000000..d0303265 --- /dev/null +++ b/src/assets/locales/de.json @@ -0,0 +1,130 @@ +{ + "home": { + "no-results": "___", + "no-data": "_________" + }, + "search": { + "search-label": "______", + "search-placeholder": "_________", + "clear-search-tooltip": "______" + }, + "login": { + "title": "___", + "username-label": "______", + "password-label": "______", + "login-button": "___", + "remember-me-label": "_________", + "remember-me-never": "___", + "remember-me-hour": "____", + "remember-me-day": "___", + "remember-me-week": "___" + }, + "config": { + "main-tab": "______", + "view-config-tab": "_________", + "edit-config-tab": "_________", + "custom-css-tab": "_________", + "heading": "_________", + "download-config-button": "_________", + "edit-config-button": "_________", + "edit-css-button": "_________", + "cloud-sync-button": "_________", + "edit-cloud-sync-button": "_________", + "rebuild-app-button": "_________", + "change-language-button": "_________", + "reset-settings-button": "_________", + "app-info-button": "_________", + "app-version-note": "_________", + "backup-note": "_________________________________", + "reset-config-msg-l1": "_________________________________", + "reset-config-msg-l2": "_________________________________", + "reset-config-msg-l3": "_________________________________", + "data-cleared-msg": "_________", + "actions-label": "___", + "copy-config-label": "___", + "data-copied-msg": "_________", + "reset-config-label": "______", + "css-save-btn": "______", + "css-note-label": "___", + "css-note-l1": "____________________________________", + "css-note-l2": "____________________________________", + "css-note-l3": "____________________________________" + }, + "settings": { + "theme-label": "___", + "layout-label": "___", + "layout-auto": "___", + "layout-horizontal": "______", + "layout-vertical": "______", + "item-size-label": "______", + "item-size-small": "______", + "item-size-medium": "______", + "item-size-large": "______", + "config-launcher-label": "______" + }, + "theme-maker": { + "title": "_________", + "export-button": "_________", + "reset-button": "_________", + "show-all-button": "_________", + "save-button": "___", + "cancel-button": "___", + "saved-toast": "{theme} _________", + "copied-toast": "___ {theme} ___", + "reset-toast": "___ {theme} ___" + }, + "config-editor": { + "save-location-label": "_________", + "location-local-label": "_________", + "location-disk-label": "_________", + "save-button": "_________", + "valid-label": "_________", + "status-success-msg": "_________", + "status-fail-msg": "_________", + "success-msg-disk": "_________", + "success-msg-local": "_________", + "success-note-l1": "_________", + "success-note-l2": "_________", + "success-note-l3": "__________________", + "error-msg-save-mode": "__________________", + "error-msg-cannot-save": "__________________", + "error-msg-bad-json": "__________________", + "warning-msg-validation": "__________________" + }, + "app-rebuild": { + "title": "______", + "rebuild-note-l1": "__________________", + "rebuild-note-l2": "__________________", + "rebuild-note-l3": "__________________", + "rebuild-button": "_________", + "rebuilding-status-1": "______...", + "rebuilding-status-2": "_________", + "error-permission": "_________", + "success-msg": "_________", + "fail-msg": "_________", + "reload-note": "_________", + "reload-button": "______" + }, + "cloud-sync": { + "title": "_________", + "intro-l1": "__________________", + "intro-l2": "__________________", + "intro-l3": "__________________", + "backup-title-setup": "_________", + "backup-title-update": "_________", + "password-label-setup": "_________", + "password-label-update": "_________", + "backup-button-setup": "______", + "backup-button-update": "______", + "backup-id-label": "______", + "backup-id-note": "__________________", + "restore-title": "_________", + "restore-id-label": "_________", + "restore-password-label": "______", + "restore-button": "______", + "backup-error-unknown": "_________", + "backup-error-password": "_________", + "backup-success-msg": "_________", + "restore-success-msg": "_________" + } +} \ No newline at end of file diff --git a/src/assets/locales/en-GB.json b/src/assets/locales/en.json similarity index 96% rename from src/assets/locales/en-GB.json rename to src/assets/locales/en.json index e2cf9638..f8f74ee9 100644 --- a/src/assets/locales/en-GB.json +++ b/src/assets/locales/en.json @@ -31,6 +31,7 @@ "cloud-sync-button": "Enable Cloud Sync", "edit-cloud-sync-button": "Edit Cloud Sync", "rebuild-app-button": "Rebuild Application", + "change-language-button": "Change App Language", "reset-settings-button": "Reset Local Settings", "app-info-button": "App Info", "app-version-note": "Dashy version", From 914b381436cd199dcb1aaf7bbe65130528c8fc6e Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Sat, 24 Jul 2021 21:50:33 +0100 Subject: [PATCH 19/28] :card_file_box: Adds language attribute to appConfig, so user can set language --- docs/configuring.md | 1 + src/utils/ConfigSchema.json | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/docs/configuring.md b/docs/configuring.md index 1216c6ab..f577197d 100644 --- a/docs/configuring.md +++ b/docs/configuring.md @@ -54,6 +54,7 @@ To disallow any changes from being written to disk via the UI config editor, set **Field** | **Type** | **Required**| **Description** --- | --- | --- | --- +**`language`** | `string` | _Optional_ | The 2 (or 4-digit) [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your language, e.g. `en` or `en-GB`. This must be a language that the app has already been [translated](https://github.com/Lissy93/dashy/tree/master/src/assets/locales) into. If your language is unavailable, Dashy will fallback to English. By default Dashy will attempt to auto-detect your language, although this may not work on some privacy browsers. **`statusCheck`** | `boolean` | _Optional_ | When set to `true`, Dashy will ping each of your services and display their status as a dot next to each item. This can be overridden by setting `statusCheck` under each item. Defaults to `false` **`statusCheckInterval`** | `boolean` | _Optional_ | The number of seconds between checks. If set to `0` then service will only be checked on initial page load, which is usually the desired functionality. If value is less than `10` you may experience a hit in performance. Defaults to `0` **`backgroundImg`** | `string` | _Optional_ | Path to an optional full-screen app background image. This can be either remote (http) or local (/). Note that this will slow down initial load diff --git a/src/utils/ConfigSchema.json b/src/utils/ConfigSchema.json index 86615453..bb7a04d1 100644 --- a/src/utils/ConfigSchema.json +++ b/src/utils/ConfigSchema.json @@ -54,6 +54,10 @@ "type": "string", "description": "A URL to an image asset to be displayed as background" }, + "language": { + "type": "string", + "description": "The ISO code of your desired language, must have translations present, check docs for more info" + }, "theme": { "type": "string", "default": "callisto", From a8290996310b94598285121a2a1f024482fea8f7 Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Sat, 24 Jul 2021 21:57:45 +0100 Subject: [PATCH 20/28] :zap: Removed demo language, adds note when thres only 1 language --- src/assets/locales/de.json | 130 ------------------- src/components/Settings/LanguageSwitcher.vue | 9 ++ src/utils/languages.js | 13 +- 3 files changed, 12 insertions(+), 140 deletions(-) delete mode 100644 src/assets/locales/de.json diff --git a/src/assets/locales/de.json b/src/assets/locales/de.json deleted file mode 100644 index d0303265..00000000 --- a/src/assets/locales/de.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "home": { - "no-results": "___", - "no-data": "_________" - }, - "search": { - "search-label": "______", - "search-placeholder": "_________", - "clear-search-tooltip": "______" - }, - "login": { - "title": "___", - "username-label": "______", - "password-label": "______", - "login-button": "___", - "remember-me-label": "_________", - "remember-me-never": "___", - "remember-me-hour": "____", - "remember-me-day": "___", - "remember-me-week": "___" - }, - "config": { - "main-tab": "______", - "view-config-tab": "_________", - "edit-config-tab": "_________", - "custom-css-tab": "_________", - "heading": "_________", - "download-config-button": "_________", - "edit-config-button": "_________", - "edit-css-button": "_________", - "cloud-sync-button": "_________", - "edit-cloud-sync-button": "_________", - "rebuild-app-button": "_________", - "change-language-button": "_________", - "reset-settings-button": "_________", - "app-info-button": "_________", - "app-version-note": "_________", - "backup-note": "_________________________________", - "reset-config-msg-l1": "_________________________________", - "reset-config-msg-l2": "_________________________________", - "reset-config-msg-l3": "_________________________________", - "data-cleared-msg": "_________", - "actions-label": "___", - "copy-config-label": "___", - "data-copied-msg": "_________", - "reset-config-label": "______", - "css-save-btn": "______", - "css-note-label": "___", - "css-note-l1": "____________________________________", - "css-note-l2": "____________________________________", - "css-note-l3": "____________________________________" - }, - "settings": { - "theme-label": "___", - "layout-label": "___", - "layout-auto": "___", - "layout-horizontal": "______", - "layout-vertical": "______", - "item-size-label": "______", - "item-size-small": "______", - "item-size-medium": "______", - "item-size-large": "______", - "config-launcher-label": "______" - }, - "theme-maker": { - "title": "_________", - "export-button": "_________", - "reset-button": "_________", - "show-all-button": "_________", - "save-button": "___", - "cancel-button": "___", - "saved-toast": "{theme} _________", - "copied-toast": "___ {theme} ___", - "reset-toast": "___ {theme} ___" - }, - "config-editor": { - "save-location-label": "_________", - "location-local-label": "_________", - "location-disk-label": "_________", - "save-button": "_________", - "valid-label": "_________", - "status-success-msg": "_________", - "status-fail-msg": "_________", - "success-msg-disk": "_________", - "success-msg-local": "_________", - "success-note-l1": "_________", - "success-note-l2": "_________", - "success-note-l3": "__________________", - "error-msg-save-mode": "__________________", - "error-msg-cannot-save": "__________________", - "error-msg-bad-json": "__________________", - "warning-msg-validation": "__________________" - }, - "app-rebuild": { - "title": "______", - "rebuild-note-l1": "__________________", - "rebuild-note-l2": "__________________", - "rebuild-note-l3": "__________________", - "rebuild-button": "_________", - "rebuilding-status-1": "______...", - "rebuilding-status-2": "_________", - "error-permission": "_________", - "success-msg": "_________", - "fail-msg": "_________", - "reload-note": "_________", - "reload-button": "______" - }, - "cloud-sync": { - "title": "_________", - "intro-l1": "__________________", - "intro-l2": "__________________", - "intro-l3": "__________________", - "backup-title-setup": "_________", - "backup-title-update": "_________", - "password-label-setup": "_________", - "password-label-update": "_________", - "backup-button-setup": "______", - "backup-button-update": "______", - "backup-id-label": "______", - "backup-id-note": "__________________", - "restore-title": "_________", - "restore-id-label": "_________", - "restore-password-label": "______", - "restore-button": "______", - "backup-error-unknown": "_________", - "backup-error-password": "_________", - "backup-success-msg": "_________", - "restore-success-msg": "_________" - } -} \ No newline at end of file diff --git a/src/components/Settings/LanguageSwitcher.vue b/src/components/Settings/LanguageSwitcher.vue index 693a0897..40df51a4 100644 --- a/src/components/Settings/LanguageSwitcher.vue +++ b/src/components/Settings/LanguageSwitcher.vue @@ -15,6 +15,10 @@

{{ language.flag }} {{ language.name }}

+

+ There are not currently any additional languages supported, + but stay tuned as more are on their way! +

@@ -82,6 +86,11 @@ export default { width: 100%; } + p.sad-times { + color: var(--warning); + text-align: center; + } + .language-dropdown { margin: 1rem auto; div.vs__dropdown-toggle { diff --git a/src/utils/languages.js b/src/utils/languages.js index 5f43353a..5c5ddc79 100644 --- a/src/utils/languages.js +++ b/src/utils/languages.js @@ -1,6 +1,5 @@ // Locales - Import translation files here! import en from '@/assets/locales/en.json'; -import de from '@/assets/locales/de.json'; // Language data - Add your country name, locale code and imported file here export const languages = [ @@ -10,17 +9,11 @@ export const languages = [ locale: en, flag: '🇬🇧', }, - { - name: 'German', - code: 'de', - locale: de, - flag: '🇩🇪', - }, // Including: - // name - Human readable name for your language - // code - ISO language code + // name - Human readable name for your language (e.g German) + // code - ISO language code (e.g. de) // locale - The file that you imported above - // flag - A nice emoji flag (optional) + // flag - A nice emoji flag (optional, e.g. 🇩🇪) ]; const i18nMessages = {}; From f6e0092190745244ecd4c41ee18d62d9ad56c993 Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Sat, 24 Jul 2021 22:02:49 +0100 Subject: [PATCH 21/28] :globe_with_meridians: Adds translations for language-switcher component --- src/assets/locales/en.json | 6 ++++++ src/components/Settings/LanguageSwitcher.vue | 12 ++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index f8f74ee9..9b69980b 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -62,6 +62,12 @@ "item-size-large": "Large", "config-launcher-label": "Config" }, + "language-switcher": { + "title": "Change Application Language", + "dropdown-label": "Select a Language", + "save-button": "Save", + "success-msg": "Language Updated to" + }, "theme-maker": { "title": "Theme Configurator", "export-button": "Export Custom Variables", diff --git a/src/components/Settings/LanguageSwitcher.vue b/src/components/Settings/LanguageSwitcher.vue index 40df51a4..7def9ab3 100644 --- a/src/components/Settings/LanguageSwitcher.vue +++ b/src/components/Settings/LanguageSwitcher.vue @@ -1,7 +1,7 @@