This is an automated email from the ASF dual-hosted git repository.
riemer pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/streampipes.git
The following commit(s) were added to refs/heads/dev by this push:
new 1e487c35a3 feat: Add german translation to dashboard, core-ui and
shared-ui (#3521)
1e487c35a3 is described below
commit 1e487c35a3c320770d2fb91e1c4b8cd96a65b4bd
Author: Marcel Früholz <[email protected]>
AuthorDate: Tue Apr 1 18:53:11 2025 +0200
feat: Add german translation to dashboard, core-ui and shared-ui (#3521)
* Add german translation to dashboard, core-ui and shared-ui
* fix header text in static-tree-input-text-editor
* Resolve merge conflicts
---
ui/deployment/i18n/de.json | 152 ++++++++++++++++++++-
ui/deployment/i18n/en.json | 152 ++++++++++++++++++++-
.../asset-browser-hierarchy.component.ts | 11 +-
.../asset-browser-filter-labels.component.html | 2 +-
.../asset-browser-filter-outer.component.html | 4 +-
.../asset-browser-filter-sites.component.html | 2 +-
.../asset-browser-filter-type.component.html | 2 +-
.../asset-browser-filter.component.html | 4 +-
.../asset-browser-toolbar.component.html | 4 +-
.../asset-browser/asset-browser.component.html | 12 +-
.../asset-browser/asset-browser.component.ts | 6 +-
.../basic-nav-tabs/basic-nav-tabs.component.html | 2 +-
.../basic-view/basic-view.component.html | 2 +-
.../exception-details-dialog.component.html | 2 +-
.../exception-details.component.html | 12 +-
.../sp-exception-message.component.html | 10 +-
.../sp-exception-message.component.ts | 7 +-
.../components/sp-table/sp-table.component.html | 2 +-
.../refresh-interval-settings.component.html | 4 +-
.../time-range-selector.component.html | 2 +-
.../custom-time-range-selection.component.html | 2 +-
.../src/lib/services/time-selection.service.ts | 55 ++++----
.../configuration-code-panel.component.html | 4 +-
ui/src/app/core-ui/core-ui.module.ts | 2 +
ui/src/app/core-ui/help/help.component.html | 2 +-
ui/src/app/core-ui/help/help.component.ts | 11 +-
.../loading-indicator.component.ts | 7 +-
.../simple-logs/simple-logs.component.html | 4 +-
.../object-permission-dialog.component.html | 43 ++++--
.../pipeline-element-documentation.component.html | 2 +-
.../live-preview-error.component.html | 2 +-
.../live-preview-loading.component.html | 2 +-
.../live-preview-table.component.html | 18 ++-
.../pipeline-element-schema.service.ts | 19 +--
...ine-element-template-config-item.component.html | 2 +-
...pipeline-element-template-config.component.html | 18 +--
.../pipeline-started-status.component.html | 16 ++-
.../base/abstract-validated-static-property.ts | 6 +-
.../static-code-input.component.html | 4 +-
.../add-to-collection.component.html | 8 +-
.../add-to-collection.component.ts | 31 +++--
.../static-file-input.component.html | 18 +--
.../static-file-input.component.ts | 7 +-
.../static-free-input.component.html | 2 +-
.../static-free-input.component.ts | 16 ++-
.../static-mapping-nary.component.html | 4 +-
...tic-runtime-resolvable-any-input.component.html | 8 +-
.../static-runtime-resolvable-group.component.html | 2 +-
...c-runtime-resolvable-oneof-input.component.html | 4 +-
.../static-tree-input-browse-nodes.component.html | 18 +--
.../static-tree-input-button-menu.component.html | 22 +--
.../static-tree-input-node-details.component.html | 2 +-
...static-tree-input-selected-nodes.component.html | 2 +-
.../static-tree-input-text-editor.component.ts | 18 ++-
.../status-indicator/status-indicator.component.ts | 7 +-
ui/src/app/core-ui/topics/topics.component.html | 21 +--
ui/src/app/core-ui/topics/topics.component.ts | 10 +-
.../dashboard-overview-table.component.html | 14 +-
.../dashboard-overview-table.component.ts | 18 ++-
.../overview/dashboard-overview.component.html | 2 +-
.../overview/dashboard-overview.component.ts | 4 +-
.../chart-selection-panel.component.html | 7 +-
.../chart-selection/chart-selection.component.html | 10 +-
.../panel/dashboard-panel.component.html | 5 +-
.../components/panel/dashboard-panel.component.ts | 14 +-
.../dashboard-toolbar.component.html | 26 ++--
ui/src/app/dashboard/dashboard.module.ts | 2 +
.../edit-dashboard-dialog.component.html | 26 ++--
ui/src/app/dashboard/services/dashboard.service.ts | 10 +-
.../config/heatmap-widget-config.component.html | 4 +-
70 files changed, 702 insertions(+), 253 deletions(-)
diff --git a/ui/deployment/i18n/de.json b/ui/deployment/i18n/de.json
index 43376d0635..3625f8fe7b 100644
--- a/ui/deployment/i18n/de.json
+++ b/ui/deployment/i18n/de.json
@@ -100,6 +100,8 @@
"Minimum value": "Minimaler Wert",
"Maximum value": "Maximaler Wert",
"Show values as labels": "Werte als Beschriftung anzeigen",
+ "Visual Map Min": "Visuelle Heatmap Maximum",
+ "Visual Map Max": "Visuelle Heatmap Minimum",
"Min": "Min",
"Max": "Max",
"X": "X",
@@ -201,6 +203,86 @@
"Unit": "Einheit",
"Background": "Hintergrund",
"Text": "Text",
+ "Dashboard title": "Dashboardtitel",
+ "Title must not be empty": "Titel darf nicht leer sein!",
+ "Description": "Beschreibung",
+ "Default view mode": "Standard-Ansicht",
+ "Grid view": "Rasteransicht",
+ "Slide view": "Folienansicht",
+ "Time settings": "Zeiteinstellungen",
+ "Use global time settings instead of chart time settings": "Einheitliche
Zeiteinstellungen anstelle von Diagramm-Zeiteinstellungen verwenden",
+ "This dashboard is empty and doesn't contain any charts.": "Dieses Dashboard
ist leer und hat keine Diagramm zum Anzeigen.",
+ "View mode": "Ansicht",
+ "Grid": "Raster",
+ "Slides": "Folien",
+ "Edit dashboard": "Dashboard bearbeiten",
+ "Show time range selector": "Zeiteinstellungen anzeigen",
+ "Hide time range selector": "Zeiteinstellungen ausblenden",
+ "Delete dashboard": "Dashboard löschen",
+ "Configure dashboard": "Dashboard konfigurieren",
+ "No charts found - create a new chart first to add it to this dashboard.":
"Keine Diagramme gefunden - erstellen Sie zuerst ein neues Diagramm, um es zu
diesem Dashboard hinzuzufügen.",
+ "Create chart": "Diagramm erstellen",
+ "New dashboard": "Neues Dashboard",
+ "Dashboards": "Dashboards",
+ "Show dashboard": "Dashboard anzeigen",
+ "Dashboard settings": "Dashboard-Einstellungen",
+ "ID": "ID",
+ "Output Topics": "Output-Topics",
+ "Copy": "Kopieren",
+ "Input Topics": "Input-Topics",
+ "Selected Nodes": "Ausgewählte Knoten",
+ "Node Details": "Details zum Knoten",
+ "Clear selection & reload": "Auswahl löschen & neu laden",
+ "Reload": "Neu laden",
+ "Reloading nodes": "Knoten neu laden",
+ "Font Style": "Schriftstil",
+ "Tree": "Baum",
+ "Browse": "Durchsuchen",
+ "Add node": "Knoten hinzufügen",
+ "Remove node": "Knoten entfernen",
+ "Show details": "Details anzeigen",
+ "Add all direct children": "Alle direkten Unterknoten hinzufügen",
+ "(waiting for input)": "(warten auf Input)",
+ "Select none": "Keine auswählen",
+ "Possible placeholders:": "Mögliche Platzhalter:",
+ "Choose existing file": "Vorhandene Datei auswählen",
+ "Upload new file": "Neue Datei hochladen",
+ "Select file": "Datei auswählen",
+ "Clear": "Zurücksetzen",
+ "Upload": "Hochladen",
+ "Add": "Hinzufügen",
+ "Import from file": "Aus Datei importieren",
+ "File": "Datei",
+ "Reset code template": "Codevorlage zurücksetzen",
+ "Clean code": "Code aufräumen",
+ "Basics": "Allgemein",
+ "Template name": "Name der Vorlage",
+ "Template description": "Beschreibung der Vorlage",
+ "Configuration": "Konfiguration",
+ "(dynamic options cannot be saved and are hidden)": "(dynamische Optionen
können nicht gespeichert werden und sind ausgeblendet)",
+ "Existing templates": "Vorhandene Vorlagen",
+ "(no templates available)": "(keine Vorlagen verfügbar)",
+ "Store as template": "Als Vorlage speichern",
+ "Here is a preview of your data:": "Vorschau Ihrer Daten:",
+ "Runtime Name": "Laufzeitname",
+ "Field Name": "Feldname",
+ "no data": "keine Daten",
+ "Gathering data for live preview...": "Sammeln von Daten für die
Live-Vorschau...",
+ "Preview is currently unavailable.": "Die Vorschau ist derzeit nicht
verfügbar.",
+ "(no documentation available)": "(keine Dokumentation verfügbar)",
+ "You can perform a forced stop, which will stop and reset the pipeline
status.": "Sie können einen erzwungenen Stopp durchführen, der die Pipeline
anhält und zurücksetzt.",
+ "Show Details": "Details anzeigen",
+ "Hide Details": "Details ausblenden",
+ "Force stop": "Stopp erzwingen",
+ "Owner": "Eigentümer",
+ "Public Element": "Öffentliches Element",
+ "Users": "Nutzer",
+ "Authorized Users": "Autorisierte Nutzer",
+ "User selection": "Auswahl der Nutzer",
+ "Groups": "Gruppen",
+ "Authorized Groups": "Autorisierte Gruppen",
+ "Group selection": "Auswahl der Gruppe",
+ "(no log messages available)": "(keine Protokollmeldungen verfügbar)",
"success": "Erfolg",
"error": "Fehler",
"waiting": "Warten",
@@ -234,6 +316,28 @@
"Hour": "Stunde",
"Day": "Tag",
"Week": "Woche",
+ "Update all changes to dashboard charts or discard current changes.":
"Aktualisieren Sie alle Änderungen der Diagramme oder verwerfen Sie aktuelle
Änderungen.",
+ "Off": "Aus",
+ "Are you sure you want to delete this dashboard?": "Sind Sie sicher, dass
Sie dieses Dashboard löschen möchten?",
+ "This action cannot be undone!": "Diese Aktion kann nicht rückgängig gemacht
werden!",
+ "Topics": "Themen",
+ "Code": "Code",
+ "Loading": "Laden",
+ "# Provide OPC UA Node IDs below, one per line.\n# Format:
ns=<namespace>;s=<node_id> (e.g., ns=3;s=SampleNodeId)\n": "# Geben Sie unten
OPC UA Node-IDs ein, eine pro Zeile.\n# Format: ns=<namespace>;s=<node_id> (z.
B. ns=3;s=SampleNodeId)\n",
+ "The value should be a number": "Der Wert sollte eine Zahl sein",
+ "Please enter a valid URL": "Bitte geben Sie eine gültige URL ein",
+ "Please enter a valid String": "Bitte geben Sie einen gültigen String ein",
+ "Please enter a value": "Bitte geben Sie einen Wert ein",
+ "This is a test": "Dies ist ein Test",
+ "Error in line {{rowNumber}}. Value for \"{{property}}\" is not supported.":
"Fehler in Zeile {{Zeilennummer}}. Wert für \"{{Eigenschaft}}\" wird nicht
unterstützt.",
+ "Error in line {{rowNumber}}. Value for \"{{property}}\" is not set.":
"Fehler in Zeile {{Zeilennummer}}. Wert für \"{{Eigenschaft}}\" ist nicht
gesetzt.",
+ "Timestamp": "Zeitstempel",
+ "Number": "Nummer",
+ "Boolean": "Boolean",
+ "List": "Liste",
+ "Nested": "Verschachtelt",
+ "TOPICS": "TOPICS",
+ "CODE": "CODE",
"Select Data": "Daten auswählen",
"Previous": "Zurück",
"Download": "Download",
@@ -256,5 +360,51 @@
"Behaviour in case of missing values": "Verhalten im Falle von fehlenden
Daten",
"Ignore lines with missing value": "Zeilen ohne Daten ignorieren",
"Leave entry empty": "Leer lassen",
- "Download successful": "Download erfolgreich"
+ "Download successful": "Download erfolgreich",
+ "Refresh": "Neu laden",
+ "Apply": "Anwenden",
+ "Refresh interval": "Aktualisierungsintervall",
+ "No entries available.": "Keine Einträge vorhanden.",
+ "Error": "Fehler",
+ "Details": "Einzelheiten",
+ "Probable cause": "Wahrscheinliche Ursache",
+ "No more information": "Keine weiteren Informationen",
+ "Full details": "Alle Einzelheiten",
+ "Full stack trace": "Vollständiger Stack-Trace",
+ "No assets found - use assets to better organize resources!": "Keine Assets
gefunden - verwenden Sie Assets, um Ressourcen besser zu organisieren!",
+ "Manage assets": "Assets verwalten",
+ "Asset Browser": "Asset-Browser",
+ "Browse assets": "Assets durchsuchen",
+ "Filter assets": "Assets filtern",
+ "Reset filters": "Filter zurücksetzen",
+ "Sites": "Standorte",
+ "All": "Alle",
+ "None": "Keine",
+ "Labels": "Labels",
+ "Quick Selection": "Schnellauswahl",
+ "Custom": "Benutzerdefiniert",
+ "Maximum of ${this.maxDayRange} days can be displayed. Please select a
smaller range.": "Es können maximal ${this.maxDayRange} Tage angezeigt werden.
Bitte wählen Sie einen kleineren Bereich.",
+ "Modify time range": "Zeitspanne ändern",
+ "Last 15 min": "Letzten 15 Minuten",
+ "Last 1 hour": "Letzte Stunde",
+ "Last 1 day": "Letzter Tag",
+ "Last 1 week": "Letzte Woche",
+ "Last 1 month": "Letzter Monat",
+ "Last 1 year": "Letztes Jahr",
+ "Current day": "Aktueller Tag",
+ "Current hour": "Aktuelle Stunde",
+ "Current week": "Aktuelle Woche",
+ "Current month": "Aktueller Monat",
+ "Current year": "Aktuelles Jahr",
+ "1 sec": "1 Sekunde",
+ "2 sec": "2 Sekunden",
+ "5 sec": "5 Sekunden",
+ "10 sec": "10 Sekunden",
+ "30 sec": "30 Sekunden",
+ "1 min": "1 Minute",
+ "5 min": "5 Minuten",
+ "30 min": "30 Minuten",
+ "Error Details": "Fehler-Details",
+ "Resources": "Ressourcen",
+ "All {{allResourcesAlias}}": "Alle {{allResourcesAlias}}"
}
diff --git a/ui/deployment/i18n/en.json b/ui/deployment/i18n/en.json
index 35053e32ed..d61d859016 100644
--- a/ui/deployment/i18n/en.json
+++ b/ui/deployment/i18n/en.json
@@ -100,6 +100,8 @@
"Minimum value": null,
"Maximum value": null,
"Show values as labels": null,
+ "Visual Map Min": null,
+ "Visual Map Max": null,
"Min": null,
"Max": null,
"X": null,
@@ -201,6 +203,86 @@
"Unit": null,
"Background": null,
"Text": null,
+ "Dashboard title": null,
+ "Title must not be empty": null,
+ "Description": null,
+ "Default view mode": null,
+ "Grid view": null,
+ "Slide view": null,
+ "Time settings": null,
+ "Use global time settings instead of chart time settings": null,
+ "This dashboard is empty and doesn't contain any charts.": null,
+ "View mode": null,
+ "Grid": null,
+ "Slides": null,
+ "Edit dashboard": null,
+ "Show time range selector": null,
+ "Hide time range selector": null,
+ "Delete dashboard": null,
+ "Configure dashboard": null,
+ "No charts found - create a new chart first to add it to this dashboard.":
null,
+ "Create chart": null,
+ "New dashboard": null,
+ "Dashboards": null,
+ "Show dashboard": null,
+ "Dashboard settings": null,
+ "ID": null,
+ "Output Topics": null,
+ "Copy": null,
+ "Input Topics": null,
+ "Selected Nodes": null,
+ "Node Details": null,
+ "Clear selection & reload": null,
+ "Reload": null,
+ "Reloading nodes": null,
+ "Font Style": null,
+ "Tree": null,
+ "Browse": null,
+ "Add node": null,
+ "Remove node": null,
+ "Show details": null,
+ "Add all direct children": null,
+ "(waiting for input)": null,
+ "Select none": null,
+ "Possible placeholders:": null,
+ "Choose existing file": null,
+ "Upload new file": null,
+ "Select file": null,
+ "Clear": null,
+ "Upload": null,
+ "Add": null,
+ "Import from file": null,
+ "File": null,
+ "Reset code template": null,
+ "Clean code": null,
+ "Basics": null,
+ "Template name": null,
+ "Template description": null,
+ "Configuration": null,
+ "(dynamic options cannot be saved and are hidden)": null,
+ "Existing templates": null,
+ "(no templates available)": null,
+ "Store as template": null,
+ "Here is a preview of your data:": null,
+ "Runtime Name": null,
+ "Field Name": null,
+ "no data": null,
+ "Gathering data for live preview...": null,
+ "Preview is currently unavailable.": null,
+ "(no documentation available)": null,
+ "You can perform a forced stop, which will stop and reset the pipeline
status.": null,
+ "Show Details": null,
+ "Hide Details": null,
+ "Force stop": null,
+ "Owner": null,
+ "Public Element": null,
+ "Users": null,
+ "Authorized Users": null,
+ "User selection": null,
+ "Groups": null,
+ "Authorized Groups": null,
+ "Group selection": null,
+ "(no log messages available)": null,
"success": null,
"error": null,
"waiting": null,
@@ -234,6 +316,28 @@
"Hour": null,
"Day": null,
"Week": null,
+ "Update all changes to dashboard charts or discard current changes.": null,
+ "Off": null,
+ "Are you sure you want to delete this dashboard?": null,
+ "This action cannot be undone!": null,
+ "Topics": null,
+ "Code": null,
+ "Loading": null,
+ "# Provide OPC UA Node IDs below, one per line.\n# Format:
ns=<namespace>;s=<node_id> (e.g., ns=3;s=SampleNodeId)\n": null,
+ "The value should be a number": null,
+ "Please enter a valid URL": null,
+ "Please enter a valid String": null,
+ "Please enter a value": null,
+ "This is a test": null,
+ "Error in line {{rowNumber}}. Value for \"{{property}}\" is not supported.":
"Error in line {{rowNumber}}. Value for \"{{property}}\" is not supported.",
+ "Error in line {{rowNumber}}. Value for \"{{property}}\" is not set.":
"Error in line {{rowNumber}}. Value for \"{{property}}\" is not set.",
+ "Timestamp": null,
+ "Number": null,
+ "Boolean": null,
+ "List": null,
+ "Nested": null,
+ "TOPICS": null,
+ "CODE": null,
"Select Data": null,
"Previous": null,
"Download": null,
@@ -256,5 +360,51 @@
"Behaviour in case of missing values": null,
"Ignore lines with missing value": null,
"Leave entry empty": null,
- "Download successful": null
+ "Download successful": null,
+ "Refresh": null,
+ "Apply": null,
+ "Refresh interval": null,
+ "No entries available.": null,
+ "Error": null,
+ "Details": null,
+ "Probable cause": null,
+ "No more information": null,
+ "Full details": null,
+ "Full stack trace": null,
+ "No assets found - use assets to better organize resources!": null,
+ "Manage assets": null,
+ "Asset Browser": null,
+ "Browse assets": null,
+ "Filter assets": null,
+ "Reset filters": null,
+ "Sites": null,
+ "All": null,
+ "None": null,
+ "Labels": null,
+ "Quick Selection": null,
+ "Custom": null,
+ "Maximum of ${this.maxDayRange} days can be displayed. Please select a
smaller range.": "Maximum of ${this.maxDayRange} days can be displayed. Please
select a smaller range.",
+ "Modify time range": null,
+ "Last 15 min": null,
+ "Last 1 hour": null,
+ "Last 1 day": null,
+ "Last 1 week": null,
+ "Last 1 month": null,
+ "Last 1 year": null,
+ "Current day": null,
+ "Current hour": null,
+ "Current week": null,
+ "Current month": null,
+ "Current year": null,
+ "1 sec": null,
+ "2 sec": null,
+ "5 sec": null,
+ "10 sec": null,
+ "30 sec": null,
+ "1 min": null,
+ "5 min": null,
+ "30 min": null,
+ "Error Details": null,
+ "Resources": null,
+ "All {{allResourcesAlias}}": "All {{allResourcesAlias}}"
}
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-hierarchy/asset-browser-hierarchy.component.ts
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-hierarchy/asset-browser-hierarchy.component.ts
index 5c84596a1f..55e1b5ecb0 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-hierarchy/asset-browser-hierarchy.component.ts
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-hierarchy/asset-browser-hierarchy.component.ts
@@ -24,11 +24,13 @@ import {
Output,
SimpleChanges,
ViewChild,
+ inject,
} from '@angular/core';
import { AssetBrowserData } from '../asset-browser.model';
import { NestedTreeControl } from '@angular/cdk/tree';
import { SpAsset } from '@streampipes/platform-services';
import { MatTreeNestedDataSource } from '@angular/material/tree';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'sp-asset-browser-hierarchy',
@@ -36,11 +38,13 @@ import { MatTreeNestedDataSource } from
'@angular/material/tree';
styleUrls: ['./asset-browser-hierarchy.component.scss'],
})
export class AssetBrowserHierarchyComponent implements OnChanges {
+ translateService = inject(TranslateService);
+
@Input()
assetBrowserData: AssetBrowserData;
@Input()
- allResourcesAlias = 'Resources';
+ allResourcesAlias = this.translateService.instant('Resources');
@Input()
assetSelectionMode = false;
@@ -91,7 +95,10 @@ export class AssetBrowserHierarchyComponent implements
OnChanges {
makeRootNode(): SpAsset {
return {
assetId: '_root',
- assetName: `All ${this.allResourcesAlias}`,
+ assetName: this.translateService.instant(
+ 'All {{allResourcesAlias}}',
+ { allResourcesAlias: this.allResourcesAlias },
+ ),
assetDescription: '',
assetLinks: [],
assets: this.assetBrowserData.assets,
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-labels/asset-browser-filter-labels.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-labels/asset-browser-filter-labels.component.html
index 8b734d48dd..547d81434d 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-labels/asset-browser-filter-labels.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-labels/asset-browser-filter-labels.component.html
@@ -41,7 +41,7 @@
>
<i class="material-icons fs-icon">filter_alt</i>
</div>
- <span>Labels</span>
+ <span>{{ 'Labels' | translate }}</span>
</div>
</div>
<div
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-outer/asset-browser-filter-outer.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-outer/asset-browser-filter-outer.component.html
index d7e6848f49..db2ac84216 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-outer/asset-browser-filter-outer.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-outer/asset-browser-filter-outer.component.html
@@ -56,7 +56,7 @@
class="small-button btn-margin"
(click)="selectAllEmitter.emit()"
>
- All
+ {{ 'All' | translate }}
</button>
<button
mat-button
@@ -64,7 +64,7 @@
class="small-button mat-basic btn-margin"
(click)="deselectAllEmitter.emit()"
>
- None
+ {{ 'None' | translate }}
</button>
</div>
</div>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-sites/asset-browser-filter-sites.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-sites/asset-browser-filter-sites.component.html
index ca4f1eefa1..f126a2370d 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-sites/asset-browser-filter-sites.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-sites/asset-browser-filter-sites.component.html
@@ -19,7 +19,7 @@
<sp-asset-browser-filter-outer
[selectedItems]="activeFilters.selectedSites"
[allItems]="sites"
- title="Sites"
+ [title]="'Sites' | translate"
(selectAllEmitter)="selectAll()"
(deselectAllEmitter)="selectNone()"
>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-type/asset-browser-filter-type.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-type/asset-browser-filter-type.component.html
index fd0ee9ebf0..b2d81fad89 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-type/asset-browser-filter-type.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter-type/asset-browser-filter-type.component.html
@@ -19,7 +19,7 @@
<sp-asset-browser-filter-outer
[selectedItems]="activeFilters.selectedTypes"
[allItems]="allAssetTypes"
- title="Type"
+ [title]="'Type' | translate"
(selectAllEmitter)="selectAll()"
(deselectAllEmitter)="selectNone()"
>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter.component.html
index fa78b95f08..c8a458bfd3 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-filter/asset-browser-filter.component.html
@@ -41,10 +41,10 @@
class="mat-basic"
(click)="resetFilters()"
>
- Reset filters
+ {{ 'Reset filters' | translate }}
</button>
<button mat-raised-button color="accent" (click)="applyFilters()">
- Apply
+ {{ 'Apply' | translate }}
</button>
</div>
</div>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-toolbar.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-toolbar.component.html
index dce9bb6e8d..1adfaf6fb4 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-toolbar.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser-toolbar/asset-browser-toolbar.component.html
@@ -17,7 +17,7 @@
-->
<div fxFlex fxLayoutAlign="start center" *ngIf="expanded">
- <h4 class="ml-5">Browse assets</h4>
+ <h4 class="ml-5">{{ 'Browse assets' | translate }}</h4>
</div>
<div fxLayoutAlign="end center">
<button
@@ -26,7 +26,7 @@
color="accent"
[matMenuTriggerFor]="menu"
#menuTrigger="matMenuTrigger"
- matTooltip="Filter assets"
+ [matTooltip]="'Filter assets' | translate"
(menuClosed)="menuTrigger.closeMenu()"
>
<mat-icon>filter_alt</mat-icon>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.html
index b84999e3c6..0a02d5c33e 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.html
@@ -50,17 +50,17 @@
fxLayout="column"
fxFlex="100"
>
- <span class="asset-creation-hint"
- >No assets found - use assets to better organize
- resources!</span
- >
+ <span class="asset-creation-hint">{{
+ 'No assets found - use assets to better organize
resources!'
+ | translate
+ }}</span>
<button
mat-button
color="accent"
class="mt-10"
(click)="navigateToAssetManagement()"
>
- Manage assets
+ {{ 'Manage assets' | translate }}
</button>
</div>
}
@@ -70,7 +70,7 @@
class="asset-hierarchy asset-browser-text"
fxLayoutAlign="center center"
>
- Asset Browser
+ {{ 'Asset Browser' | translate }}
</div>
}
</sp-basic-view>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.ts
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.ts
index f9c027d136..bded79b834 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.ts
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/asset-browser/asset-browser.component.ts
@@ -23,6 +23,7 @@ import {
OnDestroy,
OnInit,
Output,
+ inject,
} from '@angular/core';
import { SpAssetBrowserService } from './asset-browser.service';
import { AssetBrowserData } from './asset-browser.model';
@@ -30,6 +31,7 @@ import { Subscription } from 'rxjs';
import { SpAsset } from '@streampipes/platform-services';
import { Router } from '@angular/router';
import { CurrentUserService } from '../../services/current-user.service';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'sp-asset-browser',
@@ -37,11 +39,13 @@ import { CurrentUserService } from
'../../services/current-user.service';
styleUrls: ['./asset-browser.component.scss'],
})
export class AssetBrowserComponent implements OnInit, OnDestroy {
+ translateService = inject(TranslateService);
+
@Input()
showResources = false;
@Input()
- allResourcesAlias = 'Resources';
+ allResourcesAlias = this.translateService.instant('Resources');
@Input()
browserWidth = 20;
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/basic-nav-tabs/basic-nav-tabs.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/basic-nav-tabs/basic-nav-tabs.component.html
index c613d3cda3..90fb47f37e 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/basic-nav-tabs/basic-nav-tabs.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/basic-nav-tabs/basic-nav-tabs.component.html
@@ -28,7 +28,7 @@
<button
mat-icon-button
color="accent"
- matTooltip="Back"
+ [matTooltip]="'Back' | translate"
(click)="navigateBack()"
class="edit-menu-btn"
data-cy="save-data-explorer-go-back-to-overview"
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/basic-view/basic-view.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/basic-view/basic-view.component.html
index 59a322427e..84264219ee 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/basic-view/basic-view.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/basic-view/basic-view.component.html
@@ -32,7 +32,7 @@
<button
mat-icon-button
color="accent"
- matTooltip="Back"
+ [matTooltip]="'Back' | translate"
(click)="navigateBack()"
class="edit-menu-btn"
data-cy="save-data-explorer-go-back-to-overview"
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/exception-details-dialog/exception-details-dialog.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/exception-details-dialog/exception-details-dialog.component.html
index fcee105bd6..3f159261b6 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/exception-details-dialog/exception-details-dialog.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/exception-details-dialog/exception-details-dialog.component.html
@@ -29,7 +29,7 @@
</button>
}
<button mat-raised-button class="mat-basic" (click)="close()">
- Close
+ {{ 'Close' | translate }}
</button>
</div>
</div>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/exception-details/exception-details.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/exception-details/exception-details.component.html
index 03721063a2..8dfae6d560 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/exception-details/exception-details.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/exception-details/exception-details.component.html
@@ -32,10 +32,12 @@
>
<span class="color-warn">{{ title }}</span>
</div>
- <div class="error-details-title">Probable cause</div>
+ <div class="error-details-title">{{ 'Probable cause' | translate }}</div>
<div
class="log-message"
- [innerText]="message.cause || 'No more information'"
+ [innerText]="
+ message.cause ? message.cause : ('No more information' | translate)
+ "
></div>
<div class="mt-10">
<button
@@ -44,11 +46,13 @@
color="accent"
(click)="showDetails = !showDetails"
>
- Full details
+ {{ 'Full details' | translate }}
</button>
</div>
<div fxFlex="100" fxLayout="column" *ngIf="showDetails" class="mt-10">
- <div class="error-details-title">Full stack trace</div>
+ <div class="error-details-title">
+ {{ 'Full stack trace' | translate }}
+ </div>
<div class="log-message">
<div [innerText]="message.fullStackTrace"></div>
</div>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/sp-exception-message.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/sp-exception-message.component.html
index 2efd80acc1..9332b7c7c4 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/sp-exception-message.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/sp-exception-message.component.html
@@ -36,7 +36,11 @@
{{ messageTimestamp | date: 'short' }}
</h5>
<h5 data-cy="exception-message-title" kfxFlex>
- {{ message.title || 'Error' }}
+ {{
+ message.title
+ ? message.title
+ : ('Error' | translate)
+ }}
</h5>
</div>
<span fxFlex></span>
@@ -46,7 +50,9 @@
color="accent"
(click)="openDetailsDialog()"
>
- <i class="material-icons">visibility</i> Details
+ <i class="material-icons">visibility</i> {{
+ 'Details' | translate
+ }}
</button>
</div>
</div>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/sp-exception-message.component.ts
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/sp-exception-message.component.ts
index 59860d99a1..7c8b783a97 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/sp-exception-message.component.ts
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-exception-message/sp-exception-message.component.ts
@@ -16,11 +16,12 @@
*
*/
-import { Component, Input } from '@angular/core';
+import { Component, Input, inject } from '@angular/core';
import { SpLogMessage } from '@streampipes/platform-services';
import { DialogService } from '../../dialog/base-dialog/base-dialog.service';
import { PanelType } from '../../dialog/base-dialog/base-dialog.model';
import { SpExceptionDetailsDialogComponent } from
'./exception-details-dialog/exception-details-dialog.component';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'sp-exception-message',
@@ -28,6 +29,8 @@ import { SpExceptionDetailsDialogComponent } from
'./exception-details-dialog/ex
styleUrls: ['./sp-exception-message.component.scss'],
})
export class SpExceptionMessageComponent {
+ translateService = inject(TranslateService);
+
@Input()
level = 'error';
@@ -46,7 +49,7 @@ export class SpExceptionMessageComponent {
this.dialogService.open(SpExceptionDetailsDialogComponent, {
panelType: PanelType.STANDARD_PANEL,
width: '80vw',
- title: 'Error Details',
+ title: this.translateService.instant('Error Details'),
data: {
message: this.message,
},
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/sp-table/sp-table.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-table/sp-table.component.html
index 52024357ff..c9134d4a7f 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/sp-table/sp-table.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/sp-table/sp-table.component.html
@@ -29,7 +29,7 @@
class="mat-cell"
[colSpan]="columns.length"
>
- No entries available.
+ {{ 'No entries available.' | translate }}
</td>
</tr>
</table>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/time-selector/refresh-interval-settings/refresh-interval-settings.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/time-selector/refresh-interval-settings/refresh-interval-settings.component.html
index 84f316bcda..f6fd561558 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/time-selector/refresh-interval-settings/refresh-interval-settings.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/time-selector/refresh-interval-settings/refresh-interval-settings.component.html
@@ -21,8 +21,8 @@
mat-button
color="accent"
[matMenuTriggerFor]="menu"
- aria-label="Refresh interval"
- matTooltip="Refresh interval"
+ [attr.aria-label]="'Refresh interval' | translate"
+ [matTooltip]="'Refresh interval' | translate"
[disabled]="!liveRefreshEnabled"
>
<mat-icon>autorenew</mat-icon>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/time-selector/time-range-selector.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/time-selector/time-range-selector.component.html
index 2cee965d7f..8fe2a3e558 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/time-selector/time-range-selector.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/time-selector/time-range-selector.component.html
@@ -79,7 +79,7 @@
<div fxLayoutAlign="end center">
<button
mat-icon-button
- matTooltip="Refresh"
+ [matTooltip]="'Refresh' | translate"
color="accent"
(click)="updateTimeSettingsAndReload()"
>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/components/time-selector/time-selector-menu/custom-time-range-selection/custom-time-range-selection.component.html
b/ui/projects/streampipes/shared-ui/src/lib/components/time-selector/time-selector-menu/custom-time-range-selection/custom-time-range-selection.component.html
index 3bf948975e..01564fb728 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/components/time-selector/time-selector-menu/custom-time-range-selection/custom-time-range-selection.component.html
+++
b/ui/projects/streampipes/shared-ui/src/lib/components/time-selector/time-selector-menu/custom-time-range-selection/custom-time-range-selection.component.html
@@ -98,7 +98,7 @@
[disabled]="!dateSelectionComplete"
*ngIf="enableTimePicker"
>
- Apply
+ {{ 'Apply' | translate }}
</button>
</div>
</div>
diff --git
a/ui/projects/streampipes/shared-ui/src/lib/services/time-selection.service.ts
b/ui/projects/streampipes/shared-ui/src/lib/services/time-selection.service.ts
index e132bfb83e..725f202520 100644
---
a/ui/projects/streampipes/shared-ui/src/lib/services/time-selection.service.ts
+++
b/ui/projects/streampipes/shared-ui/src/lib/services/time-selection.service.ts
@@ -16,7 +16,7 @@
*
*/
-import { Injectable } from '@angular/core';
+import { Injectable, inject } from '@angular/core';
import { Subject } from 'rxjs';
import {
DashboardLiveSettings,
@@ -40,9 +40,12 @@ import {
subYears,
} from 'date-fns';
import { TimeSelectorLabel } from
'../components/time-selector/time-selector.model';
+import { TranslateService } from '@ngx-translate/core';
@Injectable({ providedIn: 'root' })
export class TimeSelectionService {
+ translateService = inject(TranslateService);
+
legacyMappings: Record<number, string> = {
15: TimeSelectionConstants.LAST_15_MINUTES,
60: TimeSelectionConstants.LAST_HOUR,
@@ -53,86 +56,88 @@ export class TimeSelectionService {
};
defaultLabels: TimeSelectorLabel = {
- quickSelectionLabel: 'Quick Selection',
- customLabel: 'Custom',
- maxDayRangeErrorLabel:
+ quickSelectionLabel: this.translateService.instant('Quick Selection'),
+ customLabel: this.translateService.instant('Custom'),
+ maxDayRangeErrorLabel: this.translateService.instant(
'Maximum of ${this.maxDayRange} days can be displayed. Please
select a smaller range.',
- timeRangeSelectorTooltip: 'Modify time range',
+ ),
+ timeRangeSelectorTooltip:
+ this.translateService.instant('Modify time range'),
};
defaultQuickTimeSelections: QuickTimeSelection[] = [
{
- label: 'Last 15 min',
+ label: this.translateService.instant('Last 15 min'),
timeSelectionId: TimeSelectionConstants.LAST_15_MINUTES,
startTime: now => subMinutes(now, 15),
endTime: now => now,
supportsLiveRefresh: true,
},
{
- label: 'Last 1 hour',
+ label: this.translateService.instant('Last 1 hour'),
timeSelectionId: TimeSelectionConstants.LAST_HOUR,
startTime: now => subHours(now, 1),
endTime: now => now,
supportsLiveRefresh: true,
},
{
- label: 'Last 1 day',
+ label: this.translateService.instant('Last 1 day'),
timeSelectionId: TimeSelectionConstants.LAST_DAY,
startTime: now => subDays(now, 1),
endTime: now => now,
supportsLiveRefresh: true,
},
{
- label: 'Last 1 week',
+ label: this.translateService.instant('Last 1 week'),
timeSelectionId: TimeSelectionConstants.LAST_WEEK,
startTime: now => subWeeks(now, 1),
endTime: now => now,
supportsLiveRefresh: true,
},
{
- label: 'Last 1 month',
+ label: this.translateService.instant('Last 1 month'),
timeSelectionId: TimeSelectionConstants.LAST_MONTH,
startTime: now => subMonths(now, 1),
endTime: now => now,
supportsLiveRefresh: true,
},
{
- label: 'Last 1 year',
+ label: this.translateService.instant('Last 1 year'),
timeSelectionId: TimeSelectionConstants.LAST_YEAR,
startTime: now => subYears(now, 1),
endTime: now => now,
supportsLiveRefresh: true,
},
{
- label: 'Current day',
+ label: this.translateService.instant('Current day'),
timeSelectionId: TimeSelectionConstants.CURRENT_DAY,
startTime: now => startOfDay(now),
endTime: now => now,
supportsLiveRefresh: true,
},
{
- label: 'Current hour',
+ label: this.translateService.instant('Current hour'),
timeSelectionId: TimeSelectionConstants.CURRENT_HOUR,
startTime: now => startOfHour(now),
endTime: now => now,
supportsLiveRefresh: true,
},
{
- label: 'Current week',
+ label: this.translateService.instant('Current week'),
timeSelectionId: TimeSelectionConstants.CURRENT_WEEK,
startTime: now => startOfWeek(now),
endTime: now => now,
supportsLiveRefresh: true,
},
{
- label: 'Current month',
+ label: this.translateService.instant('Current month'),
timeSelectionId: TimeSelectionConstants.CURRENT_MONTH,
startTime: now => startOfMonth(now),
endTime: now => now,
supportsLiveRefresh: true,
},
{
- label: 'Current year',
+ label: this.translateService.instant('Current year'),
timeSelectionId: TimeSelectionConstants.CURRENT_YEAR,
startTime: now => startOfYear(now),
endTime: now => now,
@@ -142,46 +147,46 @@ export class TimeSelectionService {
defaultAvailableLiveSettingsOptions: DashboardLiveSettings[] = [
{
- label: 'Off',
+ label: this.translateService.instant('Off'),
refreshModeActive: false,
},
{
- label: '1 sec',
+ label: this.translateService.instant('1 sec'),
refreshModeActive: true,
refreshIntervalInSeconds: 1,
},
{
- label: '2 sec',
+ label: this.translateService.instant('2 sec'),
refreshModeActive: true,
refreshIntervalInSeconds: 2,
},
{
- label: '5 sec',
+ label: this.translateService.instant('5 sec'),
refreshModeActive: true,
refreshIntervalInSeconds: 5,
},
{
- label: '10 sec',
+ label: this.translateService.instant('10 sec'),
refreshModeActive: true,
refreshIntervalInSeconds: 10,
},
{
- label: '30 sec',
+ label: this.translateService.instant('30 sec'),
refreshModeActive: true,
refreshIntervalInSeconds: 30,
},
{
- label: '1 min',
+ label: this.translateService.instant('1 min'),
refreshModeActive: true,
refreshIntervalInSeconds: 60,
},
{
- label: '5 min',
+ label: this.translateService.instant('5 min'),
refreshModeActive: true,
refreshIntervalInSeconds: 300,
},
{
- label: '30 min',
+ label: this.translateService.instant('30 min'),
refreshModeActive: true,
refreshIntervalInSeconds: 60 * 30,
},
diff --git
a/ui/src/app/core-ui/configuration-code-panel/configuration-code-panel.component.html
b/ui/src/app/core-ui/configuration-code-panel/configuration-code-panel.component.html
index 7e232c3089..ace93cd333 100644
---
a/ui/src/app/core-ui/configuration-code-panel/configuration-code-panel.component.html
+++
b/ui/src/app/core-ui/configuration-code-panel/configuration-code-panel.component.html
@@ -27,7 +27,7 @@
<button
mat-icon-button
[cdkCopyToClipboard]="currentConfiguration"
- matTooltip="Copy"
+ [matTooltip]="'Copy' | translate"
>
<mat-icon>content_copy</mat-icon>
</button>
@@ -46,7 +46,7 @@
<button
mat-icon-button
[cdkCopyToClipboard]="currentConfiguration"
- matTooltip="Copy"
+ [matTooltip]="'Copy' | translate"
>
<mat-icon>content_copy</mat-icon>
</button>
diff --git a/ui/src/app/core-ui/core-ui.module.ts
b/ui/src/app/core-ui/core-ui.module.ts
index bc883c7620..24f4519fb8 100644
--- a/ui/src/app/core-ui/core-ui.module.ts
+++ b/ui/src/app/core-ui/core-ui.module.ts
@@ -113,6 +113,7 @@ import { ConfigurationCodePanelComponent } from
'./configuration-code-panel/conf
import { JsonPrettyPrintPipe } from './pipes/json-pretty-print.pipe';
import { YamlPrettyPrintPipe } from './pipes/yaml-pretty-print.pipe';
import { TopicsComponent } from './topics/topics.component';
+import { TranslateModule } from '@ngx-translate/core';
@NgModule({
imports: [
@@ -162,6 +163,7 @@ import { TopicsComponent } from './topics/topics.component';
QuillModule.forRoot(),
MatTreeModule,
MarkdownModule.forRoot(),
+ TranslateModule.forChild(),
LeafletModule,
],
declarations: [
diff --git a/ui/src/app/core-ui/help/help.component.html
b/ui/src/app/core-ui/help/help.component.html
index fcdfbe7332..5c41bdbbb4 100644
--- a/ui/src/app/core-ui/help/help.component.html
+++ b/ui/src/app/core-ui/help/help.component.html
@@ -62,7 +62,7 @@
class="mat-basic"
(click)="close()"
>
- Close
+ {{ 'Close' | translate }}
</button>
</div>
</div>
diff --git a/ui/src/app/core-ui/help/help.component.ts
b/ui/src/app/core-ui/help/help.component.ts
index fcfc5b8d2d..e918301fdc 100644
--- a/ui/src/app/core-ui/help/help.component.ts
+++ b/ui/src/app/core-ui/help/help.component.ts
@@ -16,10 +16,11 @@
*
*/
-import { Component, Input, OnInit } from '@angular/core';
+import { Component, Input, OnInit, inject } from '@angular/core';
import { SpDataStream } from '@streampipes/platform-services';
import { DialogRef } from '@streampipes/shared-ui';
import { PipelineElementUnion } from '../../editor/model/editor.model';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'sp-pipeline-element-help',
@@ -29,7 +30,13 @@ import { PipelineElementUnion } from
'../../editor/model/editor.model';
export class HelpComponent implements OnInit {
selectedTabIndex = 0;
- availableTabs = ['Values', 'Documentation'];
+ translateService = inject(TranslateService);
+
+ availableTabs = [
+ this.translateService.instant('TOPICS'),
+ this.translateService.instant('CODE'),
+ ];
+
tabs: string[] = [];
@Input()
diff --git
a/ui/src/app/core-ui/loading-indicator/loading-indicator.component.ts
b/ui/src/app/core-ui/loading-indicator/loading-indicator.component.ts
index 1378cf7811..d3c2ebb941 100644
--- a/ui/src/app/core-ui/loading-indicator/loading-indicator.component.ts
+++ b/ui/src/app/core-ui/loading-indicator/loading-indicator.component.ts
@@ -16,7 +16,8 @@
*
*/
-import { Component, Input } from '@angular/core';
+import { Component, Input, inject } from '@angular/core';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'sp-loading-indicator',
@@ -24,6 +25,8 @@ import { Component, Input } from '@angular/core';
styleUrls: ['./loading-indicator.component.scss'],
})
export class LoadingIndicatorComponent {
+ translateService = inject(TranslateService);
+
@Input()
- message = 'Loading';
+ message = this.translateService.instant('Loading');
}
diff --git
a/ui/src/app/core-ui/monitoring/simple-logs/simple-logs.component.html
b/ui/src/app/core-ui/monitoring/simple-logs/simple-logs.component.html
index abc33614c9..6963eb8c4b 100644
--- a/ui/src/app/core-ui/monitoring/simple-logs/simple-logs.component.html
+++ b/ui/src/app/core-ui/monitoring/simple-logs/simple-logs.component.html
@@ -26,7 +26,9 @@
fxLayoutAlign="center center"
*ngIf="!logs || logs.length === 0"
>
- <h5 class="text-center">(no log messages available)</h5>
+ <h5 class="text-center">
+ {{ '(no log messages available)' | translate }}
+ </h5>
</div>
<div fxFlex="100" fxLayout="column" *ngIf="logs && logs.length > 0">
<div *ngFor="let logEntry of logs">
diff --git
a/ui/src/app/core-ui/object-permission-dialog/object-permission-dialog.component.html
b/ui/src/app/core-ui/object-permission-dialog/object-permission-dialog.component.html
index ba806e1b7b..b71686330d 100644
---
a/ui/src/app/core-ui/object-permission-dialog/object-permission-dialog.component.html
+++
b/ui/src/app/core-ui/object-permission-dialog/object-permission-dialog.component.html
@@ -22,9 +22,11 @@
<h4>{{ headerTitle }}</h4>
<form [formGroup]="parentForm" fxFlex="100" fxLayout="column">
<div class="general-options-panel" fxLayout="column">
- <span class="general-options-header">Basics</span>
+ <span class="general-options-header">{{
+ 'Basics' | translate
+ }}</span>
<mat-form-field color="accent">
- <mat-label>Owner</mat-label>
+ <mat-label>{{ 'Owner' | translate }}</mat-label>
<mat-select formControlName="owner" fxFlex required>
<mat-option
*ngFor="let user of allUsers"
@@ -37,7 +39,7 @@
data-cy="permission-public-element"
formControlName="publicElement"
>
- Public Element
+ {{ 'Public Element' | translate }}
</mat-checkbox>
</div>
<div
@@ -45,10 +47,17 @@
class="general-options-panel"
*ngIf="!permission.publicElement"
>
- <span class="general-options-header">Users</span>
+ <span class="general-options-header">{{
+ 'Users' | translate
+ }}</span>
<mat-form-field color="accent">
- <mat-label>Authorized Users</mat-label>
- <mat-chip-grid #chipList aria-label="User selection">
+ <mat-label>{{
+ 'Authorized Users' | translate
+ }}</mat-label>
+ <mat-chip-grid
+ #chipList
+ [attr.aria-label]="'User selection' | translate"
+ >
<mat-chip-row
*ngFor="let user of grantedUserAuthorities"
selectable="true"
@@ -61,7 +70,7 @@
</button>
</mat-chip-row>
<input
- placeholder="Add"
+ [placeholder]="'Add' | translate"
#userInput
[formControl]="userCtrl"
[matAutocomplete]="auto"
@@ -92,10 +101,17 @@
class="general-options-panel"
*ngIf="!permission.publicElement"
>
- <span class="general-options-header">Groups</span>
+ <span class="general-options-header">{{
+ 'Groups' | translate
+ }}</span>
<mat-form-field color="accent">
- <mat-label>Authorized Groups</mat-label>
- <mat-chip-grid #chipList aria-label="Group selection">
+ <mat-label>{{
+ 'Authorized Groups' | translate
+ }}</mat-label>
+ <mat-chip-grid
+ #chipList
+ [attr.aria-label]="'Group selection' | translate"
+ >
<mat-chip-row
*ngFor="let group of grantedGroupAuthorities"
selectable="true"
@@ -108,7 +124,7 @@
</button>
</mat-chip-row>
<input
- placeholder="Add"
+ [placeholder]="'Add' | translate"
#groupInput
[formControl]="groupCtrl"
[matAutocomplete]="auto"
@@ -147,7 +163,8 @@
[disabled]="!parentForm.valid"
data-cy="sp-manage-permissions-save"
>
- <i class="material-icons">save</i><span> Save</span>
+ <i class="material-icons">save</i
+ ><span> {{ 'Save' | translate }}</span>
</button>
<button
mat-button
@@ -155,7 +172,7 @@
class="mat-basic"
(click)="close(false)"
>
- Cancel
+ {{ 'Cancel' | translate }}
</button>
</div>
</div>
diff --git
a/ui/src/app/core-ui/pipeline-element-documentation/pipeline-element-documentation.component.html
b/ui/src/app/core-ui/pipeline-element-documentation/pipeline-element-documentation.component.html
index 59a122dc28..ceee5313d8 100644
---
a/ui/src/app/core-ui/pipeline-element-documentation/pipeline-element-documentation.component.html
+++
b/ui/src/app/core-ui/pipeline-element-documentation/pipeline-element-documentation.component.html
@@ -23,5 +23,5 @@
data-cy="pipeline-element-documentation-markdown"
></markdown>
<p *ngIf="error" [ngClass]="useStyling ? 'note' : ''">
- (no documentation available)
+ {{ '(no documentation available)' | translate }}
</p>
diff --git
a/ui/src/app/core-ui/pipeline-element-runtime-info/live-preview-error/live-preview-error.component.html
b/ui/src/app/core-ui/pipeline-element-runtime-info/live-preview-error/live-preview-error.component.html
index 81e1a2d160..b373943003 100644
---
a/ui/src/app/core-ui/pipeline-element-runtime-info/live-preview-error/live-preview-error.component.html
+++
b/ui/src/app/core-ui/pipeline-element-runtime-info/live-preview-error/live-preview-error.component.html
@@ -17,5 +17,5 @@
-->
<div>
- <p>Preview is currently unavailable.</p>
+ <p>{{ 'Preview is currently unavailable.' | translate }}</p>
</div>
diff --git
a/ui/src/app/core-ui/pipeline-element-runtime-info/live-preview-loading/live-preview-loading.component.html
b/ui/src/app/core-ui/pipeline-element-runtime-info/live-preview-loading/live-preview-loading.component.html
index ddd4d82e80..379a564480 100644
---
a/ui/src/app/core-ui/pipeline-element-runtime-info/live-preview-loading/live-preview-loading.component.html
+++
b/ui/src/app/core-ui/pipeline-element-runtime-info/live-preview-loading/live-preview-loading.component.html
@@ -27,6 +27,6 @@
</mat-spinner>
</div>
<div fxLayoutAlign="center">
- <h3>Gathering data for live preview...</h3>
+ <h3>{{ 'Gathering data for live preview...' | translate }}</h3>
</div>
</div>
diff --git
a/ui/src/app/core-ui/pipeline-element-runtime-info/live-preview-table/live-preview-table.component.html
b/ui/src/app/core-ui/pipeline-element-runtime-info/live-preview-table/live-preview-table.component.html
index ceb6851ab4..836f044115 100644
---
a/ui/src/app/core-ui/pipeline-element-runtime-info/live-preview-table/live-preview-table.component.html
+++
b/ui/src/app/core-ui/pipeline-element-runtime-info/live-preview-table/live-preview-table.component.html
@@ -17,11 +17,11 @@
-->
<div data-cy="sp-connect-adapter-success-live-preview">
- <p *ngIf="showTitle">Here is a preview of your data:</p>
+ <p *ngIf="showTitle">{{ 'Here is a preview of your data:' | translate
}}</p>
<table mat-table [dataSource]="runtimeInfo">
<ng-container matColumnDef="runtimeName">
<th mat-header-cell *matHeaderCellDef>
- <strong>Runtime Name</strong>
+ <strong>{{ 'Runtime Name' | translate }}</strong>
</th>
<td mat-cell *matCellDef="let element">
<div class="runtime-name">{{ element.runtimeName }}</div>
@@ -30,7 +30,7 @@
<ng-container matColumnDef="label">
<th mat-header-cell *matHeaderCellDef>
- <strong>Field Name</strong>
+ <strong>{{ 'Field Name' | translate }}</strong>
</th>
<td mat-cell *matCellDef="let element">
{{ element.label }}
@@ -39,7 +39,7 @@
<ng-container matColumnDef="description">
<th mat-header-cell *matHeaderCellDef>
- <strong>Description</strong>
+ <strong>{{ 'Description' | translate }}</strong>
</th>
<td mat-cell *matCellDef="let element">
{{ element.description }}
@@ -47,21 +47,25 @@
</ng-container>
<ng-container matColumnDef="runtimeType">
- <th mat-header-cell *matHeaderCellDef><strong>Type</strong></th>
+ <th mat-header-cell *matHeaderCellDef>
+ <strong>{{ 'Type' | translate }}</strong>
+ </th>
<td mat-cell *matCellDef="let element">
{{ element.runtimeType }}
</td>
</ng-container>
<ng-container matColumnDef="value">
- <th mat-header-cell *matHeaderCellDef><strong>Value</strong></th>
+ <th mat-header-cell *matHeaderCellDef>
+ <strong>{{ 'Value' | translate }}</strong>
+ </th>
<td mat-cell *matCellDef="let element" style="width: 200px">
@if (element.value === undefined) {
<div
data-cy="live-preview-table-no-data"
class="value no-data"
>
- no data
+ {{ 'no data' | translate }}
</div>
} @else {
<ng-container *ngIf="element.isImage">
diff --git
a/ui/src/app/core-ui/pipeline-element-runtime-info/pipeline-element-schema.service.ts
b/ui/src/app/core-ui/pipeline-element-runtime-info/pipeline-element-schema.service.ts
index 710143fa00..11e9824f83 100644
---
a/ui/src/app/core-ui/pipeline-element-runtime-info/pipeline-element-schema.service.ts
+++
b/ui/src/app/core-ui/pipeline-element-runtime-info/pipeline-element-schema.service.ts
@@ -16,7 +16,7 @@
*
*/
-import { Injectable } from '@angular/core';
+import { Injectable, inject } from '@angular/core';
import {
DataType,
EventPropertyList,
@@ -24,26 +24,29 @@ import {
EventPropertyUnion,
SemanticType,
} from '@streampipes/platform-services';
+import { TranslateService } from '@ngx-translate/core';
@Injectable({ providedIn: 'root' })
export class PipelineElementSchemaService {
+ translateService = inject(TranslateService);
+
getFriendlyRuntimeType(ep: EventPropertyUnion): string {
if (ep instanceof EventPropertyPrimitive) {
if (this.isTimestamp(ep)) {
- return 'Timestamp';
+ return this.translateService.instant('Timestamp');
} else if (this.isImage(ep)) {
- return 'Image';
+ return this.translateService.instant('Image');
} else if (DataType.isNumberType(ep.runtimeType)) {
- return 'Number';
+ return this.translateService.instant('Number');
} else if (DataType.isBooleanType(ep.runtimeType)) {
- return 'Boolean';
+ return this.translateService.instant('Boolean');
} else {
- return 'Text';
+ return this.translateService.instant('Text');
}
} else if (ep instanceof EventPropertyList) {
- return 'List';
+ return this.translateService.instant('List');
} else {
- return 'Nested';
+ return this.translateService.instant('Nested');
}
}
diff --git
a/ui/src/app/core-ui/pipeline-element-template-config/pipeline-element-template-config-item/pipeline-element-template-config-item.component.html
b/ui/src/app/core-ui/pipeline-element-template-config/pipeline-element-template-config-item/pipeline-element-template-config-item.component.html
index 877298dc49..2aee082769 100644
---
a/ui/src/app/core-ui/pipeline-element-template-config/pipeline-element-template-config-item/pipeline-element-template-config-item.component.html
+++
b/ui/src/app/core-ui/pipeline-element-template-config/pipeline-element-template-config-item/pipeline-element-template-config-item.component.html
@@ -23,6 +23,6 @@
name="store"
class="sp"
color="accent"
- >Store as template
+ >{{ 'Store as template' | translate }}
</mat-checkbox>
</div>
diff --git
a/ui/src/app/core-ui/pipeline-element-template-config/pipeline-element-template-config.component.html
b/ui/src/app/core-ui/pipeline-element-template-config/pipeline-element-template-config.component.html
index a6c9c8e2de..78a248d288 100644
---
a/ui/src/app/core-ui/pipeline-element-template-config/pipeline-element-template-config.component.html
+++
b/ui/src/app/core-ui/pipeline-element-template-config/pipeline-element-template-config.component.html
@@ -18,9 +18,9 @@
<div class="p-15" *ngIf="templateConfigs">
<div fxFlex="100" fxLayout="column">
- <h4>Basics</h4>
+ <h4>{{ 'Basics' | translate }}</h4>
<mat-form-field fxFlex color="accent">
- <mat-label>Template name</mat-label>
+ <mat-label>{{ 'Template name' | translate }}</mat-label>
<input
[(ngModel)]="template.templateName"
matInput
@@ -31,7 +31,7 @@
/>
</mat-form-field>
<mat-form-field fxFlex color="accent">
- <mat-label>Template description</mat-label>
+ <mat-label>{{ 'Template description' | translate }}</mat-label>
<input
[(ngModel)]="template.templateDescription"
matInput
@@ -42,10 +42,10 @@
/>
</mat-form-field>
<mat-divider class="divider"></mat-divider>
- <h4>Configuration</h4>
- <mat-hint style="margin-bottom: 10px"
- >(dynamic options cannot be saved and are hidden)</mat-hint
- >
+ <h4>{{ 'Configuration' | translate }}</h4>
+ <mat-hint style="margin-bottom: 10px">{{
+ '(dynamic options cannot be saved and are hidden)' | translate
+ }}</mat-hint>
<div
fxLayout="column"
*ngFor="
@@ -67,7 +67,7 @@
</div>
</div>
<mat-divider class="divider"></mat-divider>
- <h4>Existing templates</h4>
+ <h4>{{ 'Existing templates' | translate }}</h4>
<div
fxLayout="column"
*ngFor="let template of existingTemplates"
@@ -92,7 +92,7 @@
<mat-hint
style="margin-bottom: 10px"
*ngIf="existingTemplates.length === 0"
- >(no templates available)</mat-hint
+ >{{ '(no templates available)' | translate }}</mat-hint
>
</div>
</div>
diff --git
a/ui/src/app/core-ui/pipeline/pipeline-started-status/pipeline-started-status.component.html
b/ui/src/app/core-ui/pipeline/pipeline-started-status/pipeline-started-status.component.html
index 45e70af034..bec1e6f214 100644
---
a/ui/src/app/core-ui/pipeline/pipeline-started-status/pipeline-started-status.component.html
+++
b/ui/src/app/core-ui/pipeline/pipeline-started-status/pipeline-started-status.component.html
@@ -45,8 +45,10 @@
!forceStopDisabled
"
class="message-small"
- >You can perform a forced stop, which will stop and reset the
- pipeline status.</span
+ >{{
+ 'You can perform a forced stop, which will stop and reset the
pipeline status.'
+ | translate
+ }}</span
>
</div>
<div fxLayout="row">
@@ -56,8 +58,12 @@
class="mat-basic"
(click)="toggleStatusDetailsVisible()"
>
- <div *ngIf="!statusDetailsVisible">Show Details</div>
- <div *ngIf="statusDetailsVisible">Hide Details</div>
+ <div *ngIf="!statusDetailsVisible">
+ {{ 'Show Details' | translate }}
+ </div>
+ <div *ngIf="statusDetailsVisible">
+ {{ 'Hide Details' | translate }}
+ </div>
</button>
<button
mat-button
@@ -71,7 +77,7 @@
!forceStopDisabled
"
>
- <div>Force stop</div>
+ <div>{{ 'Force stop' | translate }}</div>
</button>
</div>
diff --git
a/ui/src/app/core-ui/static-properties/base/abstract-validated-static-property.ts
b/ui/src/app/core-ui/static-properties/base/abstract-validated-static-property.ts
index a91a606691..bd0ca05b58 100644
---
a/ui/src/app/core-ui/static-properties/base/abstract-validated-static-property.ts
+++
b/ui/src/app/core-ui/static-properties/base/abstract-validated-static-property.ts
@@ -19,7 +19,8 @@
import { StaticProperty } from '@streampipes/platform-services';
import { AbstractStaticPropertyRenderer } from './abstract-static-property';
import { UntypedFormControl, ValidatorFn } from '@angular/forms';
-import { Directive, OnDestroy } from '@angular/core';
+import { Directive, OnDestroy, inject } from '@angular/core';
+import { TranslateService } from '@ngx-translate/core';
@Directive()
export abstract class AbstractValidatedStaticPropertyRenderer<
@@ -28,7 +29,8 @@ export abstract class AbstractValidatedStaticPropertyRenderer<
extends AbstractStaticPropertyRenderer<T>
implements OnDestroy
{
- errorMessage = 'Please enter a value';
+ translateService = inject(TranslateService);
+ errorMessage = this.translateService.instant('Please enter a value');
fieldValid: boolean;
constructor() {
diff --git
a/ui/src/app/core-ui/static-properties/static-code-input/static-code-input.component.html
b/ui/src/app/core-ui/static-properties/static-code-input/static-code-input.component.html
index e7273b1026..44cdf163cc 100644
---
a/ui/src/app/core-ui/static-properties/static-code-input/static-code-input.component.html
+++
b/ui/src/app/core-ui/static-properties/static-code-input/static-code-input.component.html
@@ -26,7 +26,7 @@
(click)="resetCode()"
style="margin-right: 10px; margin-bottom: 10px"
>
- Reset code template
+ {{ 'Reset code template' | translate }}
</button>
<button
mat-button
@@ -37,7 +37,7 @@
[attr.data-cy]="'reset-code-' + fieldName"
style="margin-right: 10px; margin-bottom: 10px"
>
- Clean code
+ {{ 'Clean code' | translate }}
</button>
</div>
<div fxFlex="100" fxLayout="row">
diff --git
a/ui/src/app/core-ui/static-properties/static-collection/add-to-collection/add-to-collection.component.html
b/ui/src/app/core-ui/static-properties/static-collection/add-to-collection/add-to-collection.component.html
index 45536fd8bf..65aa7a0491 100644
---
a/ui/src/app/core-ui/static-properties/static-collection/add-to-collection/add-to-collection.component.html
+++
b/ui/src/app/core-ui/static-properties/static-collection/add-to-collection/add-to-collection.component.html
@@ -18,17 +18,17 @@
<div *ngIf="!showFileSelecion">
<button mat-button mat-flat-button (click)="add()">
<mat-icon class="icon">add</mat-icon>
- <span>Add</span>
+ <span>{{ 'Add' | translate }}</span>
</button>
<button mat-button mat-flat-button (click)="selectFileSelection()">
<mat-icon class="icon">add</mat-icon>
- <span>Import from file</span>
+ <span>{{ 'Import from file' | translate }}</span>
</button>
</div>
<div *ngIf="showFileSelecion">
<button mat-button mat-flat-button (click)="closeFileSelection()">
<mat-icon class="icon">arrow_back</mat-icon>
- <span>Back</span>
+ <span>{{ 'Back' | translate }}</span>
</button>
<div fxFlex="100" style="margin: 5px; width: 100%">
<mat-form-field
@@ -37,7 +37,7 @@
color="accent"
*ngIf="!hasError"
>
- <input matInput placeholder="File" disabled />
+ <input matInput [placeholder]="'File' | translate" disabled />
<input
#fileInput
type="file"
diff --git
a/ui/src/app/core-ui/static-properties/static-collection/add-to-collection/add-to-collection.component.ts
b/ui/src/app/core-ui/static-properties/static-collection/add-to-collection/add-to-collection.component.ts
index b54ce926fd..41cafa5d8a 100644
---
a/ui/src/app/core-ui/static-properties/static-collection/add-to-collection/add-to-collection.component.ts
+++
b/ui/src/app/core-ui/static-properties/static-collection/add-to-collection/add-to-collection.component.ts
@@ -16,7 +16,7 @@
*
*/
-import { Component, EventEmitter, Input, Output } from '@angular/core';
+import { Component, EventEmitter, Input, Output, inject } from '@angular/core';
import { StaticPropertyUtilService } from '../../static-property-util.service';
import {
FreeTextStaticProperty,
@@ -24,6 +24,7 @@ import {
StaticProperty,
} from '@streampipes/platform-services';
import { Observable } from 'rxjs';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'sp-add-to-collection',
@@ -31,6 +32,8 @@ import { Observable } from 'rxjs';
styleUrls: ['./add-to-collection.component.scss'],
})
export class AddToCollectionComponent {
+ translateService = inject(TranslateService);
+
@Input()
public staticPropertyTemplate: StaticProperty;
@@ -45,7 +48,7 @@ export class AddToCollectionComponent {
public fileName: string;
public hasError = false;
- public errorMessage = 'This is a test';
+ public errorMessage = this.translateService.instant('This is a test');
constructor(private staticPropertyUtil: StaticPropertyUtilService) {}
@@ -160,11 +163,13 @@ export class AddToCollectionComponent {
option.selected = true;
} else {
this.setError(
- 'Error in line ' +
- rowNumber +
- '. Value for "' +
- property.label +
- '" is not supported',
+ this.translateService.instant(
+ 'Error in line {{rowNumber}}. Value for "{{property}}" is
not supported.',
+ {
+ rowNumber,
+ property: property.label,
+ },
+ ),
);
}
}
@@ -176,11 +181,13 @@ export class AddToCollectionComponent {
) {
if (row[property.label] === undefined || row[property.label] === '') {
this.setError(
- 'Error in line ' +
- rowNumber +
- '. Value for "' +
- property.label +
- '" is not set',
+ this.translateService.instant(
+ 'Error in line {{rowNumber}}. Value for "{{property}}" is
not set.',
+ {
+ rowNumber,
+ property: property.label,
+ },
+ ),
);
} else {
property.value = row[property.label];
diff --git
a/ui/src/app/core-ui/static-properties/static-file-input/static-file-input.component.html
b/ui/src/app/core-ui/static-properties/static-file-input/static-file-input.component.html
index 0c3e1ebca6..d91cd84ca6 100644
---
a/ui/src/app/core-ui/static-properties/static-file-input/static-file-input.component.html
+++
b/ui/src/app/core-ui/static-properties/static-file-input/static-file-input.component.html
@@ -23,12 +23,12 @@
[formControl]="chooseExistingFileControl"
color="accent"
>
- <mat-radio-button style="margin-right: 10px" [value]="true"
- >Choose existing file</mat-radio-button
- >
- <mat-radio-button [value]="false"
- >Upload new file</mat-radio-button
- >
+ <mat-radio-button style="margin-right: 10px" [value]="true">{{
+ 'Choose existing file' | translate
+ }}</mat-radio-button>
+ <mat-radio-button [value]="false">{{
+ 'Upload new file' | translate
+ }}</mat-radio-button>
</mat-radio-group>
</div>
<div
@@ -39,7 +39,7 @@
<input
data-cy="file-input-file-name"
type="text"
- placeholder="Select file"
+ [placeholder]="'Select file' | translate"
formControlName="{{ fieldName }}"
matInput
[matAutocomplete]="auto"
@@ -48,7 +48,7 @@
*ngIf="selectedFile"
matSuffix
mat-icon-button
- aria-label="Clear"
+ [attr.aria-label]="'Clear' | translate"
(click)="selectedFile = {}"
>
<mat-icon>close</mat-icon>
@@ -120,7 +120,7 @@
(click)="upload()"
[disabled]="!fileName"
>
- Upload
+ {{ 'Upload' | translate }}
</button>
</div>
</div>
diff --git
a/ui/src/app/core-ui/static-properties/static-file-input/static-file-input.component.ts
b/ui/src/app/core-ui/static-properties/static-file-input/static-file-input.component.ts
index 69ed38be1d..9f6a514e11 100644
---
a/ui/src/app/core-ui/static-properties/static-file-input/static-file-input.component.ts
+++
b/ui/src/app/core-ui/static-properties/static-file-input/static-file-input.component.ts
@@ -16,7 +16,7 @@
*
*/
-import { Component, EventEmitter, OnInit, Output } from '@angular/core';
+import { Component, EventEmitter, OnInit, Output, inject } from
'@angular/core';
import { HttpEventType, HttpResponse } from '@angular/common/http';
import {
FileMetadata,
@@ -28,6 +28,7 @@ import { AbstractValidatedStaticPropertyRenderer } from
'../base/abstract-valida
import { UntypedFormControl, ValidatorFn, Validators } from '@angular/forms';
import { MatDialog, MatDialogRef } from '@angular/material/dialog';
import { FileRenameDialogComponent } from
'../../../configuration/dialog/file-rename/file-rename-dialog.component';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'sp-static-file-input',
@@ -40,6 +41,8 @@ export class StaticFileInputComponent
{
public chooseExistingFileControl = new UntypedFormControl();
+ translateService = inject(TranslateService);
+
dialogRef: MatDialogRef<FileRenameDialogComponent>;
fileName: string;
@@ -47,7 +50,7 @@ export class StaticFileInputComponent
selectedUploadFile: File;
hasInput: boolean;
- errorMessage = 'Please enter a value';
+ errorMessage = this.translateService.instant('Please enter a value');
uploadStatus = 0;
diff --git
a/ui/src/app/core-ui/static-properties/static-free-input/static-free-input.component.html
b/ui/src/app/core-ui/static-properties/static-free-input/static-free-input.component.html
index a17386325c..16ef21767d 100644
---
a/ui/src/app/core-ui/static-properties/static-free-input/static-free-input.component.html
+++
b/ui/src/app/core-ui/static-properties/static-free-input/static-free-input.component.html
@@ -66,7 +66,7 @@
fxLayout="column"
*ngIf="staticProperty.placeholdersSupported"
>
- <h5>Possible placeholders:</h5>
+ <h5>{{ 'Possible placeholders:' | translate }}</h5>
<div fxFlex="100" fxLayout="row" style="background: white">
<mat-chip-list style="margin-bottom: 10px">
<mat-chip
diff --git
a/ui/src/app/core-ui/static-properties/static-free-input/static-free-input.component.ts
b/ui/src/app/core-ui/static-properties/static-free-input/static-free-input.component.ts
index e71552b7ea..3b395fe38e 100644
---
a/ui/src/app/core-ui/static-properties/static-free-input/static-free-input.component.ts
+++
b/ui/src/app/core-ui/static-properties/static-free-input/static-free-input.component.ts
@@ -16,7 +16,7 @@
*
*/
-import { Component, OnInit, ViewChild } from '@angular/core';
+import { Component, OnInit, ViewChild, inject } from '@angular/core';
import { ValidatorFn, Validators } from '@angular/forms';
import { ConfigurationInfo } from '../../../connect/model/ConfigurationInfo';
import {
@@ -31,6 +31,7 @@ import {
} from '../input.validator';
import { AbstractValidatedStaticPropertyRenderer } from
'../base/abstract-validated-static-property';
import { QuillEditorComponent } from 'ngx-quill';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'sp-app-static-free-input',
@@ -41,6 +42,7 @@ export class StaticFreeInputComponent
extends AbstractValidatedStaticPropertyRenderer<FreeTextStaticProperty>
implements OnInit
{
+ translateService = inject(TranslateService);
quillModules: any = {
toolbar: [
['bold', 'italic', 'underline', 'strike'],
@@ -78,15 +80,21 @@ export class StaticFreeInputComponent
DataType.isNumberType(this.staticProperty.requiredDomainProperty)
) {
validators.push(ValidateNumber);
- this.errorMessage = 'The value should be a number';
+ this.errorMessage = this.translateService.instant(
+ 'The value should be a number',
+ );
} else if (
this.staticProperty.requiredDomainProperty === SemanticType.SO_URL
) {
validators.push(ValidateUrl);
- this.errorMessage = 'Please enter a valid URL';
+ this.errorMessage = this.translateService.instant(
+ 'Please enter a valid URL',
+ );
} else if (this.staticProperty.requiredDatatype === DataType.STRING) {
validators.push(ValidateString);
- this.errorMessage = 'Please enter a valid String';
+ this.errorMessage = this.translateService.instant(
+ 'Please enter a valid String',
+ );
}
return validators;
diff --git
a/ui/src/app/core-ui/static-properties/static-mapping-nary/static-mapping-nary.component.html
b/ui/src/app/core-ui/static-properties/static-mapping-nary/static-mapping-nary.component.html
index 6843030344..dfa3038273 100644
---
a/ui/src/app/core-ui/static-properties/static-mapping-nary/static-mapping-nary.component.html
+++
b/ui/src/app/core-ui/static-properties/static-mapping-nary/static-mapping-nary.component.html
@@ -26,7 +26,7 @@
(click)="selectAll()"
style="margin-right: 10px; margin-left: 10px"
>
- Select all
+ {{ 'Select all' | translate }}
</button>
<button
mat-button
@@ -34,7 +34,7 @@
class="mat-basic small-button"
(click)="selectNone()"
>
- Select none
+ {{ 'Select none' | translate }}
</button>
</div>
<div fxFlex="100" fxLayout="column" style="margin-top: 10px">
diff --git
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-any-input/static-runtime-resolvable-any-input.component.html
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-any-input/static-runtime-resolvable-any-input.component.html
index ac1c4f7e54..fff60b9417 100644
---
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-any-input/static-runtime-resolvable-any-input.component.html
+++
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-any-input/static-runtime-resolvable-any-input.component.html
@@ -26,7 +26,7 @@
(click)="selectAll(true)"
[disabled]="!showOptions"
>
- <span>Select all</span>
+ <span>{{ 'Select all' | translate }}</span>
</button>
<button
mat-button
@@ -35,7 +35,7 @@
(click)="selectAll(false)"
[disabled]="!showOptions"
>
- <span>Select none</span>
+ <span>{{ 'Select none' | translate }}</span>
</button>
<button
mat-button
@@ -45,7 +45,7 @@
(click)="loadOptionsFromRestApi()"
[disabled]="!showOptions"
>
- <span>Reload</span>
+ <span>{{ 'Reload' | translate }}</span>
</button>
<mat-spinner
*ngIf="loading"
@@ -66,7 +66,7 @@
</mat-checkbox>
</div>
<div fxLayout="column" *ngIf="!showOptions && !loading" class="mb-10">
- <span>(waiting for input)</span>
+ <span>{{ '(waiting for input)' | translate }}</span>
</div>
<div *ngIf="staticProperty.horizontalRendering && showOptions">
diff --git
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-group/static-runtime-resolvable-group.component.html
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-group/static-runtime-resolvable-group.component.html
index c1c31055f4..4d319d7576 100644
---
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-group/static-runtime-resolvable-group.component.html
+++
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-group/static-runtime-resolvable-group.component.html
@@ -26,7 +26,7 @@
(click)="loadOptionsFromRestApi()"
style="margin-right: 10px; margin-left: 10px"
>
- <span>Reload</span>
+ <span>{{ 'Reload' | translate }}</span>
</button>
</div>
<div *ngIf="!staticProperty.horizontalRendering" fxLayout="column">
diff --git
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-oneof-input/static-runtime-resolvable-oneof-input.component.html
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-oneof-input/static-runtime-resolvable-oneof-input.component.html
index 555b4d2a80..f49979e2d1 100644
---
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-oneof-input/static-runtime-resolvable-oneof-input.component.html
+++
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-oneof-input/static-runtime-resolvable-oneof-input.component.html
@@ -28,7 +28,7 @@
[disabled]="!showOptions"
style="margin-right: 10px; margin-left: 10px"
>
- <span>Reload</span>
+ <span>{{ 'Reload' | translate }}</span>
</button>
</div>
<div fxLayout="column" *ngIf="error" class="mt-10">
@@ -57,7 +57,7 @@
*ngIf="!showOptions && !loading"
class="mt-10"
>
- <span>(waiting for input)</span>
+ <span>{{ '(waiting for input)' | translate }}</span>
</div>
<div fxLayout="column" *ngIf="loading">
<mat-spinner
diff --git
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-browse-nodes/static-tree-input-browse-nodes.component.html
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-browse-nodes/static-tree-input-browse-nodes.component.html
index 4f41a8c837..071b995f72 100644
---
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-browse-nodes/static-tree-input-browse-nodes.component.html
+++
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-browse-nodes/static-tree-input-browse-nodes.component.html
@@ -18,7 +18,9 @@
<div class="tree-input-header" fxLayoutAlign="start center">
<div fxLayout="row" fxFlex="100">
- <div fxFlex fxLayoutAlign="start center"><b>Browse</b></div>
+ <div fxFlex fxLayoutAlign="start center">
+ <b>{{ 'Browse' | translate }}</b>
+ </div>
<div fxLayoutAlign="end center">
<button
mat-icon-button
@@ -50,14 +52,14 @@
*ngIf="node.dataNode && !isNodeSelected(node)"
(click)="addNode(node)"
[attr.data-cy]="'select-' + node.nodeName"
- matTooltip="Add node"
+ [matTooltip]="'Add node' | translate"
>add_circle</i
>
<i
class="material-icons pr-5 icon-button"
*ngIf="node.dataNode && isNodeSelected(node)"
(click)="removeNode(node)"
- matTooltip="Remove node"
+ [matTooltip]="'Remove node' | translate"
>remove_circle</i
>
<i
@@ -65,7 +67,7 @@
*ngIf="selectedNodeId !== node.internalNodeName"
[attr.data-cy]="'show-node-details-' + node.nodeName"
(click)="showNodeDetails(node)"
- matTooltip="Show details"
+ [matTooltip]="'Show details' | translate"
>visibility</i
>
<i
@@ -73,7 +75,7 @@
*ngIf="selectedNodeId === node.internalNodeName"
[attr.data-cy]="'hide-node-details-' + node.nodeName"
(click)="hideNodeDetails()"
- matTooltip="Show details"
+ [matTooltip]="'Show details' | translate"
>visibility_off</i
>
<span class="pr-5">{{ node.nodeName }}</span>
@@ -108,7 +110,7 @@
<i
class="material-icons pr-5 icon-button"
*ngIf="tree.isExpanded(node) && hasDataChildren(node)"
- matTooltip="Add all direct children"
+ [matTooltip]="'Add all direct children' | translate"
(click)="addAllDirectChildren(node)"
>add_circle</i
>
@@ -117,7 +119,7 @@
*ngIf="selectedNodeId !== node.internalNodeName"
[attr.data-cy]="'show-node-details-' + node.nodeName"
(click)="showNodeDetails(node)"
- matTooltip="Show details"
+ [matTooltip]="'Show details' | translate"
>visibility</i
>
<i
@@ -125,7 +127,7 @@
*ngIf="selectedNodeId === node.internalNodeName"
[attr.data-cy]="'hide-node-details-' + node.nodeName"
(click)="hideNodeDetails()"
- matTooltip="Show details"
+ [matTooltip]="'Show details' | translate"
>visibility_off</i
>
<span class="node-name pr-5"> {{ node.nodeName }}</span>
diff --git
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-button-menu/static-tree-input-button-menu.component.html
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-button-menu/static-tree-input-button-menu.component.html
index a0c3df6e29..d2f9e2c624 100644
---
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-button-menu/static-tree-input-button-menu.component.html
+++
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-button-menu/static-tree-input-button-menu.component.html
@@ -27,7 +27,7 @@
[disabled]="!showOptions"
data-cy="clear-tree-node-selection"
>
- <span>Clear selection & reload</span>
+ <span>{{ 'Clear selection & reload' | translate }}</span>
</button>
<button
mat-raised-button
@@ -38,7 +38,7 @@
*ngIf="editorMode === 'tree'"
[disabled]="!showOptions"
>
- <span>Reload</span>
+ <span>{{ 'Reload' | translate }}</span>
</button>
</div>
<div
@@ -52,22 +52,24 @@
[mode]="'indeterminate'"
[diameter]="15"
></mat-spinner>
- <span class="reloading-nodes-label"> Reloading nodes</span>
+ <span class="reloading-nodes-label">{{
+ 'Reloading nodes' | translate
+ }}</span>
</div>
<div fxFlex fxLayoutAlign="end center">
<mat-button-toggle-group
- aria-label="Font Style"
+ [attr.aria-label]="'Font Style' | translate"
class="small-button"
[(value)]="editorMode"
(change)="onChangeEditor($event.value)"
>
- <mat-button-toggle data-cy="editor-mode-tree" value="tree"
- >Tree</mat-button-toggle
- >
- <mat-button-toggle data-cy="editor-mode-text" value="text"
- >Text</mat-button-toggle
- >
+ <mat-button-toggle data-cy="editor-mode-tree" value="tree">{{
+ 'Tree' | translate
+ }}</mat-button-toggle>
+ <mat-button-toggle data-cy="editor-mode-text" value="text">{{
+ 'Text' | translate
+ }}</mat-button-toggle>
</mat-button-toggle-group>
</div>
</div>
diff --git
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-node-details/static-tree-input-node-details.component.html
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-node-details/static-tree-input-node-details.component.html
index 15d9b37faf..002844c23e 100644
---
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-node-details/static-tree-input-node-details.component.html
+++
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-node-details/static-tree-input-node-details.component.html
@@ -16,7 +16,7 @@
~
-->
<div class="tree-input-header" fxLayoutAlign="start center">
- <b>Node Details</b>
+ <b>{{ 'Node Details' | translate }}</b>
</div>
<div
class="node-metadata"
diff --git
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-selected-nodes/static-tree-input-selected-nodes.component.html
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-selected-nodes/static-tree-input-selected-nodes.component.html
index 968e782252..e8631b27a6 100644
---
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-selected-nodes/static-tree-input-selected-nodes.component.html
+++
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-selected-nodes/static-tree-input-selected-nodes.component.html
@@ -16,7 +16,7 @@
~
-->
<div class="tree-input-header" fxLayoutAlign="start center">
- <b>Selected Nodes</b>
+ <b>{{ 'Selected Nodes' | translate }}</b>
</div>
<div *ngFor="let selectedNodeName of selectedNodesInternalNames">
<div
diff --git
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-text-editor/static-tree-input-text-editor.component.ts
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-text-editor/static-tree-input-text-editor.component.ts
index 66ba60a724..83d5d83ecd 100644
---
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-text-editor/static-tree-input-text-editor.component.ts
+++
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input-text-editor/static-tree-input-text-editor.component.ts
@@ -16,10 +16,18 @@
*
*/
-import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
+import {
+ Component,
+ EventEmitter,
+ Input,
+ OnInit,
+ Output,
+ inject,
+} from '@angular/core';
import { Subject } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
import { RuntimeResolvableTreeInputStaticProperty } from
'@streampipes/platform-services';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'sp-static-tree-input-text-editor',
@@ -32,6 +40,8 @@ export class StaticTreeInputTextEditorComponent implements
OnInit {
@Output()
performValidationEmitter: EventEmitter<void> = new EventEmitter<void>();
+ translateService = inject(TranslateService);
+
editorOptions = {
mode: 'text/plain',
autoRefresh: true,
@@ -44,9 +54,9 @@ export class StaticTreeInputTextEditorComponent implements
OnInit {
},
};
- headerText =
- '# Provide OPC UA Node IDs below, one per line.\n' +
- '# Format: ns=<namespace>;s=<node_id> (e.g., ns=3;s=SampleNodeId)\n';
+ headerText = this.translateService.instant(
+ '# Provide OPC UA Node IDs below, one per line.\n# Format:
ns=<namespace>;s=<node_id> (e.g., ns=3;s=SampleNodeId)\n',
+ );
textEditor: string = '';
private textChangeSubject: Subject<string> = new Subject<string>();
diff --git a/ui/src/app/core-ui/status-indicator/status-indicator.component.ts
b/ui/src/app/core-ui/status-indicator/status-indicator.component.ts
index fd89fccdc8..76d6bd66b1 100644
--- a/ui/src/app/core-ui/status-indicator/status-indicator.component.ts
+++ b/ui/src/app/core-ui/status-indicator/status-indicator.component.ts
@@ -16,7 +16,8 @@
*
*/
-import { Component, Input } from '@angular/core';
+import { Component, Input, inject } from '@angular/core';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'sp-status-indicator',
@@ -24,8 +25,10 @@ import { Component, Input } from '@angular/core';
styleUrls: ['./status-indicator.component.scss'],
})
export class StatusIndicatorComponent {
+ translateService = inject(TranslateService);
+
@Input()
- message = 'Loading';
+ message = this.translateService.instant('Loading');
@Input()
additionalDescription = '';
diff --git a/ui/src/app/core-ui/topics/topics.component.html
b/ui/src/app/core-ui/topics/topics.component.html
index 73c5be895c..bf50fefd80 100644
--- a/ui/src/app/core-ui/topics/topics.component.html
+++ b/ui/src/app/core-ui/topics/topics.component.html
@@ -24,7 +24,8 @@
<small>{{ pipelineElement?.description }}</small>
</div>
<div class="element-id" fxLayoutAlign="end start">
- <span>ID</span>
+ <span>{{ 'ID' | translate }}</span
+ >
<b>{{
isDataStream
? pipelineElement?.elementId
@@ -51,7 +52,7 @@
>
<ng-container matColumnDef="outputTopics">
<th mat-header-cell *matHeaderCellDef>
- <strong>Output Topics</strong>
+ <strong>{{ 'Output Topics' | translate }}</strong>
</th>
<td mat-cell *matCellDef="let element">
<div
@@ -66,7 +67,7 @@
[cdkCopyToClipboard]="
element.topicDefinition.actualTopicName
"
- matTooltip="Copy"
+ [matTooltip]="'Copy' | translate"
>
<mat-icon>content_copy</mat-icon>
</button>
@@ -85,7 +86,7 @@
<table mat-table [dataSource]="pipelineElement?.inputStreams">
<ng-container matColumnDef="inputTopics">
<th mat-header-cell *matHeaderCellDef>
- <strong>Input Topics</strong>
+ <strong>{{ 'Input Topics' | translate }}</strong>
</th>
<td mat-cell *matCellDef="let element">
<div
@@ -104,7 +105,7 @@
?.transportProtocols?.[0]
?.topicDefinition?.actualTopicName
"
- matTooltip="Copy"
+ [matTooltip]="'Copy' | translate"
>
<mat-icon>content_copy</mat-icon>
</button>
@@ -127,7 +128,7 @@
>
<ng-container matColumnDef="outputTopics">
<th mat-header-cell *matHeaderCellDef>
- <strong>Output Topics</strong>
+ <strong>{{ 'Output Topics' | translate }}</strong>
</th>
<td mat-cell *matCellDef="let element">
<div
@@ -143,7 +144,7 @@
element?.topicDefinition
?.actualTopicName
"
- matTooltip="Copy"
+ [matTooltip]="'Copy' | translate"
>
<mat-icon>content_copy</mat-icon>
</button>
@@ -162,7 +163,7 @@
<table mat-table [dataSource]="pipelineElement?.inputStreams">
<ng-container matColumnDef="inputTopics">
<th mat-header-cell *matHeaderCellDef>
- <strong>Input Topics</strong>
+ <strong>{{ 'Input Topics' | translate }}</strong>
</th>
<td mat-cell *matCellDef="let element">
<div
@@ -181,7 +182,7 @@
?.transportProtocols?.[0]
?.topicDefinition?.actualTopicName
"
- matTooltip="Copy"
+ [matTooltip]="'Copy' | translate"
>
<mat-icon>content_copy</mat-icon>
</button>
@@ -207,7 +208,7 @@
class="mat-basic"
(click)="close()"
>
- Close
+ {{ 'Close' | translate }}
</button>
</div>
</div>
diff --git a/ui/src/app/core-ui/topics/topics.component.ts
b/ui/src/app/core-ui/topics/topics.component.ts
index 2ce28d6dc7..aa535f28e2 100644
--- a/ui/src/app/core-ui/topics/topics.component.ts
+++ b/ui/src/app/core-ui/topics/topics.component.ts
@@ -16,7 +16,7 @@
*
*/
-import { Component, Input, OnInit } from '@angular/core';
+import { Component, Input, OnInit, inject } from '@angular/core';
import {
DataProcessorInvocation,
DataSinkInvocation,
@@ -24,6 +24,7 @@ import {
} from '@streampipes/platform-services';
import { DialogRef } from '@streampipes/shared-ui';
import { PipelineElementUnion } from '../../editor/model/editor.model';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'sp-pipeline-element-topics',
@@ -31,9 +32,14 @@ import { PipelineElementUnion } from
'../../editor/model/editor.model';
styleUrls: ['./topics.component.scss'],
})
export class TopicsComponent implements OnInit {
+ translateService = inject(TranslateService);
selectedTabIndex = 0;
- availableTabs = ['Topics', 'Code'];
+ availableTabs = [
+ this.translateService.instant('Topics'),
+ this.translateService.instant('Code'),
+ ];
+
tabs: string[] = [];
@Input()
diff --git
a/ui/src/app/dashboard/components/overview/dashboard-overview-table/dashboard-overview-table.component.html
b/ui/src/app/dashboard/components/overview/dashboard-overview-table/dashboard-overview-table.component.html
index 610cea8abb..0f256d57ef 100644
---
a/ui/src/app/dashboard/components/overview/dashboard-overview-table/dashboard-overview-table.component.html
+++
b/ui/src/app/dashboard/components/overview/dashboard-overview-table/dashboard-overview-table.component.html
@@ -18,7 +18,7 @@
<div fxFlex="100" fxLayout="column">
<sp-basic-header-title-component
- title="Dashboards"
+ [title]="'Dashboards' | translate"
></sp-basic-header-title-component>
<div fxFlex="100" fxLayout="row" fxLayoutAlign="center start">
<sp-table
@@ -33,7 +33,7 @@
mat-header-cell
*matHeaderCellDef
>
- Dashboard
+ {{ 'Dashboards' | translate }}
</th>
<td
fxFlex="60"
@@ -69,7 +69,7 @@
<button
mat-icon-button
color="accent"
- matTooltip="Show data view"
+ [matTooltip]="'Show dashboard' | translate"
(click)="showDashboard(element)"
>
<i class="material-icons">visibility</i>
@@ -77,7 +77,7 @@
<button
mat-icon-button
color="accent"
- matTooltip="Edit data view"
+ [matTooltip]="'Edit dashboard' | translate"
*ngIf="hasDataExplorerWritePrivileges"
[attr.data-cy]="'edit-dashboard-' + element.name"
(click)="editDashboard(element)"
@@ -87,7 +87,7 @@
<button
mat-icon-button
color="accent"
- matTooltip="Edit data view settings"
+ [matTooltip]="'Dashboard settings' | translate"
*ngIf="hasDataExplorerWritePrivileges"
(click)="openEditDashboardDialog(element)"
>
@@ -96,7 +96,7 @@
<button
mat-icon-button
color="accent"
- matTooltip="Manage permissions"
+ [matTooltip]="'Manage permissions' | translate"
*ngIf="isAdmin"
(click)="showPermissionsDialog(element)"
>
@@ -105,7 +105,7 @@
<button
mat-icon-button
color="accent"
- matTooltip="Delete data view"
+ [matTooltip]="'Delete chart' | translate"
*ngIf="hasDataExplorerWritePrivileges"
[attr.data-cy]="'delete-dashboard-' + element.name"
(click)="openDeleteDashboardDialog(element)"
diff --git
a/ui/src/app/dashboard/components/overview/dashboard-overview-table/dashboard-overview-table.component.ts
b/ui/src/app/dashboard/components/overview/dashboard-overview-table/dashboard-overview-table.component.ts
index cb353982cf..f6dc780c73 100644
---
a/ui/src/app/dashboard/components/overview/dashboard-overview-table/dashboard-overview-table.component.ts
+++
b/ui/src/app/dashboard/components/overview/dashboard-overview-table/dashboard-overview-table.component.ts
@@ -30,6 +30,7 @@ import { DataExplorerRoutingService } from
'../../../../data-explorer-shared/ser
import { MatDialog } from '@angular/material/dialog';
import { DataExplorerDashboardService } from
'../../../services/dashboard.service';
import { DataExplorerSharedService } from
'../../../../data-explorer-shared/services/data-explorer-shared.service';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'sp-dashboard-overview-table',
@@ -56,6 +57,7 @@ export class DashboardOverviewTableComponent extends
SpDataExplorerOverviewDirec
authService: AuthService,
currentUserService: CurrentUserService,
private dialog: MatDialog,
+ private translateService: TranslateService,
) {
super(dialogService, authService, currentUserService, routingService);
}
@@ -68,7 +70,9 @@ export class DashboardOverviewTableComponent extends
SpDataExplorerOverviewDirec
showPermissionsDialog(dashboard: Dashboard) {
const dialogRef = this.dataExplorerSharedService.openPermissionsDialog(
dashboard.elementId,
- `Manage permissions for dashboard ${dashboard.name}`,
+ this.translateService.instant(
+ `Manage permissions for dashboard ${dashboard.name}`,
+ ),
);
dialogRef.afterClosed().subscribe(refresh => {
@@ -94,10 +98,14 @@ export class DashboardOverviewTableComponent extends
SpDataExplorerOverviewDirec
const dialogRef = this.dialog.open(ConfirmDialogComponent, {
width: '600px',
data: {
- title: 'Are you sure you want to delete this dashboard?',
- subtitle: 'This action cannot be undone!',
- cancelTitle: 'Cancel',
- okTitle: 'Delete Dashboard',
+ title: this.translateService.instant(
+ 'Are you sure you want to delete this dashboard?',
+ ),
+ subtitle: this.translateService.instant(
+ 'This action cannot be undone!',
+ ),
+ cancelTitle: this.translateService.instant('Cancel'),
+ okTitle: this.translateService.instant('Delete dashboard'),
confirmAndCancel: true,
},
});
diff --git
a/ui/src/app/dashboard/components/overview/dashboard-overview.component.html
b/ui/src/app/dashboard/components/overview/dashboard-overview.component.html
index b9eb7956d6..b6ec73f4e3 100644
--- a/ui/src/app/dashboard/components/overview/dashboard-overview.component.html
+++ b/ui/src/app/dashboard/components/overview/dashboard-overview.component.html
@@ -40,7 +40,7 @@
*ngIf="hasDashboardWritePrivileges"
>
<i class="material-icons">add</i>
- <span>New dashboard</span>
+ <span>{{ 'New dashboard' | translate }}</span>
</button>
</div>
<div fxFlex="100" fxLayout="column">
diff --git
a/ui/src/app/dashboard/components/overview/dashboard-overview.component.ts
b/ui/src/app/dashboard/components/overview/dashboard-overview.component.ts
index 1ec10c33e5..562b9a47e2 100644
--- a/ui/src/app/dashboard/components/overview/dashboard-overview.component.ts
+++ b/ui/src/app/dashboard/components/overview/dashboard-overview.component.ts
@@ -29,6 +29,7 @@ import { SpDashboardRoutes } from '../../dashboard.routes';
import { Dashboard } from '@streampipes/platform-services';
import { DataExplorerDashboardService } from
'../../services/dashboard.service';
import { DashboardOverviewTableComponent } from
'./dashboard-overview-table/dashboard-overview-table.component';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'sp-dashboard-overview',
@@ -51,6 +52,7 @@ export class DashboardOverviewComponent implements OnInit {
private authService: AuthService,
private currentUserService: CurrentUserService,
private breadcrumbService: SpBreadcrumbService,
+ private translateService: TranslateService,
) {}
ngOnInit(): void {
@@ -74,7 +76,7 @@ export class DashboardOverviewComponent implements OnInit {
dashboardLiveSettings: {
refreshModeActive: false,
refreshIntervalInSeconds: 10,
- label: 'Off',
+ label: this.translateService.instant('Off'),
},
};
diff --git
a/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection-panel.component.html
b/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection-panel.component.html
index c5564dab2e..1c4f323cb4 100644
---
a/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection-panel.component.html
+++
b/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection-panel.component.html
@@ -19,7 +19,7 @@
<div fxFlex="100" class="designer-panel-content" fxLayout="column">
<div fxLayout="row" class="sp-tab-bg designer-panel-header">
<div fxLayoutAlign="start center" class="designer-panel-title">
- <span> Configure Dashboard </span>
+ <span> {{ 'Configure dashboard' | translate }} </span>
</div>
</div>
<div fxFlex="100" fxLayout="column" class="no-overflow">
@@ -28,7 +28,10 @@
fxFlexFill
class="small-tab-headers mat-tab-fill-height"
>
- <mat-tab data-cy="designer-panel-data-config" label="Charts">
+ <mat-tab
+ data-cy="designer-panel-data-config"
+ [label]="'Charts' | translate"
+ >
<div class="scroll-tab-content">
<sp-chart-selection
(addChartEmitter)="addChartEmitter.emit($event)"
diff --git
a/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.html
b/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.html
index 50b0597599..8838a45048 100644
---
a/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.html
+++
b/ui/src/app/dashboard/components/panel/chart-selection-panel/chart-selection/chart-selection.component.html
@@ -27,17 +27,17 @@
</div>
} @else {
<div fxLayoutAlign="center center" fxLayout="column" fxFlex="100">
- <span class="no-widget-hint"
- >No charts found - create a new chart first to add it to this
- dashboard.</span
- >
+ <span class="no-widget-hint">{{
+ 'No charts found - create a new chart first to add it to this
dashboard.'
+ | translate
+ }}</span>
<button
mat-button
color="accent"
class="mt-10"
(click)="navigateToDataViewCreation()"
>
- Create chart
+ {{ 'Create chart' | translate }}
</button>
</div>
}
diff --git
a/ui/src/app/dashboard/components/panel/dashboard-panel.component.html
b/ui/src/app/dashboard/components/panel/dashboard-panel.component.html
index 31fd3a752a..ad1f0e154e 100644
--- a/ui/src/app/dashboard/components/panel/dashboard-panel.component.html
+++ b/ui/src/app/dashboard/components/panel/dashboard-panel.component.html
@@ -66,7 +66,10 @@
data-cy="empty-dashboard"
>
<h4>
- This dashboard is empty and doesn't contain any
widgets.
+ {{
+ "This dashboard is empty and doesn't contain any
charts."
+ | translate
+ }}
</h4>
</div>
<sp-dashboard-grid-view
diff --git a/ui/src/app/dashboard/components/panel/dashboard-panel.component.ts
b/ui/src/app/dashboard/components/panel/dashboard-panel.component.ts
index ae282f5491..2182ec07c0 100644
--- a/ui/src/app/dashboard/components/panel/dashboard-panel.component.ts
+++ b/ui/src/app/dashboard/components/panel/dashboard-panel.component.ts
@@ -49,6 +49,7 @@ import { SpDataExplorerRoutes } from
'../../../data-explorer/data-explorer.route
import { DataExplorerRoutingService } from
'../../../data-explorer-shared/services/data-explorer-routing.service';
import { DataExplorerDetectChangesService } from
'../../../data-explorer/services/data-explorer-detect-changes.service';
import { SupportsUnsavedChangeDialog } from
'../../../data-explorer-shared/models/dataview-dashboard.model';
+import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'sp-dashboard-panel',
@@ -95,6 +96,7 @@ export class DashboardPanelComponent
private route: ActivatedRoute,
private routingService: DataExplorerRoutingService,
private breadcrumbService: SpBreadcrumbService,
+ private translateService: TranslateService,
) {}
public ngOnInit() {
@@ -258,11 +260,13 @@ export class DashboardPanelComponent
const dialogRef = this.dialog.open(ConfirmDialogComponent, {
width: '500px',
data: {
- title: 'Save changes?',
- subtitle:
- 'Update all changes to dashboard widgets or discard
current changes.',
- cancelTitle: 'Discard changes',
- okTitle: 'Update',
+ title: this.translateService.instant('Save changes?'),
+ subtitle: this.translateService.instant(
+ 'Update all changes to dashboard charts or discard
current changes.',
+ ),
+ cancelTitle:
+ this.translateService.instant('Discard changes'),
+ okTitle: this.translateService.instant('Update'),
confirmAndCancel: true,
},
});
diff --git
a/ui/src/app/dashboard/components/panel/dashboard-toolbar/dashboard-toolbar.component.html
b/ui/src/app/dashboard/components/panel/dashboard-toolbar/dashboard-toolbar.component.html
index bb5c92e63b..80a5a5d23f 100644
---
a/ui/src/app/dashboard/components/panel/dashboard-toolbar/dashboard-toolbar.component.html
+++
b/ui/src/app/dashboard/components/panel/dashboard-toolbar/dashboard-toolbar.component.html
@@ -25,23 +25,23 @@
<button
mat-raised-button
color="accent"
- matTooltip="Save"
+ [matTooltip]="'Save' | translate"
class="edit-menu-btn"
(click)="saveDashboardEmitter.emit()"
data-cy="save-dashboard-btn"
>
<mat-icon>save</mat-icon>
- <span>Save</span>
+ <span>{{ 'Save' | translate }}</span>
</button>
<button
mat-raised-button
color="accent"
- matTooltip="Discard"
+ [matTooltip]="'Discard' | translate"
class="mat-basic mr-10 edit-menu-btn"
(click)="discardDashboardEmitter.emit()"
>
<i class="material-icons">undo</i>
- <span> Discard</span>
+ <span> {{ 'Discard' | translate }}</span>
</button>
</div>
<div
@@ -52,8 +52,8 @@
<button
mat-icon-button
[matMenuTriggerFor]="menu"
- aria-label="View mode"
- matTooltip="View mode"
+ [attr.aria-label]="'View mode' | translate"
+ [matTooltip]="'View mode' | translate"
>
<mat-icon
>{{ viewMode === 'grid' ? 'grid_view' : 'web_asset' }}
@@ -62,11 +62,11 @@
<mat-menu #menu="matMenu">
<button mat-menu-item (click)="viewModeChange.emit('grid')">
<mat-icon>grid_view</mat-icon>
- <span>Grid</span>
+ <span>{{ 'Grid' | translate }}</span>
</button>
<button mat-menu-item (click)="viewModeChange.emit('slide')">
<mat-icon>web_asset</mat-icon>
- <span>Slides</span>
+ <span>{{ 'Slides' | translate }}</span>
</button>
</mat-menu>
</div>
@@ -93,7 +93,7 @@
<button
mat-icon-button
[matMenuTriggerFor]="optMenu"
- aria-label="Options"
+ [attr.aria-label]="'Options' | translate"
data-cy="options-data-explorer"
>
<mat-icon>more_vert</mat-icon>
@@ -106,7 +106,7 @@
data-cy="options-edit-dashboard"
>
<mat-icon>edit</mat-icon>
- <span>Edit dashboard</span>
+ <span>{{ 'Edit dashboard' | translate }}</span>
</button>
<button
mat-menu-item
@@ -114,7 +114,7 @@
*ngIf="!editMode && !timeRangeVisible"
>
<mat-icon>alarm_on</mat-icon>
- <span>Show time range selector</span>
+ <span>{{ 'Show time range selector' | translate }}</span>
</button>
<button
mat-menu-item
@@ -122,7 +122,7 @@
*ngIf="!editMode && timeRangeVisible"
>
<mat-icon>alarm_off</mat-icon>
- <span>Hide time range selector</span>
+ <span>{{ 'Hide time range selector' | translate }}</span>
</button>
<button
mat-menu-item
@@ -130,7 +130,7 @@
(click)="deleteDashboardEmitter.emit()"
>
<mat-icon>clear</mat-icon>
- <span>Delete dashboard</span>
+ <span>{{ 'Delete dashboard' | translate }}</span>
</button>
</mat-menu>
</div>
diff --git a/ui/src/app/dashboard/dashboard.module.ts
b/ui/src/app/dashboard/dashboard.module.ts
index 765fc818c3..64ccf4ad09 100644
--- a/ui/src/app/dashboard/dashboard.module.ts
+++ b/ui/src/app/dashboard/dashboard.module.ts
@@ -69,6 +69,7 @@ import { ChartPreviewComponent } from
'./components/panel/chart-selection-panel/
import { ChartSelectionComponent } from
'./components/panel/chart-selection-panel/chart-selection/chart-selection.component';
import { EditDashboardDialogComponent } from
'./dialogs/edit-dashboard/edit-dashboard-dialog.component';
import { DashboardOverviewTableComponent } from
'./components/overview/dashboard-overview-table/dashboard-overview-table.component';
+import { TranslateModule } from '@ngx-translate/core';
@NgModule({
imports: [
@@ -112,6 +113,7 @@ import { DashboardOverviewTableComponent } from
'./components/overview/dashboard
ServicesModule,
SharedUiModule,
DataExplorerSharedModule,
+ TranslateModule.forChild(),
RouterModule.forChild([
{
path: '',
diff --git
a/ui/src/app/dashboard/dialogs/edit-dashboard/edit-dashboard-dialog.component.html
b/ui/src/app/dashboard/dialogs/edit-dashboard/edit-dashboard-dialog.component.html
index 98b4312145..4c7e69b87f 100644
---
a/ui/src/app/dashboard/dialogs/edit-dashboard/edit-dashboard-dialog.component.html
+++
b/ui/src/app/dashboard/dialogs/edit-dashboard/edit-dashboard-dialog.component.html
@@ -25,7 +25,7 @@
style="margin: 5px; width: 100%"
>
<mat-form-field class="w-100" floatLabel="auto" color="accent">
- <mat-label>Data View Name</mat-label>
+ <mat-label>{{ 'Dashboard title' | translate }}</mat-label>
<input
id="dvname"
#dvname="ngModel"
@@ -34,14 +34,16 @@
data-cy="data-view-name"
[(ngModel)]="dashboard.name"
/>
- <mat-error>Name must not be empty</mat-error>
+ <mat-error>{{
+ 'Title must not be empty' | translate
+ }}</mat-error>
</mat-form-field>
<mat-form-field class="w-100" color="accent">
- <mat-label>Description</mat-label>
+ <mat-label>{{ 'Description' | translate }}</mat-label>
<input matInput [(ngModel)]="dashboard.description" />
</mat-form-field>
<div class="mt-10" fxLayout="column">
- <label>Default view mode</label>
+ <label>{{ 'Default view mode' | translate }}</label>
<mat-radio-group
[(ngModel)]="
dashboard.dashboardGeneralSettings.defaultViewMode
@@ -51,24 +53,26 @@
class="view-radio-button"
[value]="'grid'"
>
- Grid View
+ {{ 'Grid view' | translate }}
</mat-radio-button>
<mat-radio-button
class="view-radio-button"
[value]="'slide'"
>
- Slide View
+ {{ 'Slide view' | translate }}
</mat-radio-button>
</mat-radio-group>
</div>
<div class="mt-10" fxLayout="column">
- <label>Time Settings</label>
+ <label>{{ 'Time settings' | translate }}</label>
<mat-checkbox
[(ngModel)]="
dashboard.dashboardGeneralSettings.globalTimeEnabled
"
- >Use global time settings instead of widget time
- settings
+ >{{
+ 'Use global time settings instead of chart time
settings'
+ | translate
+ }}
</mat-checkbox>
</div>
<!--<mat-checkbox [(ngModel)]="dashboard.displayHeader">Show
name and description in dashboard</mat-checkbox>-->
@@ -83,7 +87,7 @@
class="mat-basic mr-10"
(click)="onCancel()"
>
- Close
+ {{ 'Close' | translate }}
</button>
<button
[disabled]="dvname.invalid"
@@ -93,7 +97,7 @@
data-cy="save-data-view"
(click)="onSave()"
>
- {{ createMode ? 'Create' : 'Save' }}
+ {{ (createMode ? 'Create' : 'Save') | translate }}
</button>
</div>
</div>
diff --git a/ui/src/app/dashboard/services/dashboard.service.ts
b/ui/src/app/dashboard/services/dashboard.service.ts
index 741821a53e..e2f5b569fe 100644
--- a/ui/src/app/dashboard/services/dashboard.service.ts
+++ b/ui/src/app/dashboard/services/dashboard.service.ts
@@ -20,15 +20,21 @@ import { Dashboard } from '@streampipes/platform-services';
import { EditDashboardDialogComponent } from
'../dialogs/edit-dashboard/edit-dashboard-dialog.component';
import { DialogService, PanelType } from '@streampipes/shared-ui';
import { Injectable } from '@angular/core';
+import { TranslateService } from '@ngx-translate/core';
@Injectable({ providedIn: 'root' })
export class DataExplorerDashboardService {
- constructor(private dialogService: DialogService) {}
+ constructor(
+ private dialogService: DialogService,
+ private translateService: TranslateService,
+ ) {}
openDashboardModificationDialog(createMode: boolean, dashboard: Dashboard)
{
return this.dialogService.open(EditDashboardDialogComponent, {
panelType: PanelType.SLIDE_IN_PANEL,
- title: createMode ? 'New Dashboard' : 'Edit Dashboard',
+ title: createMode
+ ? this.translateService.instant('New dashboard')
+ : this.translateService.instant('Edit dashboard'),
width: '60vw',
data: {
createMode: createMode,
diff --git
a/ui/src/app/data-explorer-shared/components/charts/heatmap/config/heatmap-widget-config.component.html
b/ui/src/app/data-explorer-shared/components/charts/heatmap/config/heatmap-widget-config.component.html
index 7b4c463792..c44503a9e1 100644
---
a/ui/src/app/data-explorer-shared/components/charts/heatmap/config/heatmap-widget-config.component.html
+++
b/ui/src/app/data-explorer-shared/components/charts/heatmap/config/heatmap-widget-config.component.html
@@ -47,7 +47,7 @@
</mat-checkbox>
</div>
<div class="ml-10 mb-10" fxFlex fxLayoutAlign="start center">
- <small>Visual Map Min</small>
+ <small>{{ 'Visual Map Min' | translate }}</small>
<span fxFlex></span>
<mat-form-field appearance="outline" color="accent"
fxFlex="30">
<input
@@ -62,7 +62,7 @@
</mat-form-field>
</div>
<div class="ml-10 mb-10" fxFlex fxLayoutAlign="start center">
- <small>Visual Map Max</small>
+ <small>{{ 'Visual Map Max' | translate }}</small>
<span fxFlex></span>
<mat-form-field appearance="outline" color="accent"
fxFlex="30">
<input