Skip to content

Commit 69f9f5e

Browse files
authoredApr 23, 2024
Merge pull request #824 from nscuro/locale-picker
Add locale picker to header
2 parents 3171ceb + 732db02 commit 69f9f5e

17 files changed

+445
-131
lines changed
 

‎package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"eslint-fix": "eslint --ext .js,.vue,.json,.md,.yaml --fix . --report-unused-disable-directives",
2020
"prettier": "prettier --check --cache '**/*.{js,vue,json,md,yaml}'",
2121
"prettier-fix": "prettier --write --cache '**/*.{js,vue,json,md,yaml}'",
22-
"vue-i18n-extract": "vue-i18n-extract report --vueFiles 'src/**/*.?(vue|js)' --languageFiles 'src/i18n/locales/*.json' --exclude 'validation.max_value' --exclude 'validation.min_value' --exclude 'validation.confirmed' --exclude 'validation.required' --ci --ci"
22+
"vue-i18n-extract": "vue-i18n-extract report --ci"
2323
},
2424
"dependencies": {
2525
"@coreui/coreui": "2.1.16",

‎src/containers/DefaultHeaderProfileDropdown.vue

+11
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717
{{ $t('message.change_password') }}</b-dropdown-item
1818
>
1919
<b-dropdown-divider v-if="canUpdateProfile() || canChangePassword()" />
20+
<b-dropdown-form id="locale-picker-form" class="pl-2 pr-2">
21+
<LocalePicker />
22+
</b-dropdown-form>
23+
<b-dropdown-divider />
2024
<b-dropdown-item @click="logout"
2125
><i class="fa fa-sign-out text-primary" />
2226
{{ $t('message.logout') }}</b-dropdown-item
@@ -30,12 +34,14 @@ import { HeaderDropdown as AppHeaderDropdown } from '@coreui/vue';
3034
import EventBus from '../shared/eventbus';
3135
import { decodeToken, getToken } from '../shared/permissions';
3236
import globalVarsMixin from '../mixins/globalVarsMixin';
37+
import LocalePicker from '@/views/components/LocalePicker.vue';
3338
3439
export default {
3540
name: 'DefaultHeaderProfileDropdown',
3641
mixins: [globalVarsMixin],
3742
components: {
3843
AppHeaderDropdown,
44+
LocalePicker,
3945
},
4046
data: () => {
4147
return {
@@ -71,4 +77,9 @@ export default {
7177
.app-header .navbar-nav .dropdown-menu-right {
7278
right: inherit;
7379
}
80+
81+
/* Remove default padding inherited from b-dropdown-form. */
82+
#locale-picker-form {
83+
padding: 0;
84+
}
7485
</style>

‎src/i18n/index.js

+41-2
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,49 @@ function loadLocaleMessages() {
2020
return messages;
2121
}
2222

23+
const localeMessages = loadLocaleMessages();
24+
25+
function matchLocale(requestedLocale) {
26+
console.log(localeMessages);
27+
let exactMatch = Object.keys(localeMessages).find(
28+
(locale) => requestedLocale === locale,
29+
);
30+
if (exactMatch) {
31+
console.debug(`Matched exact locale ${requestedLocale}`);
32+
return exactMatch;
33+
}
34+
35+
let localeParts = requestedLocale.split('-');
36+
if (localeParts.length !== 2) {
37+
console.debug(
38+
`Found no matching locale for ${requestedLocale}, falling back to en`,
39+
);
40+
return 'en';
41+
}
42+
43+
let baseLocale = localeParts[0];
44+
let baseLocaleMatch = Object.keys(localeMessages).find(
45+
(locale) => baseLocale === locale,
46+
);
47+
if (baseLocaleMatch) {
48+
console.debug(`Matched base locale ${baseLocale} for ${requestedLocale}`);
49+
return baseLocaleMatch;
50+
}
51+
52+
console.debug(
53+
`Found no matching locale for ${requestedLocale}, falling back to en`,
54+
);
55+
return 'en';
56+
}
57+
2358
const i18n = new VueI18n({
24-
locale: navigator.language || navigator.userLanguage,
59+
locale: matchLocale(
60+
(localStorage && localStorage.getItem('Locale')) ||
61+
navigator.language ||
62+
navigator.userLanguage,
63+
),
2564
fallbackLocale: process.env.VUE_APP_I18N_FALLBACK_LOCALE || 'en',
26-
messages: loadLocaleMessages(),
65+
messages: localeMessages,
2766
});
2867

2968
export default i18n;

‎src/i18n/locales/de.json

+26-11
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"analyzer_snyk_org_id": "Organisations-ID",
3131
"analyzer_snyk_why_multiple_cvss": "Warum gibt es mehrere CVSS-Scores für dieselbe Schwachstelle?",
3232
"analyzer_trivy_enable": "Trivy-Analysator aktivieren",
33+
"analyzer_trivy_ignore_unfixed": "Ignorieren Sie nicht behobene Schwachstellen",
3334
"analyzer_vulndb_desc": "VulnDB ist ein kommerzieller Dienst von Risk Based Security, der Schwachstellen in Komponenten von Drittanbietern identifiziert. Dependency-Track lässt sich nativ in den VulnDB-Dienst integrieren, um hochpräzise Ergebnisse zu liefern. Die Verwendung dieses Analysators erfordert eine gültige CPE für die zu analysierenden Komponenten.",
3435
"analyzer_vulndb_enable": "VulnDB-Analyzer aktivieren",
3536
"analyzers": "Analysatoren",
@@ -44,6 +45,8 @@
4445
"bearer_token_auth_enable": "Authentifizieren mit einem persönlichen Zugriffstoken",
4546
"bom_formats": "Stücklistenformate",
4647
"bom_formats_desc": "Aktiviert die Unterstützung für die Verarbeitung von Stücklisten verschiedener Formate. Nur aktivierte Stücklistenformate werden verarbeitet.",
48+
"bom_validation": "Stücklistenvalidierung",
49+
"bom_validation_info": "In der Vergangenheit hat Dependency-Track hochgeladene Stücklisten und VEXs nicht anhand des CycloneDX-Schemas validiert. \nDies ermöglichte zwar die Verarbeitung von Stücklisten, die nicht strikt dem Schema entsprachen, es konnte jedoch zu Verwirrung führen, wenn hochgeladene Dateien akzeptiert wurden, dann aber während der asynchronen Verarbeitung nicht erfasst werden konnten. \nAb dieser Version werden hochgeladene Dateien abgelehnt, wenn sie die Schemavalidierung nicht bestehen. \nBeachten Sie, dass dies möglicherweise Probleme in Stücklistengeneratoren aufdeckt, die derzeit ungültige CycloneDX-Dokumente erzeugen",
4750
"cargo": "Ladung",
4851
"change_password": "Kennwort ändern",
4952
"change_password_next_login": "Der Benutzer muss bei der nächsten Anmeldung sein Passwort ändern",
@@ -93,6 +96,10 @@
9396
"enable_index_consistency_check": "Aktivieren Sie regelmäßige Konsistenzprüfungen",
9497
"enable_svg_badge": "SVG-Badge-Unterstützung aktivieren (nicht authentifiziert)",
9598
"enabled": "Ermöglicht",
99+
"experimental": "Experimental",
100+
"experimental_bom_upload_v2": "Stücklistenverarbeitung V2",
101+
"experimental_bom_upload_v2_info": "Die Logik, wie hochgeladene Stücklisten verarbeitet und in Dependency-Track aufgenommen werden, wurde überarbeitet, um zuverlässiger und effizienter zu sein. \nDarüber hinaus handelt es sich bei der Stücklistenverarbeitung nun um einen atomaren Vorgang, sodass Fehler, die auf halbem Weg auftreten, nicht dazu führen, dass ein Teilzustand zurückbleibt. \nDie Deduplizierung von Komponenten und Diensten ist vorhersehbarer und während der Verarbeitung ausgegebene Protokollnachrichten enthalten zusätzlichen Kontext, wodurch sie leichter korreliert werden können. \nDa die neue Implementierung große Auswirkungen auf das Verhalten von Dependency-Track beim Hochladen von Stücklisten haben kann, ist sie für diese Version standardmäßig deaktiviert.",
102+
"experimental_info": "Die folgenden Optionen sind experimentelle Optionen und sollten mit Vorsicht verwendet werden.",
96103
"fortify_ssc": "SSC verstärken",
97104
"gem": "Juwel",
98105
"general": "Allgemein",
@@ -263,14 +270,7 @@
263270
"vulnsource_osv_advisories_desc": "Google OSV ist eine verteilte Infrastruktur für Schwachstellen und Triage für Open-Source-Projekte, die sowohl Open-Source-Betreuern als auch Open-Source-Nutzern helfen soll. Es dient als Aggregator von Schwachstellendatenbanken, die das OpenSSF-Schwachstellenformat übernommen haben.",
264271
"vulnsource_osv_advisories_enable": "Wählen Sie ein Ökosystem aus, um Google OSV Advisory Mirroring zu aktivieren",
265272
"vulnsource_osv_alias_sync_warning": "OSV kann nicht identische Schwachstellen als Aliase melden. Gehen Sie mit Vorsicht vor.",
266-
"vulnsource_osv_base_url": "OSV-Basis-URL",
267-
"analyzer_trivy_ignore_unfixed": "Ignorieren Sie nicht behobene Schwachstellen",
268-
"experimental_info": "Die folgenden Optionen sind experimentelle Optionen und sollten mit Vorsicht verwendet werden.",
269-
"experimental_bom_upload_v2": "Stücklistenverarbeitung V2",
270-
"experimental_bom_upload_v2_info": "Die Logik, wie hochgeladene Stücklisten verarbeitet und in Dependency-Track aufgenommen werden, wurde überarbeitet, um zuverlässiger und effizienter zu sein. \nDarüber hinaus handelt es sich bei der Stücklistenverarbeitung nun um einen atomaren Vorgang, sodass Fehler, die auf halbem Weg auftreten, nicht dazu führen, dass ein Teilzustand zurückbleibt. \nDie Deduplizierung von Komponenten und Diensten ist vorhersehbarer und während der Verarbeitung ausgegebene Protokollnachrichten enthalten zusätzlichen Kontext, wodurch sie leichter korreliert werden können. \nDa die neue Implementierung große Auswirkungen auf das Verhalten von Dependency-Track beim Hochladen von Stücklisten haben kann, ist sie für diese Version standardmäßig deaktiviert.",
271-
"bom_validation": "Stücklistenvalidierung",
272-
"bom_validation_info": "In der Vergangenheit hat Dependency-Track hochgeladene Stücklisten und VEXs nicht anhand des CycloneDX-Schemas validiert. \nDies ermöglichte zwar die Verarbeitung von Stücklisten, die nicht strikt dem Schema entsprachen, es konnte jedoch zu Verwirrung führen, wenn hochgeladene Dateien akzeptiert wurden, dann aber während der asynchronen Verarbeitung nicht erfasst werden konnten. \nAb dieser Version werden hochgeladene Dateien abgelehnt, wenn sie die Schemavalidierung nicht bestehen. \nBeachten Sie, dass dies möglicherweise Probleme in Stücklistengeneratoren aufdeckt, die derzeit ungültige CycloneDX-Dokumente erzeugen",
273-
"experimental": "Experimental"
273+
"vulnsource_osv_base_url": "OSV-Basis-URL"
274274
},
275275
"condition": {
276276
"forbidden": "Verboten (403)",
@@ -293,6 +293,20 @@
293293
"sha_384": "SHA-384",
294294
"sha_512": "SHA-512"
295295
},
296+
"language": {
297+
"de": "Deutsch",
298+
"en": "Englisch",
299+
"es": "Spanisch",
300+
"fr": "Französisch",
301+
"hi": "Hindi",
302+
"it": "Italienisch",
303+
"ja": "Japanisch",
304+
"pl": "Polnisch",
305+
"pt": "Portugiesisch (Portugal)",
306+
"pt-BR": "Portugiesisch (Brasilien)",
307+
"ru": "Russisch",
308+
"zh": "Chinesisch"
309+
},
296310
"message": {
297311
"about": "Um",
298312
"active": "Aktiv",
@@ -368,6 +382,7 @@
368382
"component_namespace_group_vendor": "Namespace/Gruppe/Anbieter",
369383
"component_operating_system": "Betriebssystem",
370384
"component_package_url_desc": "Für Bibliotheken und Frameworks ist eine gültige Paket-URL erforderlich. PURL-Syntax: pkg:type/namespace/name@version?qualifiers#subpath",
385+
"component_properties": "Komponenteneigenschaften",
371386
"component_search": "Komponentensuche",
372387
"component_spdx_license_desc": "Gibt die SPDX-Lizenz-ID der Komponente an",
373388
"component_supplier_name_desc": "Die Organisation, die die Komponente geliefert hat",
@@ -387,6 +402,7 @@
387402
"cpe": "CPE",
388403
"cpe_full": "Gemeinsame Plattformaufzählung (CPE)",
389404
"create": "Erstellen",
405+
"create_component_property": "Komponenteneigenschaft erstellen",
390406
"create_license_group": "Lizenzgruppe erstellen",
391407
"create_policy": "Richtlinie erstellen",
392408
"create_project": "Projekt erstellen",
@@ -500,6 +516,7 @@
500516
"inventory_with_vulnerabilities": "Inventarisierung mit Schwachstellen",
501517
"justification": "Rechtfertigung",
502518
"justification_tooltip": "Die Begründung, warum der Auswirkungsanalysestatus „Nicht betroffen“ lautete",
519+
"language": "Sprache",
503520
"last_bom_import": "Letzter Stücklistenimport",
504521
"last_measurement": "Letzte Messung",
505522
"last_seen": "Zuletzt gesehen bei",
@@ -820,9 +837,7 @@
820837
"weakness": "Schwäche",
821838
"will_not_fix": "Wird nicht repariert",
822839
"workaround_available": "Problemumgehung verfügbar",
823-
"x_trust_boundary": "Vertrauensgrenzen überschreiten",
824-
"component_properties": "Komponenteneigenschaften",
825-
"create_component_property": "Komponenteneigenschaft erstellen"
840+
"x_trust_boundary": "Vertrauensgrenzen überschreiten"
826841
},
827842
"operator": {
828843
"contains_all": "enthält alle",

‎src/i18n/locales/en.json

+22-7
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
"bearer_token_auth_enable": "Authenticate with a personal access token",
4646
"bom_formats": "BOM Formats",
4747
"bom_formats_desc": "Enables support for processing BOMs of various formats. Only BOM formats which are enabled will be processed.",
48+
"bom_validation": "BOM Validation",
49+
"bom_validation_info": "Historically, Dependency-Track did not validate uploaded BOMs and VEXs against the CycloneDX schema. While this allowed BOMs to be processed that did not strictly adhere to the schema, it could lead to confusion when uploaded files were accepted, but then failed to be ingested during asynchronous processing. Starting with this release, uploaded files will be rejected if they fail schema validation. Note that this may reveal issues in BOM generators that currently produce invalid CycloneDX documents",
4850
"cargo": "Cargo",
4951
"change_password": "Change Password",
5052
"change_password_next_login": "User must change password at next login",
@@ -94,6 +96,10 @@
9496
"enable_index_consistency_check": "Enable periodic consistency check",
9597
"enable_svg_badge": "Enable SVG badge support (unauthenticated)",
9698
"enabled": "Enabled",
99+
"experimental": "Experimental",
100+
"experimental_bom_upload_v2": "BOM Processing V2",
101+
"experimental_bom_upload_v2_info": "The logic how uploaded BOMs are processed and ingested into Dependency-Track has been overhauled to be more reliable and efficient. Further, BOM processing is now an atomic operation, such that errors occurring midway do not cause a partial state to be left behind. De-duplication of components and services is more predictable, and log messages emitted during processing contain additional context, making them easier to correlate. Because the new implementation can have a big impact on how Dependency-Track behaves regarding BOM uploads, it is disabled by default for this release.",
102+
"experimental_info": "The following options are experimental options and should be used with precaution.",
97103
"fortify_ssc": "Fortify SSC",
98104
"gem": "Gem",
99105
"general": "General",
@@ -264,13 +270,7 @@
264270
"vulnsource_osv_advisories_desc": "Google OSV is a distributed vulnerability and triage infrastructure for open source projects aimed at helping both open source maintainers and consumers of open source. It serves as an aggregator of vulnerability databases that have adopted the OpenSSF Vulnerability format.",
265271
"vulnsource_osv_advisories_enable": "Select ecosystem to enable Google OSV Advisory mirroring",
266272
"vulnsource_osv_alias_sync_warning": "OSV may report non-identical vulnerabilities as aliases. Proceed with caution.",
267-
"vulnsource_osv_base_url": "OSV Base URL",
268-
"experimental_info": "The following options are experimental options and should be used with precaution.",
269-
"experimental_bom_upload_v2": "BOM Processing V2",
270-
"bom_validation": "BOM Validation",
271-
"experimental_bom_upload_v2_info": "The logic how uploaded BOMs are processed and ingested into Dependency-Track has been overhauled to be more reliable and efficient. Further, BOM processing is now an atomic operation, such that errors occurring midway do not cause a partial state to be left behind. De-duplication of components and services is more predictable, and log messages emitted during processing contain additional context, making them easier to correlate. Because the new implementation can have a big impact on how Dependency-Track behaves regarding BOM uploads, it is disabled by default for this release.",
272-
"bom_validation_info": "Historically, Dependency-Track did not validate uploaded BOMs and VEXs against the CycloneDX schema. While this allowed BOMs to be processed that did not strictly adhere to the schema, it could lead to confusion when uploaded files were accepted, but then failed to be ingested during asynchronous processing. Starting with this release, uploaded files will be rejected if they fail schema validation. Note that this may reveal issues in BOM generators that currently produce invalid CycloneDX documents",
273-
"experimental": "Experimental"
273+
"vulnsource_osv_base_url": "OSV Base URL"
274274
},
275275
"condition": {
276276
"forbidden": "Forbidden (403)",
@@ -293,6 +293,20 @@
293293
"sha_384": "SHA-384",
294294
"sha_512": "SHA-512"
295295
},
296+
"language": {
297+
"de": "German",
298+
"en": "English",
299+
"es": "Spanish",
300+
"fr": "French",
301+
"hi": "Hindi",
302+
"it": "Italian",
303+
"ja": "Japanese",
304+
"pl": "Polish",
305+
"pt": "Portuguese (Portugal)",
306+
"pt-BR": "Portuguese (Brazil)",
307+
"ru": "Russian",
308+
"zh": "Chinese"
309+
},
296310
"message": {
297311
"about": "About",
298312
"active": "Active",
@@ -502,6 +516,7 @@
502516
"inventory_with_vulnerabilities": "Inventory with Vulnerabilities",
503517
"justification": "Justification",
504518
"justification_tooltip": "The rationale of why the impact analysis state was asserted to be \"Not Affected\"",
519+
"language": "Language",
505520
"last_bom_import": "Last BOM Import",
506521
"last_measurement": "Last Measurement",
507522
"last_seen": "Last Seen At",

0 commit comments

Comments
 (0)