From 4170fbd6da70652de01d686de5994113d54710b7 Mon Sep 17 00:00:00 2001 From: "HYDROTEC\\tobiasg" Date: Tue, 4 Mar 2025 15:26:29 +0100 Subject: [PATCH 1/3] * added localization functionality via i18n * added translations for some words * added function in configManager for non mandatory environment variables (app-config.json) --- package-lock.json | 61 +++++++++++++++++++ package.json | 1 + public/locales/de_DE.json | 9 +++ public/locales/en_EN.json | 9 +++ src/components/charts/TimeSeriesChart.vue | 6 +- .../time-control/IntervalSelector.vue | 10 ++- .../timeseries/TimeSeriesWindowComponent.vue | 6 +- src/layouts/DefaultLayout.vue | 6 +- src/main.ts | 21 +++++++ .../application-config/ApplicationConfig.ts | 3 +- .../ApplicationConfigManager.ts | 12 ++-- src/views/TopologyDisplayView.vue | 2 +- 12 files changed, 133 insertions(+), 13 deletions(-) create mode 100644 public/locales/de_DE.json create mode 100644 public/locales/en_EN.json diff --git a/package-lock.json b/package-lock.json index 1a73f1713..dc46a2936 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,6 +38,7 @@ "terra-draw-maplibre-gl-adapter": "^1.0.1", "typescript-json-serializer": "^6.0.1", "vue": "^3.5.13", + "vue-i18n": "^9.14.2", "vue-router": "^4.5.0", "vue-slider-component": "^4.1.0-beta.7", "vuetify": "^3.7.7" @@ -1277,6 +1278,47 @@ "vue": "^3.4.18" } }, + "node_modules/@intlify/core-base": { + "version": "9.14.2", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.2.tgz", + "integrity": "sha512-DZyQ4Hk22sC81MP4qiCDuU+LdaYW91A6lCjq8AWPvY3+mGMzhGDfOCzvyR6YBQxtlPjFqMoFk9ylnNYRAQwXtQ==", + "dependencies": { + "@intlify/message-compiler": "9.14.2", + "@intlify/shared": "9.14.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.14.2", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.2.tgz", + "integrity": "sha512-YsKKuV4Qv4wrLNsvgWbTf0E40uRv+Qiw1BeLQ0LAxifQuhiMe+hfTIzOMdWj/ZpnTDj4RSZtkXjJM7JDiiB5LQ==", + "dependencies": { + "@intlify/shared": "9.14.2", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "9.14.2", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.2.tgz", + "integrity": "sha512-uRAHAxYPeF+G5DBIboKpPgC/Waecd4Jz8ihtkpJQD5ycb5PwXp0k/+hBGl5dAjwF7w+l74kz/PKA8r8OK//RUw==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -11287,6 +11329,25 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/vue-i18n": { + "version": "9.14.2", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.2.tgz", + "integrity": "sha512-JK9Pm80OqssGJU2Y6F7DcM8RFHqVG4WkuCqOZTVsXkEzZME7ABejAUqUdA931zEBedc4thBgSUWxeQh4uocJAQ==", + "dependencies": { + "@intlify/core-base": "9.14.2", + "@intlify/shared": "9.14.2", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/vue-router": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz", diff --git a/package.json b/package.json index c2fdf047a..96ea4a517 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "terra-draw-maplibre-gl-adapter": "^1.0.1", "typescript-json-serializer": "^6.0.1", "vue": "^3.5.13", + "vue-i18n": "^9.14.2", "vue-router": "^4.5.0", "vue-slider-component": "^4.1.0-beta.7", "vuetify": "^3.7.7" diff --git a/public/locales/de_DE.json b/public/locales/de_DE.json new file mode 100644 index 000000000..3b391352d --- /dev/null +++ b/public/locales/de_DE.json @@ -0,0 +1,9 @@ +{ + "thresholds": "Schwellenwerte", + "download_time_series": "Zeitreihe herunterladen ...", + "switch_to": "Wechseln zu", + "about": "Über", + "default": "Standard", + "custom": "Benutzerdefiniert", + "period_presets": "Zeitraum-Voreinstellungen" +} \ No newline at end of file diff --git a/public/locales/en_EN.json b/public/locales/en_EN.json new file mode 100644 index 000000000..5220e08a1 --- /dev/null +++ b/public/locales/en_EN.json @@ -0,0 +1,9 @@ +{ + "thresholds": "Thresholds", + "download_time_series": "Download time series ...", + "switch_to": "Switch to", + "about": "About", + "default": "Default", + "custom": "Custom", + "period_presets": "period presets" +} \ No newline at end of file diff --git a/src/components/charts/TimeSeriesChart.vue b/src/components/charts/TimeSeriesChart.vue index 5360e8d87..fa5d13fbb 100644 --- a/src/components/charts/TimeSeriesChart.vue +++ b/src/components/charts/TimeSeriesChart.vue @@ -50,6 +50,8 @@ import type { Tag } from '@/lib/charts/tags' import { type ChartsSettings } from '@/lib/topology/componentSettings' import { getAxisOptions } from '@/lib/charts/axisOptions' +import { useI18n } from 'vue-i18n' + interface Props { config?: ChartConfig series?: Record @@ -75,6 +77,8 @@ const props = withDefaults(defineProps(), { }, }) +const { t } = useI18n() + let thresholdLines!: ThresholdLine[] let thresholdLinesVisitor!: AlertLines let axis!: CartesianAxes @@ -331,7 +335,7 @@ const setTags = () => { legendSvg.appendChild(svgGroup) const thresholdLegend = { id: 'Thresholds', - name: 'Thresholds', + name: t('thresholds'), disabled: false, legendSvg: '', diff --git a/src/components/time-control/IntervalSelector.vue b/src/components/time-control/IntervalSelector.vue index d44196468..8faaff85a 100644 --- a/src/components/time-control/IntervalSelector.vue +++ b/src/components/time-control/IntervalSelector.vue @@ -1,20 +1,20 @@