diff --git a/ui/src/app/extension/extensions-forms/extension-form-modbus.directive.js b/ui/src/app/extension/extensions-forms/extension-form-modbus.directive.js
index 2dfc961d02..96c398b897 100644
--- a/ui/src/app/extension/extensions-forms/extension-form-modbus.directive.js
+++ b/ui/src/app/extension/extensions-forms/extension-form-modbus.directive.js
@@ -31,17 +31,38 @@ export default function ExtensionFormModbusDirective($compile, $templateCache, $
var linker = function(scope, element) {
+ function TcpTransport() {
+ this.type = "tcp",
+ this.host = "localhost",
+ this.port = 502,
+ this.timeout = 5000,
+ this.reconnect = true,
+ this.rtuOverTcp = false
+ }
+
+ function UdpTransport() {
+ this.type = "udp",
+ this.host = "localhost",
+ this.port = 502,
+ this.timeout = 5000
+ }
+
+ function RtuTransport() {
+ this.type = "rtu",
+ this.portName = "COM1",
+ this.encoding = "ascii",
+ this.timeout = 5000,
+ this.baudRate = 115200,
+ this.dataBits = 7,
+ this.stopBits = 1,
+ this.parity ="even"
+ }
function Server() {
- this.transport = {
- "type": "tcp",
- "host": "localhost",
- "port": 502,
- "timeout": 3000
- };
+ this.transport = new TcpTransport();
this.devices = []
}
-
+
function Device() {
this.unitId = 1;
this.deviceName = "";
@@ -105,9 +126,13 @@ export default function ExtensionFormModbusDirective($compile, $templateCache, $
scope.onTransportChanged = function(server) {
var type = server.transport.type;
- server.transport = {};
- server.transport.type = type;
- server.transport.timeout = 3000;
+ if (type === "tcp") {
+ server.transport = new TcpTransport();
+ } else if (type === "udp") {
+ server.transport = new UdpTransport();
+ } else if (type === "rtu") {
+ server.transport = new RtuTransport();
+ }
scope.theForm.$setDirty();
};
diff --git a/ui/src/app/extension/extensions-forms/extension-form-modbus.tpl.html b/ui/src/app/extension/extensions-forms/extension-form-modbus.tpl.html
index 989d3f07db..508ddc0c42 100644
--- a/ui/src/app/extension/extensions-forms/extension-form-modbus.tpl.html
+++ b/ui/src/app/extension/extensions-forms/extension-form-modbus.tpl.html
@@ -73,49 +73,69 @@
-
-
-
-
-
-
extension.field-required
-
-
+
+
+
+
+
+
+
extension.field-required
+
+
-
-
-
-
-
extension.field-required
-
extension.port-range
-
extension.port-range
-
-
-
-
-
-
-
-
extension.field-required
-
-
+
+
+
+
+
extension.field-required
+
extension.port-range
+
extension.port-range
+
+
+
+
+
+
+
+
extension.field-required
+
+
+
+
+
+
+ {{ 'extension.modbus-tcp-reconnect' | translate }}
+
+
+
+
+ {{ 'extension.modbus-rtu-over-tcp' | translate }}
+
+
+
diff --git a/ui/src/app/extension/extensions-forms/extension-form-mqtt.tpl.html b/ui/src/app/extension/extensions-forms/extension-form-mqtt.tpl.html
index 9f0b547eef..f972b788fc 100644
--- a/ui/src/app/extension/extensions-forms/extension-form-mqtt.tpl.html
+++ b/ui/src/app/extension/extensions-forms/extension-form-mqtt.tpl.html
@@ -241,14 +241,14 @@
-
+
-
+
@@ -261,7 +261,7 @@
-
+
diff --git a/ui/src/app/locale/locale.constant-de_DE.json b/ui/src/app/locale/locale.constant-de_DE.json
new file mode 100644
index 0000000000..b777b18b0f
--- /dev/null
+++ b/ui/src/app/locale/locale.constant-de_DE.json
@@ -0,0 +1,1581 @@
+{
+ "access": {
+ "unauthorized": "Nicht autorisiert",
+ "unauthorized-access": "Unautorisierter Zugriff",
+ "unauthorized-access-text": "Sie sollten sich anmelden, um Zugriff auf diese Daten zu erhalten!",
+ "access-forbidden": "Keine Zugangsberechtigung",
+ "access-forbidden-text": "Sie haben keine Zugangsberechtigung für diesen Bereich!
Versuchen Sie sich mit einem anderen Benutzer anzumelden um Zugriff auf diesen Bereich zu bekommen.",
+ "refresh-token-expired": "Sitzung ist abgelaufen",
+ "refresh-token-failed": "Sitzung kann nicht aktualisiert werden"
+ },
+ "action": {
+ "activate": "Aktivieren",
+ "suspend": "Unterbrechen",
+ "save": "Speichern",
+ "saveAs": "Speichern unter",
+ "cancel": "Abbrechen",
+ "ok": "OK",
+ "delete": "Löschen",
+ "add": "Hinzufügen",
+ "yes": "Ja",
+ "no": "Nein",
+ "update": "Aktualisieren",
+ "remove": "Löschen",
+ "search": "Suche",
+ "clear-search": "Suchanfrage löschen",
+ "assign": "Zoordnen",
+ "unassign": "Zuordnung aufheben",
+ "share": "Teilen",
+ "make-private": "Privat machen",
+ "apply": "Anwenden",
+ "apply-changes": "Änderungen übernehmen",
+ "edit-mode": "Bearbeitungsmodus",
+ "enter-edit-mode": "Zum Bearbeitungsmodus wechseln",
+ "decline-changes": "Änderungen nicht übernehmen",
+ "close": "Schließen",
+ "back": "Zurück",
+ "run": "Ausführen",
+ "sign-in": "Anmelden!",
+ "edit": "Bearbeiten",
+ "view": "Ansicht",
+ "create": "Erstellen",
+ "drag": "Ziehen",
+ "refresh": "Aktualisieren",
+ "undo": "Rückgängig machen",
+ "copy": "Kopieren",
+ "paste": "Einfügen",
+ "copy-reference": "Zeichen kopieren",
+ "paste-reference": "Zeichen einfügen",
+ "import": "Importieren",
+ "export": "Exportieren",
+ "share-via": "Teilen mit {{provider}}"
+ },
+ "aggregation": {
+ "aggregation": "Aggregation",
+ "function": "Datenaggregationsfunktion",
+ "limit": "Höchstwerte",
+ "group-interval": "Gruppierungsintervall",
+ "min": "Minimal",
+ "max": "Maximal",
+ "avg": "Durchschnitt",
+ "sum": "Summe",
+ "count": "Anzahl",
+ "none": "kein Wert"
+ },
+ "admin": {
+ "general": "Allgemein",
+ "general-settings": "Allgemeine Einstellungen",
+ "outgoing-mail": "E-Mail Versand",
+ "outgoing-mail-settings": "Konfiguration des Postausgangsservers",
+ "system-settings": "Systemeinstellungen",
+ "test-mail-sent": "Test E-Mail wurde erfolgreich versendet!",
+ "base-url": "Basis-URL",
+ "base-url-required": "Basis-URL ist erforderlich.",
+ "mail-from": "E-Mail von",
+ "mail-from-required": "E-Mail von ist erforderlich.",
+ "smtp-protocol": "SMTP Protokoll",
+ "smtp-host": "SMTP Host",
+ "smtp-host-required": "SMTP Host ist erforderlich.",
+ "smtp-port": "SMTP Port",
+ "smtp-port-required": "Sie müssen einen SMTP Port angeben.",
+ "smtp-port-invalid": "Das ist kein gültiger SMTP Port.",
+ "timeout-msec": "Wartezeit (msec)",
+ "timeout-required": "Wartezeit ist erforderlich.",
+ "timeout-invalid": "Das ist keine gültige Wartezeit.",
+ "enable-tls": "TLS aktivieren",
+ "send-test-mail": "Test E-Mail senden"
+ },
+ "alarm": {
+ "alarm": "Alarm",
+ "alarms": "Alarme",
+ "select-alarm": "Alarm auswählen",
+ "no-alarms-matching": "Keine passenden Alarme zu '{{entity}}' wurden gefunden.",
+ "alarm-required": "Alarm ist erforderlich",
+ "alarm-status": "Alarm Status",
+ "search-status": {
+ "ANY": "Jeder",
+ "ACTIVE": "Aktiv",
+ "CLEARED": "Gelöscht",
+ "ACK": "Bestätigt",
+ "UNACK": "Nicht bestätigt"
+ },
+ "display-status": {
+ "ACTIVE_UNACK": "Nicht bestätigt aktiv",
+ "ACTIVE_ACK": "Bestätigt aktiv",
+ "CLEARED_UNACK": "Nicht bestätigt",
+ "CLEARED_ACK": "Bestätigung gelöscht"
+ },
+ "no-alarms-prompt": "Keine Alarme gefunden",
+ "created-time": "Erstellungszeit",
+ "type": "Typ",
+ "severity": "Schwere",
+ "originator": "Urheber",
+ "originator-type": "Urheber-Typ",
+ "details": "Details",
+ "status": "Status",
+ "alarm-details": "Alarm-Details",
+ "start-time": "Startzeit",
+ "end-time": "Endzeit",
+ "ack-time": "Bestätigungszeit",
+ "clear-time": "Zeit gelöscht",
+ "severity-critical": "Kritisch",
+ "severity-major": "Groß",
+ "severity-minor": "Klein",
+ "severity-warning": "Warnung",
+ "severity-indeterminate": "Unbestimmt",
+ "acknowledge": "Bestätigen",
+ "clear": "Löschen",
+ "search": "Alarme Suchen",
+ "selected-alarms": "{ count, plural, 1 {1 Alarm} other {# Alarme} } ausgewählt",
+ "no-data": "Keine Daten zum Anzeigen",
+ "polling-interval": "Alarmabfrageintervall (sec)",
+ "polling-interval-required": "Alarmabfrageintervall ist erforderlich.",
+ "min-polling-interval-message": "Mindestens 1 sec Abrufintervall ist zulässig.",
+ "aknowledge-alarms-title": "{ count, plural, 1 {1 Alarm} other {# Alarme} } bestätigen",
+ "aknowledge-alarms-text": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Alarm} other {# Alarme} } bestätigen möchten?",
+ "aknowledge-alarm-title": "Alarm bestätigen",
+ "aknowledge-alarm-text": "Möchten Sie den Alarm wirklich bestätigen?",
+ "clear-alarms-title": "{ count, plural, 1 {1 Alarm} other {# Alarme} } löschen",
+ "clear-alarms-text": "Möchten Sie wirklich { count, plural, 1 {1 Alarm} other {# Alarme} } löschen?",
+ "clear-alarm-title": "Alarm löschen",
+ "clear-alarm-text": "Möchten Sie den Alarm wirklich löschen?",
+ "alarm-status-filter": "Alarm Status Filter"
+ },
+ "alias": {
+ "add": "Alias hinzufügen",
+ "edit": "Alias bearbeiten",
+ "name": "Aliasname",
+ "name-required": "Aliasname ist erforderlich",
+ "duplicate-alias": "Ein Alias mit demselben Namen ist bereits vorhanden.",
+ "filter-type-single-entity": "Einzelne Entität",
+ "filter-type-entity-list": "Entitätsliste",
+ "filter-type-entity-name": "Entitätsname",
+ "filter-type-state-entity": "Entität aus dem Dashboard Status",
+ "filter-type-state-entity-description": "Entität aus den Dashboard Status Parametern",
+ "filter-type-asset-type": "Objekttyp",
+ "filter-type-asset-type-description": "Objekte vom Typ '{{assetType}}'",
+ "filter-type-asset-type-and-name-description": "Objekte vom Typ '{{assetType}}' und Name beginnend mit '{{prefix}}'",
+ "filter-type-device-type": "Gerätetyp",
+ "filter-type-device-type-description": "Geräte vom Typ '{{deviceType}}'",
+ "filter-type-device-type-and-name-description": "Geräte vom Typ '{{deviceType}}' und Name beginnend mit '{{prefix}}'",
+ "filter-type-entity-view-type": "Entitätsansichtstyp",
+ "filter-type-entity-view-type-description": "Entitätsansichten vom Typ '{{entityView}}'",
+ "filter-type-entity-view-type-and-name-description": "Entitätsansichten vom Typ '{{entityView}}' und Name beginnend mit '{{prefix}}'",
+ "filter-type-relations-query": "Beziehungsabfrage",
+ "filter-type-relations-query-description": "{{entities}} mit {{relationType}} Beziehung {{direction}} {{rootEntity}}",
+ "filter-type-asset-search-query": "Objektabfrage",
+ "filter-type-asset-search-query-description": "Objekte vom Typ {{assetTypes}} mit {{relationType}} Beziehung {{direction}} {{rootEntity}}",
+ "filter-type-device-search-query": "Geräteabfrage",
+ "filter-type-device-search-query-description": "Geräte vom Typ {{deviceTypes}} mit {{relationType}} Beziehung {{direction}} {{rootEntity}}",
+ "filter-type-entity-view-search-query": "Entitätsansichtsabfrage",
+ "filter-type-entity-view-search-query-description": "Entitätsansichten vom Typ {{entityViewTypes}} mit {{relationType}} Beziehung {{direction}} {{rootEntity}}",
+ "entity-filter": "Entitätsfilter",
+ "resolve-multiple": "Als mehrere Entitäten auflösen",
+ "filter-type": "Filtertyp",
+ "filter-type-required": "Filtertyp ist erforderlich.",
+ "entity-filter-no-entity-matched": "Es wurden keine Entitäten gefunden, die dem angegebenen Filter entsprechen.",
+ "no-entity-filter-specified": "Es wurde kein Entitätsfilter angegeben",
+ "root-state-entity": "Dashboard Status Entität als Wurzel verwenden",
+ "root-entity": "Wurzelentität",
+ "state-entity-parameter-name": "Parameter-Name der Statusentität",
+ "default-state-entity": "Standard Statusentität",
+ "default-entity-parameter-name": "Standartmäßig",
+ "max-relation-level": "Maximale Beziehungstiefe",
+ "unlimited-level": "Unbegrenzte Ebenen",
+ "state-entity": "Dashboard Status Entität",
+ "all-entities": "Alle Entitäten",
+ "any-relation": "Jede Beziehung"
+ },
+ "asset": {
+ "asset": "Objekt",
+ "assets": "Objekte",
+ "management": "Objektverwaltung",
+ "view-assets": "Objekte anzeigen",
+ "add": "Objekt hinzufügen",
+ "assign-to-customer": "Einem Kunden zuordnen",
+ "assign-asset-to-customer": "Objekte dem Kunden zuordnen",
+ "assign-asset-to-customer-text": "Bitte wählen Sie die Objekte aus, die dem Kunden zugeordnet werden sollen",
+ "no-assets-text": "Keine Objekte gefunden",
+ "assign-to-customer-text": "Bitte wählen Sie den Kunden aus, dem die Objekte zugeordnet werden sollen",
+ "public": "Öffentlich",
+ "assignedToCustomer": "Kunden zugeordnet",
+ "make-public": "Objekt öffentlich machen",
+ "make-private": "Objekt privat machen",
+ "unassign-from-customer": "Kundenzuordnung aufheben",
+ "delete": "Objekt löschen",
+ "asset-public": "Objekt ist öffentlich",
+ "asset-type": "Objekttyp",
+ "asset-type-required": "Objekttyp ist erforderlich.",
+ "select-asset-type": "Objekttyp auswählen",
+ "enter-asset-type": "Objekttyp bestätigen",
+ "any-asset": "Jedes Objekt",
+ "no-asset-types-matching": "Es wurden keine zu '{{entitySubtype}}' passenden Objekte gefunden.",
+ "asset-type-list-empty": "Keine Objekttypen ausgewählt.",
+ "asset-types": "Objekttypen",
+ "name": "Name",
+ "name-required": "Name ist erforderlich.",
+ "description": "Beschreibung",
+ "type": "Typ",
+ "type-required": "Typ ist erforderlich.",
+ "details": "Details",
+ "events": "Ereignisse",
+ "add-asset-text": "Neues Objekt hinzufügen",
+ "asset-details": "Objektdetails",
+ "assign-assets": "Objekte zuordnen",
+ "assign-assets-text": "Kunden { count, plural, 1 {1 Objekt} other {# Objekte} } zuordnen",
+ "delete-assets": "Objekte löschen",
+ "unassign-assets": "Objektzuordnungen aufheben",
+ "unassign-assets-action-title": "Kunden { count, plural, 1 {1 Objektzuordnung} other {# Objektzuordnungen} } aufheben",
+ "assign-new-asset": "Neues Objekt zuordnen",
+ "delete-asset-title": "Sind Sie sicher, dass Sie das Objekt '{{assetName}}' löschen möchten?",
+ "delete-asset-text": "Vorsicht, nach Bestätigung wird das Objekt und alle zugehörigen Daten nicht wiederherstellbar gelöscht.",
+ "delete-assets-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Objekt} other {# Objekte} } löschen möchten?",
+ "delete-assets-action-title": "{ count, plural, 1 {1 Objekt} other {# Objekte} } löschen",
+ "delete-assets-text": "Vorsicht, nach Bestätigung werden die ausgewählten Objekte und alle zugehörigen Daten nicht wiederherstellbar gelöscht",
+ "make-public-asset-title": "Sind Sie sicher, dass Sie das Objekt '{{assetName}}' öffentlich machen möchten?",
+ "make-public-asset-text": "Nach Bestätigung wird das Objekt und alle zugehörigen Daten anderen zugänglich gemacht.",
+ "make-private-asset-title": "Sind Sie sicher, dass Sie das Objekt '{{assetName}}' privat machen möchten?",
+ "make-private-asset-text": "Nach Bestätigung wird das Objekt und alle zugehörigen Daten privat und ist für andere nicht mehr zugänglich.",
+ "unassign-asset-title": "Sind Sie sicher, dass Sie die Zuordnung für das Objekt '{{assetName}}' aufheben möchten?",
+ "unassign-asset-text": "Nach Bestätigung wird die Zuordnung des Objekts aufgehoben und es ist für den Kunden nicht mehr zugänglich.",
+ "unassign-asset": "Zuordnung des Objekts aufheben",
+ "unassign-assets-title": "Möchten Sie die Zuordnung von { count, plural, 1 {1 Objekt} other {# Objekte} } aufheben?",
+ "unassign-assets-text": "Nach Bestätigung wird die Zuordnung der ausgewählten Objekte aufgehoben und sie sind für den Kunden nicht mehr zugänglich.",
+ "copyId": "Objekt-ID kopieren",
+ "idCopiedMessage": "Objekt-ID wurde in die Zwischenablage kopiert",
+ "select-asset": "Objekt auswählen",
+ "no-assets-matching": "Es wurden keine zu '{{entity}}' passenden Objekte gefunden.",
+ "asset-required": "Objekt ist erforderlich",
+ "name-starts-with": "Name des Objekts beginnt mit"
+ },
+ "attribute": {
+ "attributes": "Eigenschaften",
+ "latest-telemetry": "Neueste Telemetrie",
+ "attributes-scope": "Entitätseigenschaftsbereich",
+ "scope-latest-telemetry": "Neueste Telemetrie",
+ "scope-client": "Client Eigenschaften",
+ "scope-server": "Server Eigenschaften",
+ "scope-shared": "Gemeinsame Eigenschaften",
+ "add": "Eigenschaft hinzufügen",
+ "key": "Schlüssel",
+ "last-update-time": "Datum der letzten Aktualisierung",
+ "key-required": "Eigenschaftsschlüssel ist erforderlich.",
+ "value": "Wert",
+ "value-required": "Eigenschaftswert ist erforderlich.",
+ "delete-attributes-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Eigenschaft} other {# Eigenschaften} } löschen möchten?",
+ "delete-attributes-text": "Seien Sie vorsichtig, nach der Bestätigung werden alle ausgewählten Eigenschaften entfernt.",
+ "delete-attributes": "Eigenschaften löschen",
+ "enter-attribute-value": "Geben Sie den Eigenschaftswert ein",
+ "show-on-widget": "Im Widget anzeigen",
+ "widget-mode": "Widget-Modus",
+ "next-widget": "Nächstes Widget",
+ "prev-widget": "Vorheriges Widget",
+ "add-to-dashboard": "Zum Dashboard hinzufügen",
+ "add-widget-to-dashboard": "Widget zum Dashboard hinzufügen",
+ "selected-attributes": "{ count, plural, 1 {1 Eigenschaft} other {# Eigenschaften} } ausgewählt",
+ "selected-telemetry": "{ count, plural, 1 {1 Telemetrieeinheit } other {# Telemetrieeinheiten} } ausgewählt"
+ },
+ "audit-log": {
+ "audit": "Audit",
+ "audit-logs": "Audit-Protokolle",
+ "timestamp": "Zeitstempel",
+ "entity-type": "Entitätstype",
+ "entity-name": "Entitätsname",
+ "user": "User",
+ "type": "Typ",
+ "status": "Status",
+ "details": "Details",
+ "type-added": "Hinzugefügt",
+ "type-deleted": "Gelöscht",
+ "type-updated": "Aktualisiert",
+ "type-attributes-updated": "Eigenschaften aktualisiert",
+ "type-attributes-deleted": "Eigenschaften gelöscht",
+ "type-rpc-call": "RPC Aufruf",
+ "type-credentials-updated": "Anmeldeinformationen wurden aktualisiert",
+ "type-assigned-to-customer": "Kunden Zuordnung",
+ "type-unassigned-from-customer": "Kunden Zuordnung aufgehoben",
+ "type-activated": "Aktiviert",
+ "type-suspended": "Ausgesetzt",
+ "type-credentials-read": "Anmeldeinformationen gelesen",
+ "type-attributes-read": "Eigenschaften gelesen",
+ "type-relation-add-or-update": "Beziehung aktualisiert",
+ "type-relation-delete": "Beziehung gelöscht",
+ "type-relations-delete": "Alle Beziehungen gelöscht",
+ "type-alarm-ack": "Bestätigt",
+ "type-alarm-clear": "Gelöscht",
+ "status-success": "Erfolg",
+ "status-failure": "Fehler",
+ "audit-log-details": "Audit-Protokoll Details",
+ "no-audit-logs-prompt": "Keine Protokolle gefunden",
+ "action-data": "Aktionsdaten",
+ "failure-details": "Fehlerdetails",
+ "search": "Audit-Protokolle durchsuchen",
+ "clear-search": "Suche leeren"
+ },
+ "confirm-on-exit": {
+ "message": "Sie haben nicht gespeicherte Änderungen. Möchten Sie diese Seite wirklich verlassen?",
+ "html-message": "Sie haben nicht gespeicherte Änderungen.
Möchten Sie diese Seite wirklich verlassen?",
+ "title": "Nicht gespeicherte Änderungen"
+ },
+ "contact": {
+ "country": "Land",
+ "city": "Stadt",
+ "state": "Bundesland",
+ "postal-code": "Postleitzahl",
+ "postal-code-invalid": "Ungültiges Format der Postleitzahl.",
+ "address": "Adresse",
+ "address2": "Adresse 2",
+ "phone": "Telefon",
+ "email": "E-Mail",
+ "no-address": "Keine Adresse"
+ },
+ "common": {
+ "username": "Benutzername",
+ "password": "Passwort",
+ "enter-username": "Benutzername eingeben",
+ "enter-password": "Passwort eingeben",
+ "enter-search": "Suche eingeben"
+ },
+ "content-type": {
+ "json": "Json",
+ "text": "Text",
+ "binary": "Binär (Base64)"
+ },
+ "customer": {
+ "customer": "Kunde",
+ "customers": "Kunden",
+ "management": "Kundenverwaltung",
+ "dashboard": "Kunden Dashboard",
+ "dashboards": "Kunden Dashboards",
+ "devices": "Kundengeräte",
+ "entity-views": "Kunden Entitätsansichten",
+ "assets": "Kundenobjekte",
+ "public-dashboards": "Öffentliche Dashboards",
+ "public-devices": "Öffentliche Geräte",
+ "public-assets": "Öffentliche Objekte",
+ "public-entity-views": "Öffentliche Entitätsansichten",
+ "add": "Kunde hinzufügen",
+ "delete": "Kunde löschen",
+ "manage-customer-users": "Kundenbenutzer verwalten",
+ "manage-customer-devices": "Kundengeräte verwalten",
+ "manage-customer-dashboards": "Kunden-Dashboards verwalten",
+ "manage-public-devices": "Öffentliche Geräte verwalten",
+ "manage-public-dashboards": "Öffentliche Dashboards verwalten",
+ "manage-customer-assets": "Kundenobjekte verwalten",
+ "manage-public-assets": "Öffentliche Objekte verwalten",
+ "add-customer-text": "Neuen Kunden hinzufügen",
+ "no-customers-text": "Keine Kunden gefunden",
+ "customer-details": "Kundendetails",
+ "delete-customer-title": "Sind Sie sicher, dass der Kunde '{{customerTitle}}' gelöscht werden soll?",
+ "delete-customer-text": "Vorsicht, nach Bestätigung wird der Kunde und alle zugehörigen Daten nicht wiederherstellbar gelöscht.",
+ "delete-customers-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Kunde} other {# Kunden} } löschen möchten?",
+ "delete-customers-action-title": "{ count, plural, 1 {1 Kunde} other {# Kunden} } löschen",
+ "delete-customers-text": "Seien Sie vorsichtig, nach der Bestätigung werden alle ausgewählten Kunden und alle zugehörigen Daten nicht wiederherstellbar gelöscht.",
+ "manage-users": "User verwalten",
+ "manage-assets": "Objekte verwalten",
+ "manage-devices": "Geräte verwalten",
+ "manage-dashboards": "Dashboards verwalten",
+ "title": "Titel",
+ "title-required": "Titel ist erforderlich.",
+ "description": "Beschreibung",
+ "details": "Details",
+ "events": "Ereignisse",
+ "copyId": "Kunden-ID kopieren",
+ "idCopiedMessage": "Kunden-ID wurde in die Zwischenablage kopiert",
+ "select-customer": "Kunden auswählen",
+ "no-customers-matching": "Keine Kunden für '{{entity}}' gefunden.",
+ "customer-required": "Kunde ist erforderlich",
+ "select-default-customer": "Wählen Sie den Standardkunden aus.",
+ "default-customer": "Standardkunde",
+ "default-customer-required": "Ein Standardkunde ist erforderlich, um das Dashboard auf Mandantenebene zu testen."
+ },
+ "datetime": {
+ "date-from": "Datum von",
+ "time-from": "Zeit von",
+ "date-to": "Datum bis",
+ "time-to": "Zeit bis"
+ },
+ "dashboard": {
+ "dashboard": "Dashboard",
+ "dashboards": "Dashboards",
+ "management": "Dashboardverwaltung",
+ "view-dashboards": "Dashboards anzeigen",
+ "add": "Dashboard hinzufügen",
+ "assign-dashboard-to-customer": "Dashboard(s) dem Kunden zuordnen",
+ "assign-dashboard-to-customer-text": "Bitte wählen Sie die Dashboards aus, die Sie dem Kunden zuordnen möchten",
+ "assign-to-customer-text": "Bitte wählen Sie den Kunden aus, dem die Dashboards zugeordnet werden sollen",
+ "assign-to-customer": "Kunden zuordnen",
+ "unassign-from-customer": "Zuordnung zum Kunden aufheben",
+ "make-public": "Dashboard öffentlich machen",
+ "make-private": "Dashboard privat machen",
+ "manage-assigned-customers": "Zugeordnete Kunden verwalten",
+ "assigned-customers": "Zugeordnete Kunden",
+ "assign-to-customers": "Dashboard(s) zu Kunden zuweisen",
+ "assign-to-customers-text": "Bitte wählen Sie den Kunden aus, dem Sie das Dashboard(s) zuweisen möchten",
+ "unassign-from-customers": "Zuordnung von Dashboard(s) zu Kunden aufheben",
+ "unassign-from-customers-text": "Bitte wählen Sie die Kunden aus, für die die Zuordnung von Dashboard(s) aufgehoben werden soll",
+ "no-dashboards-text": "Keine Dashboard(s) gefunden",
+ "no-widgets": "Keine Widgets konfiguriert",
+ "add-widget": "Neues Widget hinzufügen",
+ "title": "Titel",
+ "select-widget-title": "Widget auswählen",
+ "select-widget-subtitle": "Liste der verfügbaren Widget-Typen",
+ "delete": "Dashboard löschen",
+ "title-required": "Titel ist erforderlich.",
+ "description": "Beschreibung",
+ "details": "Details",
+ "dashboard-details": "Dashboard-Details",
+ "add-dashboard-text": "Neues Dashboard hinzufügen",
+ "assign-dashboards": "Dashboards zuweisen",
+ "assign-new-dashboard": "Neues Dashboard zuweisen",
+ "assign-dashboards-text": "Zuordnen { count, plural, 1 {1 Dashboard} other {# Dashboards} } zu Kunden",
+ "unassign-dashboards-action-text": "Zuordnung { count, plural, 1 {1 Dashboard} other {# Dashboards} } vom Kunden aufheben",
+ "delete-dashboards": "Dashboards löschen",
+ "unassign-dashboards": "Zuordnung von Dashboards aufheben",
+ "unassign-dashboards-action-title": "Zuordnung { count, plural, 1 {1 Dashboard} other {# Dashboards} } vom Kunden aufheben",
+ "delete-dashboard-title": "Sind Sie sicher, dass Sie das Dashboard '{{dashboardTitle}}' löschen möchten?",
+ "delete-dashboard-text": "Vorsicht, nach Bestätigung werden das Dashboard und alle zugehörigen Daten nicht mehr wiederhergestellt.",
+ "delete-dashboards-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Dashboard} other {# Dashboards} } löschen möchten?",
+ "delete-dashboards-action-title": "Löschen { count, plural, 1 {1 Dashboard} other {# Dashboards} }",
+ "delete-dashboards-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Dashboards entfernt und alle zugehörigen Daten nicht mehr wiederhergestellt.",
+ "unassign-dashboard-title": "Sind Sie sicher, dass Sie die Zuordnung zum Dashboard '{{dashboardTitle}}' aufheben möchten?",
+ "unassign-dashboard-text": "Nach der Bestätigung wird die Zuordnung des Dashboards aufgehoben und es ist für den Kunden nicht mehr zugänglich.",
+ "unassign-dashboard": "Zuordnung zum Kunden aufheben",
+ "unassign-dashboards-title": "Sind Sie sicher, dass Sie die Zuordug aufheben möchten { count, plural, 1 {1 Dashboard} other {# Dashboards} }?",
+ "unassign-dashboards-text": "Nach der Bestätigung wird die Zuordnung aller ausgewählten Dashboards aufgehoben und sie sind für den Kunden nicht mehr zugänglich.",
+ "public-dashboard-title": "Dashboard wurde veröffentlicht",
+ "public-dashboard-text": "Ihr Dashboard {{dashboardTitle}} ist jetzt öffentlich und über nächste Öffentlichkeit zugänglich link:",
+ "public-dashboard-notice": "Note: Vergessen Sie nicht, verwandte Geräte öffentlich zu machen, um auf Ihre Daten zugreifen zu können.",
+ "make-private-dashboard-title": "Sind Sie sicher, dass Sie das Dashboard '{{dashboardTitle}}' privatisieren möchten?",
+ "make-private-dashboard-text": "Nach der Bestätigung wird das Dashboard privatisiert und ist für andere nicht zugänglich.",
+ "make-private-dashboard": "Dashboard privatisieren",
+ "socialshare-text": "'{{dashboardTitle}}' Bereitgestellt vom ThingsBoard",
+ "socialshare-title": "'{{dashboardTitle}}' Bereitgestellt vom ThingsBoard",
+ "select-dashboard": "Dashboard auswählen",
+ "no-dashboards-matching": "Es wurden keine passenden Dashboards '{{entity}}' gefunden.",
+ "dashboard-required": "Dashboard ist erforderlich.",
+ "select-existing": "Existierendes Dashboard auswählen",
+ "create-new": "Neues Dashboard erstellen",
+ "new-dashboard-title": "Neuer Dashboard Titel",
+ "open-dashboard": "Dashboard öffnen",
+ "set-background": "Hintergrund einstellen",
+ "background-color": "Hintergrundfarbe",
+ "background-image": "Hintergrundbild",
+ "background-size-mode": "Hintergrundgrößenmodus",
+ "no-image": "Kein Bild ausgewählt",
+ "drop-image": "Legen Sie ein Bild ab oder klicken Sie, um eine hochzuladende Datei auszuwählen.",
+ "settings": "Einstellungen",
+ "columns-count": "Spalten zählen",
+ "columns-count-required": "Die Anzahl der Spalten ist erforderlich.",
+ "min-columns-count-message": "Es müssen mindestens 10 Spalten vorhanden sein.",
+ "max-columns-count-message": "Es sind maximal 100 Spalten zulässig.",
+ "widgets-margins": "Abstand zwischen den Widgets",
+ "horizontal-margin": "Horizontaler Abstand",
+ "horizontal-margin-required": "Horizontaler Abstandswert ist erforderlich.",
+ "min-horizontal-margin-message": "Der horizontale Abstandswert muss mindestens 0 betragen.",
+ "max-horizontal-margin-message": "Der horizontale Abstandswert beträgt maximal 50.",
+ "vertical-margin": "Vertikaler Abstand",
+ "vertical-margin-required": "Vertikaler Abstandswert ist erforderlich.",
+ "min-vertical-margin-message": "Der vertikale Abstandswert muss mindestens 0 betragen.",
+ "max-vertical-margin-message": "Der vertikale Abstandswert beträgt maximal 50.",
+ "autofill-height": "Layouthöhe automatisch füllen",
+ "mobile-layout": "Mobile Layouteinstellungen",
+ "mobile-row-height": "Mobile Zeilenhöhe, px",
+ "mobile-row-height-required": "Ein mobiler Zeilenhöhenwert ist erforderlich.",
+ "min-mobile-row-height-message": "Der Mindestwert für die mobile Zeilenhöhe beträgt 5 Pixel.",
+ "max-mobile-row-height-message": "Der Höchstwert für die mobile Zeilenhöhe beträgt 200 Pixel.",
+ "display-title": "Display Dashboard Titel",
+ "toolbar-always-open": "Werkzeugleiste geöffnet lassen",
+ "title-color": "Titelfarbe ",
+ "display-dashboards-selection": "Auswahl der Dashboards anzeigen",
+ "display-entities-selection": "Auswahl der Einheiten zulassen",
+ "display-dashboard-timewindow": "Zeitfenster anzeigen",
+ "display-dashboard-export": "Export anzeigen",
+ "import": "Dashboard importieren",
+ "export": "Dashboard exportieren",
+ "export-failed-error": "Dashboard kann nicht exportiert werden: {{error}}",
+ "create-new-dashboard": "Neues Dashboard erstellen",
+ "dashboard-file": "Dashboard-Datei",
+ "invalid-dashboard-file-error": "Dashboard kann nicht importiert werden: Ungültige Dashboard-Datenstruktur.",
+ "dashboard-import-missing-aliases-title": "Konfigurieren Sie die von importierten Dashboards verwendeten Aliasnamen",
+ "create-new-widget": "Neues Widget erstellen",
+ "import-widget": "Widget importieren",
+ "widget-file": "Widget-Datei",
+ "invalid-widget-file-error": "Widget kann nicht importiert werden: Ungültige Widget-Datenstruktur.",
+ "widget-import-missing-aliases-title": "Konfigurieren Sie die von importierten Widgets verwendeten Aliase",
+ "open-toolbar": "Dashboard-Werkzeugleiste öffnen",
+ "close-toolbar": "Werkzeugleiste schließen",
+ "configuration-error": "Konfigurationsfehler",
+ "alias-resolution-error-title": "Konfigurationsfehler für Dashboard-Aliasnamen",
+ "invalid-aliases-config": "Es konnten keine Geräte gefunden werden, die mit dem Aliase-Filter übereinstimmen.
Bitte wenden Sie sich an Ihren Administrator, um dieses problem zu beheben.",
+ "select-devices": "Geräte auswählen",
+ "assignedToCustomer": "Dem Kunden zugewiesen",
+ "assignedToCustomers": "Kunden zugwiesen",
+ "public": "Öffentlich",
+ "public-link": "Öffentlicher Link",
+ "copy-public-link": "Öffentlichen Link kopieren",
+ "public-link-copied-message": "Der öffentliche Link des Dashboards wurde in die Zwischenablage kopiert",
+ "manage-states": "Dashboard-Status verwalten",
+ "states": "Dashboard-Status",
+ "search-states": "Dashboard-Status suchen",
+ "selected-states": "{ count, plural, 1 {1 dashboard state} other {# dashboard states} } ausgewählt",
+ "edit-state": "Dashboard-Status bearbeiten",
+ "delete-state": "Dashboard-Status löschen",
+ "add-state": "Dashboard-Status hinzufügen",
+ "state": "Dashboard-Status",
+ "state-name": "Name",
+ "state-name-required": "Name des Dashboard-Status ist erforderlich.",
+ "state-id": "Status-Id",
+ "state-id-required": "Dashboard-Status-ID ist erforderlich.",
+ "state-id-exists": "Dashboard-Status mit derselben ID ist bereits vorhanden .",
+ "is-root-state": "Grundzustand",
+ "delete-state-title": "Dashboard-Status löschen",
+ "delete-state-text": "Sind Sie sicher, dass Sie den Dashboard-Status '{{stateName}}' löschen möchten?",
+ "show-details": "Details anzeigen",
+ "hide-details": "Details ausblenden",
+ "select-state": "Soll-Zustand auswählen",
+ "state-controller": "Zustandssteuerung"
+ },
+ "datakey": {
+ "settings": "Einstellungen",
+ "advanced": "Erweitert",
+ "label": "Bezeichnung",
+ "color": "Farbe",
+ "units": "Maßeinheit die neben dem Wert angezeigt wird",
+ "decimals": "Anzahl der Stellen nach dem Komma",
+ "data-generation-func": "Daten generieren",
+ "use-data-post-processing-func": "Datenverarbeitungsfunktion verwenden",
+ "configuration": "Datenschlüsselkonfiguration",
+ "timeseries": "Zeitreihe",
+ "attributes": "Eigenschaften",
+ "alarm": "Alarmfelder",
+ "timeseries-required": "Entity-Zeitreihen sind erforderlich.",
+ "timeseries-or-attributes-required": "Entity-Zeitreihen/Eigenschaften sind erforderlich.",
+ "maximum-timeseries-or-attributes": "Maximum { count, plural, 1 {1 Zeitreihe/Eigenschaft ist erlaubt} other {# Zeitreihen/Eigenschaften sind erlaubt} }.",
+ "alarm-fields-required": "Alarmfelder sind erforderlich.",
+ "function-types": "Funktionsarten",
+ "function-types-required": "Funktionstypen sind erforderlich.",
+ "maximum-function-types": "Maximal { count, plural, 1 {1 Funktionstyp ist erlaubt} other {# Funktionstypen sind erlaubt} }.",
+ "time-description": "Zeitstempel des aktuellen Wertes;",
+ "value-description": "Der aktuelle Wert;",
+ "prev-value-description": "Ergebnis des vorherigen Funktionsaufrufs;",
+ "time-prev-description": "Zeitmarke des vorherigen Wertes;",
+ "prev-orig-value-description": "Ursprünglicher vorheriger Wert;"
+ },
+ "datasource": {
+ "type": "Datenquellentyp",
+ "name": "Name",
+ "add-datasource-prompt": "Bitte Datenquelle hinzufügen"
+ },
+ "details": {
+ "edit-mode": "Bearbeitungsmodus",
+ "toggle-edit-mode": "Bearbeitungsmodus umschalten"
+ },
+ "device": {
+ "device": "Gerät",
+ "device-required": "Gerät ist erforderlich.",
+ "devices": "Geräte",
+ "management": "Geräte verwalten",
+ "view-devices": "Geräte anzeigen",
+ "device-alias": "Geräte-Alias",
+ "aliases": "Gerätealiasnamen",
+ "no-alias-matching": "'{{alias}}' nicht gefunden.",
+ "no-aliases-found": "Keine Aliase gefunden.",
+ "no-key-matching": "'{{key}}' nicht gefunden.",
+ "no-keys-found": "Keine Schlüssel gefunden.",
+ "create-new-alias": "Neues Alias erstellen!",
+ "create-new-key": "Neuen Schlüssel erstellen!",
+ "duplicate-alias-error": "Doppelter Alias gefunden '{{alias}}'.
Gerätealiasnamen müssen innerhalb des Dashboards eindeutig sein.",
+ "configure-alias": "Alias '{{alias}}' konfigurieren",
+ "no-devices-matching": "Keine passenden Geräte '{{entity}}' gefunden.",
+ "alias": "Alias",
+ "alias-required": "Geräte-Alias ist erforderlich.",
+ "remove-alias": "Geräte-Alias entfernen",
+ "add-alias": "Geräte-Alias hinzufügen",
+ "name-starts-with": "Gerätename beginnt mit",
+ "device-list": "Geräteliste",
+ "use-device-name-filter": "Filter verwenden",
+ "device-list-empty": "Keine Geräte ausgewählt.",
+ "device-name-filter-required": "Der Gerätenamefilter ist erforderlich.",
+ "device-name-filter-no-device-matched": "Keine Geräte beginnend mit '{{device}}' gefunden.",
+ "add": "Gerät hinzufügen",
+ "assign-to-customer": "Kunden zuordnen",
+ "assign-device-to-customer": "Gerät(e) dem Kunden zuordnen",
+ "assign-device-to-customer-text": "Bitte wählen Sie die Geräte aus, die Sie dem Kunden zuordnen möchten",
+ "make-public": "Gerät veröffentlichen",
+ "make-private": "Gerät privatisieren",
+ "no-devices-text": "Keine Geräte gefunden",
+ "assign-to-customer-text": "Bitte wählen Sie einen Kunden aus, dem die Geräte zugeordnet werden sollen",
+ "device-details": "Gerätedetails",
+ "add-device-text": "Neues Gerät hinzufügen",
+ "credentials": "Zugangsdaten",
+ "manage-credentials": "Zugangsdaten verwalten",
+ "delete": "Gerät löschen",
+ "assign-devices": "Gerät zuordnen",
+ "assign-devices-text": "{ count, plural, 1 {1 Gerät} other {# Geräte} } dem Kunden zuordnen",
+ "delete-devices": "Geräte löschen",
+ "unassign-from-customer": "Zuordnung zum Kunden aufheben",
+ "unassign-devices": "Nicht zugeordnete Geräte",
+ "unassign-devices-action-title": "Zuordnung von { count, plural, 1 {1 Gerät} other {# Geräte} } zum Kunden aufheben",
+ "assign-new-device": "Neues Gerät zuordnen",
+ "make-public-device-title": "Sind Sie sicher, dass Sie das Gerät '{{deviceName}}' öffentlich machen möchten?",
+ "make-public-device-text": "Nach der Bestätigung werden das Gerät und dessen Daten öffentlich und für andere zugänglich.",
+ "make-private-device-title": "Sind Sie sicher, dass Sie das Gerät '{{deviceName}}' privat machen möchten?",
+ "make-private-device-text": "Nach der Bestätigung werden das Gerät und dessen Daten privat und sind für andere nicht mehr zugänglich.",
+ "view-credentials": "Zugangsdaten anzeigen",
+ "delete-device-title": "Möchten Sie das Gerät '{{deviceName}}' wirklich löschen?",
+ "delete-device-text": "Vorsicht, nach Bestätigung werden das Gerät und alle zugehörigen Daten nicht mehr wiederhergestellt.",
+ "delete-devices-title": "Sind Sie sicher, dass Sie löschen möchten { count, plural, 1 {1 Gerät} other {# Geräte} }?",
+ "delete-devices-action-title": "Löschen { count, plural, 1 {1 Gerät} other {# Geräte} }",
+ "delete-devices-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Geräte entfernt und alle zugehörigen Daten werden nicht mehr wiederhergestellt.",
+ "unassign-device-title": "Sind Sie sicher, dass Sie die Zuordnung zum Gerät '{{deviceName}}' wirklich aufheben möchten?",
+ "unassign-device-text": "Nach der Bestätigung ist das Gerät nicht zugeordnet und für den Kunden nicht zugänglich.",
+ "unassign-device": "Nicht zugeordnete Geräte",
+ "unassign-devices-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Gerät} other {# Geräte} } nicht mehr zuordnen möchten?",
+ "unassign-devices-text": "Nach der Bestätigung werden alle ausgewählten Geräte nicht zugewiesen und sind für den Kunden nicht zugänglich.",
+ "device-credentials": "Geräte Zugangsdaten",
+ "credentials-type": "Art der Zugangsdaten",
+ "access-token": "Zugangs-Token",
+ "access-token-required": "Zugangs-Token ist erforderlich.",
+ "access-token-invalid": "Die Länge des Zugangs-Tokens muss zwischen 1 und 20 Zeichen betragen.",
+ "rsa-key": "RSA öffentlicher Schlüssel",
+ "rsa-key-required": "RSA öffentlicher Schlüssel ist erforderlich.",
+ "secret": "Geheimnis",
+ "secret-required": "Geheimnis ist erforderlich.",
+ "device-type": "Gerätetyp",
+ "device-type-required": "Gerätetyp ist erforderlich.",
+ "select-device-type": "Gerätetyp auswählen",
+ "enter-device-type": "Gerätetyp eingeben",
+ "any-device": "Jedes Gerät",
+ "no-device-types-matching": "Keine passenden Gerätetypen '{{entitySubtype}}' gefunden.",
+ "device-type-list-empty": "Kein Gerätetyp ausgewählt.",
+ "device-types": "Gerätetypen",
+ "name": "Name",
+ "name-required": "Name ist erforderlich.",
+ "description": "Beschreibung",
+ "events": "Ereignisse",
+ "details": "Details",
+ "copyId": "Geräte-ID kopieren",
+ "copyAccessToken": "Zugangs-Token kopieren",
+ "idCopiedMessage": "Geräte-ID wurde in die Zwischenablage kopiert",
+ "accessTokenCopiedMessage": "Geräte-Zugangs-Token wurde in die Zwischenablage kopiert",
+ "assignedToCustomer": "Dem Kunden zuordnen",
+ "unable-delete-device-alias-title": "Geräte-Alias kann nicht gelöscht werden",
+ "unable-delete-device-alias-text": "Geräte-Alias '{{deviceAlias}}' kann nicht gelöscht werden, da er von den folgenden Widgets verwendet wird:
{{widgetsList}}",
+ "is-gateway": "Ist ein Gateway",
+ "public": "Öffentlich",
+ "device-public": "Gerät ist öffentlich",
+ "select-device": "Gerät auswählen"
+ },
+ "dialog": {
+ "close": "Dialog schließen"
+ },
+ "error": {
+ "unable-to-connect": "Es konnte keine Verbindung zum Server hergestellt werden! Bitte überprüfen Sie Ihre Internetverbindung.",
+ "unhandled-error-code": "Unbehandelter Fehlercode: {{errorCode}}",
+ "unknown-error": "Unbekannter Fehler"
+ },
+ "entity": {
+ "entity": "Entität",
+ "entities": "Entitäten",
+ "aliases": "Entitäts-Aliasnamen",
+ "entity-alias": "Entitätsalias",
+ "unable-delete-entity-alias-title": "Alias der Entität kann nicht gelöscht werden",
+ "unable-delete-entity-alias-text": "Alias der Entität '{{entityAlias}}' kann nicht gelöscht werden, da es von den folgenden Widget(s) verwendet wird:
{{widgetsList}}",
+ "duplicate-alias-error": "Doppelte Alias gefunden '{{alias}}'.
Die Aliase der Entität müssen innerhalb des Dashboards eindeutig sein.",
+ "missing-entity-filter-error": "Fehlender Filter für Alias '{{alias}}'.",
+ "configure-alias": "Alias '{{alias}}' konfigurieren",
+ "alias": "Alias",
+ "alias-required": "Alias der Entität ist erforderlich.",
+ "remove-alias": "Alias der Entität entfernen",
+ "add-alias": "Alias der Entität erforderlich",
+ "entity-list": "Entitätsliste",
+ "entity-type": "Entitätstyp",
+ "entity-types": "Entitätstypen",
+ "entity-type-list": "Liste der Entitätstyp",
+ "any-entity": "Jede Entität",
+ "enter-entity-type": "Entitätstyp eingeben",
+ "no-entities-matching": "Keine passenden Entitäten für '{{entity}}' gefunden.",
+ "no-entity-types-matching": "Keine passende Entitätstypen für '{{entityType}}' gefunden.",
+ "name-starts-with": "Name beginnt mit",
+ "use-entity-name-filter": "Filter verwenden",
+ "entity-list-empty": "Keine Entitäten ausgewählt.",
+ "entity-type-list-empty": "Keine Entitättypen ausgewählt.",
+ "entity-name-filter-required": "Entitätsnamenfilter ist erforderlich.",
+ "entity-name-filter-no-entity-matched": "Keine Entitäten beginnend mit '{{entity}}' gefunden.",
+ "all-subtypes": "Alle",
+ "select-entities": "Entitäten auswählen",
+ "no-aliases-found": "Keine Aliase gefunden.",
+ "no-alias-matching": "'{{alias}}' nicht gefunden.",
+ "create-new-alias": "Erstellen Sie einen neuen Alias!",
+ "key": "Schlüssel",
+ "key-name": "Name des Schlüssels",
+ "no-keys-found": "Kein Schlüssel gefunden.",
+ "no-key-matching": "'{{key}}' nicht gefunden.",
+ "create-new-key": "Erstellen Sie einen neuen Schlüssel!",
+ "type": "Typ",
+ "type-required": "Typ der Entität ist erforderlich.",
+ "type-device": "Gerät",
+ "type-devices": "Geräte",
+ "list-of-devices": "{ count, plural, 1 {Ein Gerät} other {Liste von # Geräten} }",
+ "device-name-starts-with": "Geräte beginnend mit '{{prefix}}'",
+ "type-asset": "Objekt",
+ "type-assets": "Objekte",
+ "list-of-assets": "{ count, plural, 1 {Ein Objekt} other {Liste von # Objekten} }",
+ "asset-name-starts-with": "Objekte beginnend mit '{{prefix}}'",
+ "type-entity-view": "Entitätsansicht",
+ "type-entity-views": "Entitätsansichten",
+ "list-of-entity-views": "{ count, plural, 1 {Eine Entitätsansicht} other {Liste von # Entitätsansichten} }",
+ "entity-view-name-starts-with": "Entitätsansichten beginnend mit'{{prefix}}'",
+ "type-rule": "Regel",
+ "type-rules": "Regeln",
+ "list-of-rules": "{ count, plural, 1 {Eine Regel} other {Liste von # Regeln} }",
+ "rule-name-starts-with": "Regeln beginnend mit '{{prefix}}'",
+ "type-plugin": "Plugin",
+ "type-plugins": "Plugins",
+ "list-of-plugins": "{ count, plural, 1 {Ein Plugin} other {Liste von # Plugins} }",
+ "plugin-name-starts-with": "Plugins beginnend mit '{{prefix}}'",
+ "type-tenant": "Mandant",
+ "type-tenants": "Mandanten",
+ "list-of-tenants": "{ count, plural, 1 {Ein Mandant} other {Liste von # Mandanten} }",
+ "tenant-name-starts-with": "Mandanten beginnend mit '{{prefix}}'",
+ "type-customer": "Kunde",
+ "type-customers": "Kunden",
+ "list-of-customers": "{ count, plural, 1 {Ein Kunde} other {Liste von # Kunden} }",
+ "customer-name-starts-with": "Kunden beginnend mit '{{prefix}}'",
+ "type-user": "Benutzer",
+ "type-users": "Benutzer",
+ "list-of-users": "{ count, plural, 1 {Ein Benutzer} other {Liste von # Benutzern} }",
+ "user-name-starts-with": "Benutzer beginnend mit '{{prefix}}'",
+ "type-dashboard": "Dashboard",
+ "type-dashboards": "Dashboards",
+ "list-of-dashboards": "{ count, plural, 1 {Ein Dashboard} other {Liste von # Dashboards} }",
+ "dashboard-name-starts-with": "Dashboards beginnend mit '{{prefix}}'",
+ "type-alarm": "Alarm",
+ "type-alarms": "Alarme",
+ "list-of-alarms": "{ count, plural, 1 {Ein Alarm} other {Liste von # Alarmen} }",
+ "alarm-name-starts-with": "Alarme, beginnend mit '{{prefix}}'",
+ "type-rulechain": "Regelkette",
+ "type-rulechains": "Regelketten",
+ "list-of-rulechains": "{ count, plural, 1 {Eine Regelkette} other {Liste von # Regelketten} }",
+ "rulechain-name-starts-with": "Regelketten beginnend mit '{{prefix}}'",
+ "type-rulenode": "Regelknoten",
+ "type-rulenodes": "Regelknoten",
+ "list-of-rulenodes": "{ count, plural, 1 {Ein Regelknoten} other {Liste von # Regelknoten} }",
+ "rulenode-name-starts-with": "Regelknoten beginnend mit '{{prefix}}'",
+ "type-current-customer": "Aktueller Kunde",
+ "search": "Entitäten suchen",
+ "selected-entities": "{ count, plural, 1 {Entität} other {# Entitäten} } ausgewählt",
+ "entity-name": "Entitätsname",
+ "details": "Entitätsdetails",
+ "no-entities-prompt": "Keine Entitäten gefunden",
+ "no-data": "Keine Daten zum Anzeigen",
+ "columns-to-display": "Anzuzeigende Spalten"
+ },
+ "entity-view": {
+ "entity-view": "Entitätsansicht",
+ "entity-view-required": "Entitätsansicht ist erforderlich.",
+ "entity-views": "Entitätsansichten",
+ "management": "Entitätsansichten verwalten",
+ "view-entity-views": "Entitätsansichten anzeigen",
+ "entity-view-alias": "Entitätsansichtsalias",
+ "aliases": "Entitätsansichten-Aliase",
+ "no-alias-matching": "'{{alias}}' nicht gefunden.",
+ "no-aliases-found": "Keine Aliase gefunden.",
+ "no-key-matching": "'{{key}}' nicht gefunden.",
+ "no-keys-found": "Keine Schlüssel gefunden.",
+ "create-new-alias": "Neuen Alias erstellen!",
+ "create-new-key": "Neuen Schlüssel erstellen!",
+ "duplicate-alias-error": "Doppelter Alias gefunden '{{alias}}'.
Aliase der Entitätsansicht müssen innerhalb des Dashboards eindeutig sein.",
+ "configure-alias": "Alias '{{alias}}' konfigurieren",
+ "no-entity-views-matching": "Keine passenden Entitätsansichten für '{{entity}}' gefunden.",
+ "alias": "Alias",
+ "alias-required": "Alias der Entitätsansicht erforderlich.",
+ "remove-alias": "Alias der Entitätsansicht entfernen",
+ "add-alias": "Alias für die Entitätsansicht hinzufügen",
+ "name-starts-with": "Entitätsansichtsname beginnend mit",
+ "entity-view-list": "Liste der Entitätsansichten",
+ "use-entity-view-name-filter": "Filter anwenden",
+ "entity-view-list-empty": "Keine der Entitätsansichten ausgewählt.",
+ "entity-view-name-filter-required": "Filterung nach Entitätsansichtenname erforderlich.",
+ "entity-view-name-filter-no-entity-view-matched": "Keine Entitätsansichten beginnend mit '{{entityView}}' wurden gefunden.",
+ "add": "Entitätsansicht hinzufügen",
+ "assign-to-customer": "Einem Kunden zuordnen",
+ "assign-entity-view-to-customer": "Entitätsansichten dem Kunden zuordnen",
+ "assign-entity-view-to-customer-text": "Bitte wählen Sie die Entitätsansichten aus, die dem Kunden zugeordnet werden sollen",
+ "no-entity-views-text": "Keine Entitätsansichten gefunden",
+ "assign-to-customer-text": "Bitte wählen Sie den Kunden aus, dem die Entitätsansichten zugeordnet werden sollen",
+ "entity-view-details": "Details der Entitätsansicht",
+ "add-entity-view-text": "Neue Entitätsansicht hinzufügen",
+ "delete": "Entitätsansicht löschen",
+ "assign-entity-views": "Entitätsansicht zuordnen",
+ "assign-entity-views-text": "Dem Kunden { count, plural, 1 {1 Entitätsansicht} other {# Entitätsansichten} } zuordnen",
+ "delete-entity-views": "Entitätsansichten löschen",
+ "unassign-from-customer": "Zuordnung zum Kunden aufheben",
+ "unassign-entity-views": "Zuordnung der Entitätsansichten aufheben",
+ "unassign-entity-views-action-title": "Die Zuordnung { count, plural, 1 {1 Entitätsansicht} other {# Entitätsansichten} } zum Kunden aufheben",
+ "assign-new-entity-view": "Neue Entitätsansicht zuordnen",
+ "delete-entity-view-title": "Möchten Sie die Entitätsansicht wirklich löschen '{{entityViewName}}'?",
+ "delete-entity-view-text": "Seien Sie vorsichtig, nach der Bestätigung werden die Entitätsansicht und alle zugehörigen Daten nicht wiederhergestellt.",
+ "delete-entity-views-title": "Sind Sie sicher, dass Sie die Entitätsansichten löschen möchten { count, plural, 1 {1 Entitätsansicht} other {# Entitätsansichten} }?",
+ "delete-entity-views-action-title": "Löschen { count, plural, 1 {1 Entitätsansicht} other {# Entitätsansichten} }",
+ "delete-entity-views-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Entitätsansichten entfernt und alle zugehörigen Daten werden nicht wiederhergestellt.",
+ "unassign-entity-view-title": "Möchten Sie die Zuordnung der Entitätsansicht '{{entityViewName}}' wirklich aufheben?",
+ "unassign-entity-view-text": "Nach der Bestätigung wird die Zuordnung der Entitätsansicht aufgehoben und ist für den Kunden nicht mehr zugänglich.",
+ "unassign-entity-view": "Zuordnung der Entitätsansicht aufheben",
+ "unassign-entity-views-title": "Sind Sie sicher, dass Sie die Zuordnung aufheben möchten { count, plural, 1 {1 Entitätsansicht} other {# Entitätsansichten} }?",
+ "unassign-entity-views-text": "Nach der Bestätigung werden die Zuordnungen der ausgewählten Entitätsansichten aufgehoben und sind für den Kunden nicht mehr zugänglich.",
+ "entity-view-type": "Entitätsansichtstyp",
+ "entity-view-type-required": "Entitätsansichtstyp ist erforderlich.",
+ "select-entity-view-type": "Entitätsansichtstyp auswählen",
+ "enter-entity-view-type": "Entitätsansichtstyp eingeben",
+ "any-entity-view": "Jede Entitätsansicht",
+ "no-entity-view-types-matching": "Es wurden keine passenden Entitätsansichtstypen für '{{entitySubtype}}' gefunden.",
+ "entity-view-type-list-empty": "Keine Entitätsansichtstypen ausgewählt.",
+ "entity-view-types": "Entitätsansichtstypen",
+ "name": "Name",
+ "name-required": "Name ist erforderlich.",
+ "description": "Beschreibung",
+ "events": "Ereignisse",
+ "details": "Details",
+ "copyId": "Entitätsansichts-ID kopieren",
+ "assignedToCustomer": "Dem Kunden zuordnen",
+ "unable-entity-view-device-alias-title": "Alias der Entitätsansicht kann nicht gelöscht werden",
+ "unable-entity-view-device-alias-text": "Geräte-Alias '{{entityViewAlias}}' kann nicht gelöscht werden, da es von den folgenden widget(s):
{{widgetsList}} verwendet wird",
+ "select-entity-view": "Entitätsansicht auswählen",
+ "make-public": "Entitätsansicht öffentlich machen",
+ "start-date": "Start-Datum",
+ "start-ts": "Start-Zeit",
+ "end-date": "Ende-Datum",
+ "end-ts": "Ende-Zeit",
+ "date-limits": "Datumslimits",
+ "client-attributes": "Client Eigenschaften",
+ "shared-attributes": "Gemeinsame Eigenschaften",
+ "server-attributes": "Server Eigenschaften",
+ "timeseries": "Zeitreihe",
+ "client-attributes-placeholder": "Client Eigenschaften",
+ "shared-attributes-placeholder": "Gemeinsame Eigenschaften",
+ "server-attributes-placeholder": "Server Eigenschaften",
+ "timeseries-placeholder": "Zeitreihe",
+ "target-entity": "Zielentität",
+ "attributes-propagation": "Eigenschaftsübertragung",
+ "attributes-propagation-hint": "Die Entitätsansicht kopiert automatisch die angegebenen Eigenschaften der Ziel-Entität, wenn Sie diese Entitätsansicht speichern oder aktualisieren. Aus Performance-Gründen werden die Attribute der Ziel-Entität nicht bei jeder Eigenschaftsänderung in die Entitätsansicht übertragen. Sie können die automatische Weitergabe aktivieren, indem Sie den Regelknoten \"copy to view\" in Ihrer Regelkette konfigurieren und die Nachrichten \"Post attributes\" und \"Attributes updated\" mit dem neuen Regelknoten verknüpfen.",
+ "timeseries-data": "Zeitreihendaten",
+ "timeseries-data-hint": "Konfigurieren Sie die Datensatzschlüssel der Zeitreihe der Zielentität, auf die die Entitätsansicht zugreifen kann. Die Daten dieser Zeitreihe sind schreibgeschützt."
+ },
+ "event": {
+ "event-type": "Ereignistyp",
+ "type-error": "Fehler",
+ "type-lc-event": "Lebenszyklusereignis",
+ "type-stats": "Statistiken",
+ "type-debug-rule-node": "Fehlersuche",
+ "type-debug-rule-chain": "Fehlersuche",
+ "no-events-prompt": "Keine Ereignisse gefunden",
+ "error": "Fehler",
+ "alarm": "Alarm",
+ "event-time": "Ereigniszeit",
+ "server": "Server",
+ "body": "Inhalt",
+ "method": "Methode",
+ "type": "Typ",
+ "entity": "Entität",
+ "message-id": "Nachrichten-Id",
+ "message-type": "Nachrichten-Typ",
+ "data-type": "Datentyp",
+ "relation-type": "Beziehungstyp",
+ "metadata": "Meta-Daten",
+ "data": "Daten",
+ "event": "Ereignis",
+ "status": "Status",
+ "success": "Erfolg",
+ "failed": "Fehlgeschlagen",
+ "messages-processed": "Nachrichten verarbeitet",
+ "errors-occurred": "Fehler aufgetreten"
+ },
+ "extension": {
+ "extensions": "Erweiterungen",
+ "selected-extensions": "{ count, plural, 1 {Erweiterung} other {# extensions} } ausgewählt",
+ "type": "Typ",
+ "key": "Schlüssel",
+ "value": "Wert",
+ "id": "ID",
+ "extension-id": "Erweiterungs-ID",
+ "extension-type": "Erweiterungstyp",
+ "transformer-json": "JSON *",
+ "unique-id-required": "Die aktuelle Erweiterungs-ID ist bereits vorhanden.",
+ "delete": "Erweiterung löschen",
+ "add": "Erweiterung hinzufügen",
+ "edit": "Erweiterung bearbeiten",
+ "delete-extension-title": "Möchten Sie die Erweiterung '{{extensionId}}' wirklich löschen?",
+ "delete-extension-text": "Vorsicht, nach Bestätigung werden die Erweiterung und alle zugehörigen Daten nicht wiederhergestellt.",
+ "delete-extensions-title": "Möchten Sie wirklich löschen? { count, plural, 1 {1 extension} other {# extensions} }?",
+ "delete-extensions-text": "Vorsicht, nach der Bestätigung werden alle ausgewählten Erweiterungen entfernt.",
+ "converters": "Konverter",
+ "converter-id": "Konverter-ID",
+ "configuration": "Konfiguration",
+ "converter-configurations": "Konvertierte Konfigurationen",
+ "token": "Sicherheitszeichen",
+ "add-converter": "Konverter hinzufügen",
+ "add-config": "Konvertierte Konfigurationen hinzufügen",
+ "device-name-expression": "Angabe des Gerätenamens",
+ "device-type-expression": "Angabe des Gerätetyps",
+ "custom": "Regel",
+ "to-double": "Duplizieren",
+ "transformer": "Transformator",
+ "json-required": "Transformer json ist erforderlich.",
+ "json-parse": "Transformer json kann nicht analysiert werden.",
+ "attributes": "Eigenschaften",
+ "add-attribute": "Eigenschaften hinzufügen",
+ "add-map": "Mapping-Element hinzufügen",
+ "timeseries": "Zeitreihe",
+ "add-timeseries": "Zeitreihe hinzufügen",
+ "field-required": "Feld ist erforderlich",
+ "brokers": "Vermittler",
+ "add-broker": "Vermittler hinzufügen",
+ "host": "Host",
+ "port": "Port",
+ "port-range": "Der Port sollte im Bereich von 1 bis 65535 liegen.",
+ "ssl": "Ssl",
+ "credentials": "Zugangsdaten",
+ "username": "Benutzername",
+ "password": "Passwort",
+ "retry-interval": "Wiederholungsintervall in Millisekunden",
+ "anonymous": "Anonym",
+ "basic": "Basic",
+ "pem": "PEM",
+ "ca-cert": "CA-Zertifikatsdatei *",
+ "private-key": "Privatschlüsseldatei *",
+ "cert": "Zertifikatsdatei *",
+ "no-file": "Keine Datei ausgewählt.",
+ "drop-file": "Legen Sie eine Datei ab oder wählen Sie eine Datei aus um diese hochzuladen.",
+ "mapping": "Mapping",
+ "topic-filter": "Themenfilter",
+ "converter-type": "Konvertierungstyp",
+ "converter-json": "Json",
+ "json-name-expression": "Angabe des Gerätenamens json",
+ "topic-name-expression": "Themenangabe des Gerätenamens",
+ "json-type-expression": "Angabe des Gerätenamens json",
+ "topic-type-expression": "Themenangabe des Gerätetyps",
+ "attribute-key-expression": "Angabe des Eigenschaftenschlüssels",
+ "attr-json-key-expression": "Angabe des Eigenschaftenschlüssels",
+ "attr-topic-key-expression": "Themenangabe des Eigenschaftenschlüssels",
+ "request-id-expression": "ID-Angabe anfordern",
+ "request-id-json-expression": "ID-Angabe anforern json",
+ "request-id-topic-expression": "Themenangabe der ID anfordern",
+ "response-topic-expression": "Antwort Themenangabe",
+ "value-expression": "Wertangabe",
+ "topic": "Thema",
+ "timeout": "Unterbrechung in Millisekunden",
+ "converter-json-required": "Konvertierte json ist erforderlich.",
+ "converter-json-parse": "Konvertierte json konnte nicht analysiert werden.",
+ "filter-expression": "Filterangabe",
+ "connect-requests": "Abfragen verbinden",
+ "add-connect-request": "Verbindungsabfrage hinzufügen",
+ "disconnect-requests": "Abfrage trennen",
+ "add-disconnect-request": "Trennung der Abfrage hinzufügen",
+ "attribute-requests": "Abfrage der Eigenschaften",
+ "add-attribute-request": "Abfrage der Eigenschaften hinzufügen",
+ "attribute-updates": "Aktualisierungen der Eigenschaften",
+ "add-attribute-update": "Aktualisierung der Eigenschaften hinzufügen",
+ "server-side-rpc": "Serverseite RPC",
+ "add-server-side-rpc-request": "Abfrage der Serverseite RPC hinzufügen",
+ "device-name-filter": "Gerätenamefilter",
+ "attribute-filter": "Eigenschaftenfilter",
+ "method-filter": "Methodenfilter",
+ "request-topic-expression": "Themenabgabe anfordern",
+ "response-timeout": "Antwortzeit in Millisekunden",
+ "topic-expression": "Themenangabe",
+ "client-scope": "Kundenumfrage",
+ "add-device": "Gerät hinzufügen",
+ "opc-server": "Servers",
+ "opc-add-server": "Server hinzufügen",
+ "opc-add-server-prompt": "Bitte einen Server hinzufügen",
+ "opc-application-name": "Anwendungsname",
+ "opc-application-uri": "Anwendung uri",
+ "opc-scan-period-in-seconds": "Scanzeitraum in Sekunden",
+ "opc-security": "Sicherheit",
+ "opc-identity": "Identifizierung",
+ "opc-keystore": "Schlüsselspeicher",
+ "opc-type": "Typ",
+ "opc-keystore-type": "Typ",
+ "opc-keystore-location": "Standort *",
+ "opc-keystore-password": "Passwort",
+ "opc-keystore-alias": "Alias",
+ "opc-keystore-key-password": "Schlüsselpasswort",
+ "opc-device-node-pattern": "Geräteknotenmuster",
+ "opc-device-name-pattern": "Gerätenamensmuster",
+ "modbus-server": "Servers/Folgegerät",
+ "modbus-add-server": "Server/Folgegerät hinzufügen",
+ "modbus-add-server-prompt": "Bitte Server/Folgegerät hinzufügen",
+ "modbus-transport": "Transport",
+ "modbus-tcp-reconnect": "Verbindung automatisch wiederherstellen",
+ "modbus-rtu-over-tcp": "RTU über TCP",
+ "modbus-port-name": "Name des Seriellen Anschlusses",
+ "modbus-encoding": "Verschlüsselung",
+ "modbus-parity": "Übereinstimmung",
+ "modbus-baudrate": "Datenübertragungsgeschwindigkeit",
+ "modbus-databits": "Daten Bits",
+ "modbus-stopbits": "Stopp-Bits",
+ "modbus-databits-range": "Datenbits sollten im Bereich von 7 bis 8 liegen.",
+ "modbus-stopbits-range": "Stoppbits sollten im Bereich von 1 bis 2 liegen.",
+ "modbus-unit-id": "ID der Einheit",
+ "modbus-unit-id-range": "Die Einheiten-ID sollte im Bereich von 1 bis 247 liegen.",
+ "modbus-device-name": "Gerätename",
+ "modbus-poll-period": "Abfragezeitraum in Millisekunden",
+ "modbus-attributes-poll-period": "Abfrageintervall der Eigenschaften in Millisekunden",
+ "modbus-timeseries-poll-period": "Abfrageintervall der Zeitreihen in Millisekunden",
+ "modbus-poll-period-range": "Das Abfrageintervall sollte einen positiven Wert haben.",
+ "modbus-tag": "Kennzeichnung",
+ "modbus-function": "Funktion",
+ "modbus-register-address": "Registeradresse",
+ "modbus-register-address-range": "Die Registeradresse sollte im Bereich zwischen 0 und 65535 liegen.",
+ "modbus-register-bit-index": "Bitindex",
+ "modbus-register-bit-index-range": "Der Bitindex sollte im Bereich von 0 bis 15 liegen.",
+ "modbus-register-count": "Registeranzahl",
+ "modbus-register-count-range": "Die Registeranzahl sollten einen positiven Wert haben.",
+ "modbus-byte-order": "Byte-Reihenfolge",
+ "sync": {
+ "status": "Status",
+ "sync": "Synchronisiert",
+ "not-sync": "Nicht synchronisiert",
+ "last-sync-time": "Zeit der letzten Synchronisierung",
+ "not-available": "Nicht verfügbar"
+ },
+ "export-extensions-configuration": "Erweiterungskonfiguration exportieren",
+ "import-extensions-configuration": "Erweiterungskonfiguration importieren",
+ "import-extensions": "Erweiterungen importieren",
+ "import-extension": "Erweiterung importieren",
+ "export-extension": "Erweiterung exportieren",
+ "file": "Erweiterungsdatei",
+ "invalid-file-error": "Ungültige Erweiterungsdatei"
+ },
+ "fullscreen": {
+ "expand": "Auf Vollbildmodus erweitern",
+ "exit": "Vollbildmodus verlassen",
+ "toggle": "Vollbildmodus umschalten",
+ "fullscreen": "Vollbild"
+ },
+ "function": {
+ "function": "Funktion"
+ },
+ "grid": {
+ "delete-item-title": "Möchten Sie dieses Element wirklich löschen?",
+ "delete-item-text": "Vorsicht, nach Bestätigung wird das Element und alle zugehörigen Daten nicht wiederhergestellt.",
+ "delete-items-title": "Sind Sie sicher, dass Sie löschen möchten { count, plural, 1 {Symbol} other {Symbole} }?",
+ "delete-items-action-title": "Löschen { count, plural, 1 {Symbol} other {# Symbole} }",
+ "delete-items-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Elemente entfernt und alle zugehörigen Daten nicht wiederhergestellt.",
+ "add-item-text": "Neues Element hinzufügen",
+ "no-items-text": "Keine Elemente gefunden",
+ "item-details": "Elementdetails",
+ "delete-item": "Element löschen",
+ "delete-items": "Elemente löschen",
+ "scroll-to-top": "zum Seitenanfang"
+ },
+ "help": {
+ "goto-help-page": "Gehen Sie zur Hilfeseite"
+ },
+ "home": {
+ "home": "Startseite",
+ "profile": "Profil",
+ "logout": "Abmelden",
+ "menu": "Menü",
+ "avatar": "Benutzerbild",
+ "open-user-menu": "Benutzermenü öffnen"
+ },
+ "import": {
+ "no-file": "Keine Datei ausgewählt",
+ "drop-file": "Legen Sie eine JSON-Datei ab oder wählen Sie eine Datei zum hochladen aus."
+ },
+ "item": {
+ "selected": "Ausgewählt"
+ },
+ "js-func": {
+ "no-return-error": "Funktion muss einen Wert zurückgeben!",
+ "return-type-mismatch": "Funktion muss einen Wert vom Typ '{{type}}' zurückgeben!",
+ "tidy": "Aufräumen"
+ },
+ "key-val": {
+ "key": "Schlüssel",
+ "value": "Wert",
+ "remove-entry": "Eintrag entfernen",
+ "add-entry": "Eintag hinzufügen",
+ "no-data": "Keine Einträge"
+ },
+ "layout": {
+ "layout": "Layout",
+ "manage": "Layouts verwalten",
+ "settings": "Layout-Einstellungen",
+ "color": "Farbe",
+ "main": "Hauptbereich",
+ "right": "Recht",
+ "select": "Wählen Sie das Ziellayout aus"
+ },
+ "legend": {
+ "position": "Legendenposition",
+ "show-max": "Maximalwert anzeigen",
+ "show-min": "Minimalwert anzeigen",
+ "show-avg": "Durchschnittswert anzeigen",
+ "show-total": "Gesamtwert anzeigen",
+ "settings": "Legendeneinstellungen",
+ "min": "min.",
+ "max": "max.",
+ "avg": "mittelw.",
+ "total": "Gesamt"
+ },
+ "login": {
+ "login": "Login",
+ "request-password-reset": "Passwortzurücksetzung anfordern",
+ "reset-password": "Passwort zurücksetzen",
+ "create-password": "Passwort erstellen",
+ "passwords-mismatch-error": "Eingegebene Passwörter müssen identisch sein!",
+ "password-again": "Passwort wiederholen",
+ "sign-in": "Bitte anmelden",
+ "username": "Benutzername (E-Mail)",
+ "remember-me": "Login speichern",
+ "forgot-password": "Passwort vergessen?",
+ "password-reset": "Passwort zurücksetzen",
+ "new-password": "Neues Passwort",
+ "new-password-again": "Neues Passwort wiederholen",
+ "password-link-sent-message": "Der Link zum Zurücksetzen des Passworts wurde erfolgreich versendet!",
+ "email": "E-Mail"
+ },
+ "position": {
+ "top": "Oben",
+ "bottom": "Unten",
+ "left": "Links",
+ "right": "Rechts"
+ },
+ "profile": {
+ "profile": "Profil",
+ "change-password": "Passwort ändern",
+ "current-password": "Aktuelles Passwort"
+ },
+ "relation": {
+ "relations": "Beziehungen",
+ "direction": "Richtung",
+ "search-direction": {
+ "FROM": "Von",
+ "TO": "Zu"
+ },
+ "direction-type": {
+ "FROM": "von",
+ "TO": "zu"
+ },
+ "from-relations": "Ausgehende Verbindungen",
+ "to-relations": "Eingehende Verbindungen",
+ "selected-relations": "{ count, plural, 1 {1 Beziehung} other {# Beziehungen} } ausgewählt",
+ "type": "Typ",
+ "to-entity-type": "Zum Entitätstyp",
+ "to-entity-name": "Zum Entitätsnamen",
+ "from-entity-type": "Vom Entitätstyp",
+ "from-entity-name": "Vom Entitätsnamen",
+ "to-entity": "Zur Entität",
+ "from-entity": "Von Entität",
+ "delete": "Beziehung löschen",
+ "relation-type": "Art der Beziehung",
+ "relation-type-required": "Art der Beziehung erforderlich.",
+ "any-relation-type": "Jede Art",
+ "add": "Beziehung hinzufügen",
+ "edit": "Beziehung bearbeiten",
+ "delete-to-relation-title": "Möchten Sie die Beziehung zur Einheit'{{entityName}}' wirklich löschen?",
+ "delete-to-relation-text": "Vorsicht, nach Bestätigung ist die Entität '{{entityName}}' nicht mehr mit der aktuellen Entität verbunden.",
+ "delete-to-relations-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Beziehung} other {# Beziehungen} } wirklich löschen?",
+ "delete-to-relations-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Beziehungen entfernt und die entsprechenden Entitäten sind nicht mehr mit der aktuellen Entität verbunden.",
+ "delete-from-relation-title": "Sind Sie sicher, dass Sie die Verbindung aus der Entität '{{entityName}}' löschen möchten?",
+ "delete-from-relation-text": "Vorsicht, nach Bestätigung wird die aktuelle Entität '{{entityName}}' von der Entität unabhängig sein.",
+ "delete-from-relations-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Beziehung} other {# Beziehungen} } löschen möchten?",
+ "delete-from-relations-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Beziehungen entfernt und die aktuellen Entität wird nicht mehr mit den entsprechenden Entitäten verknüpft sein.",
+ "remove-relation-filter": "Beziehungsfilter entfernen",
+ "add-relation-filter": "Beziehungsfilter hinzufügen",
+ "any-relation": "Jede Beziehung",
+ "relation-filters": "Beziehungsfilter",
+ "additional-info": "Zusätzliche Information (JSON)",
+ "invalid-additional-info": "Json der Zusätzlichen Informationen konnte nicht gelesen werden."
+ },
+ "rulechain": {
+ "rulechain": "Regelkette",
+ "rulechains": "Regelketten",
+ "root": "Wurzel",
+ "delete": "Regelkette löschen",
+ "name": "Name",
+ "name-required": "Name ist erforderlich.",
+ "description": "Beschreibung",
+ "add": "Regelkette hinzufügen",
+ "set-root": "Regelkette zur Wurzel machen",
+ "set-root-rulechain-title": "Sind Sie sicher, dass Sie die Regelkette '{{ruleChainName}}' zur Wurzel machen möchten?",
+ "set-root-rulechain-text": "Nach der Bestätigung wird die Regelkette zur Wurzel und bearbeitet alle eingehenden Transportnachrichten.",
+ "delete-rulechain-title": "Sind Sie sicher, dass Sie die Regelkette '{{ruleChainName}}' löschen möchten?",
+ "delete-rulechain-text": "Vorsichtig, nach Bestätigung werden die Regelkette und alle zugehörigen Daten gelöscht.",
+ "delete-rulechains-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Regelkette} other {# Regelketten} } löschen möchten?",
+ "delete-rulechains-action-title": "{ count, plural, 1 {1 Regelkette} other {# Regelketten} } löschen",
+ "delete-rulechains-text": "Vorsichtig, nach Bestätigung werden alle ausgewählten Regelketten entfernt und alle zugehörigen Daten werden gelöscht.",
+ "add-rulechain-text": "Neue Regelkette hinzufügen",
+ "no-rulechains-text": "Keine Regelkette gefunden",
+ "rulechain-details": "Regelketten-Details",
+ "details": "Details",
+ "events": "Ereignisse",
+ "system": "System",
+ "import": "Regelkette importieren",
+ "export": "Regelkette exportieren",
+ "export-failed-error": "Regelkette konnte nicht exportiert werden: {{error}}",
+ "create-new-rulechain": "Neue Regelkette erstellen",
+ "rulechain-file": "Regelkettendatei",
+ "invalid-rulechain-file-error": "Regelkette konnte nicht importiert werden: Ungültige Regelkettendatenstruktur.",
+ "copyId": "Regelketten-ID kopieren",
+ "idCopiedMessage": "Regelketten-ID wurde in die Zwischenablage kopiert",
+ "select-rulechain": "Regelkette auswählen",
+ "no-rulechains-matching": "Es wurden keine passenden Regelketten für '{{entity}}' gefunden.",
+ "rulechain-required": "Regelkette ist erforderlich",
+ "management": "Regelverwaltung",
+ "debug-mode": "Modus zur Fehlersuche"
+ },
+ "rulenode": {
+ "details": "Details",
+ "events": "Ereignisse",
+ "search": "Knoten suchen",
+ "open-node-library": "Knotenbibliothek öffnen",
+ "add": "Neuen Regelknoten hinzufügen",
+ "name": "Name",
+ "name-required": "Name ist erforderlich.",
+ "type": "Typ",
+ "description": "Beschreibung",
+ "delete": "Regelknoten löschen",
+ "select-all-objects": "Alle Knoten und Verbindungen auswählen",
+ "deselect-all-objects": "Auswahl aller Knoten und Verbindungen aufheben",
+ "delete-selected-objects": "Ausgewählte Knoten und Verbindungen löschen",
+ "delete-selected": "Auswahl löschen",
+ "select-all": "Alle auswählen",
+ "copy-selected": "Auswahl kopieren",
+ "deselect-all": "Nichts auswählen",
+ "rulenode-details": "Details der Regelknoten",
+ "debug-mode": "Modus zur Fehlersuche",
+ "configuration": "Konfiguration",
+ "link": "Verbindung",
+ "link-details": "Verbindungsdetails der Regelknoten",
+ "add-link": "Verbindung hinzufügen",
+ "link-label": "Verbindungsbeschriftung",
+ "link-label-required": "Verbindungsbeschriftung ist erforderlich.",
+ "custom-link-label": "Benutzerdefinierte Verbindungsbeschriftung",
+ "custom-link-label-required": "Benutzerdefinierte Verbindungsbeschriftung ist erforderlich.",
+ "link-labels": "Verbindungsbeschriftungen",
+ "link-labels-required": "Verbindungsbeschriftungen sind erforderlich.",
+ "no-link-labels-found": "Keine Verbindungsbeschriftungen gefunden",
+ "no-link-label-matching": "'{{label}}' nicht gefunden.",
+ "create-new-link-label": "Bitte erstellen Sie eine neue Verbindungsbeschriftung!",
+ "type-filter": "Filter",
+ "type-filter-details": "Eingehende Nachrichten mit konfigurierten Bedingungen filtern",
+ "type-enrichment": "Anreicherung",
+ "type-enrichment-details": "Fügen Sie zusätzliche Informationen zu den Nachrichtenmetadaten hinzu",
+ "type-transformation": "Transformation",
+ "type-transformation-details": "Ändern Sie die Nutzerdaten und Metadaten der Nachricht",
+ "type-action": "Aktion",
+ "type-action-details": "Besondere Aktion ausführen",
+ "type-external": "Extern",
+ "type-external-details": "Interagiert mit externem System",
+ "type-rule-chain": "Regelkette",
+ "type-rule-chain-details": "Leitet eingehende Nachrichten an die angegebene Regelkette weiter",
+ "type-input": "Input",
+ "type-input-details": "Logische Eingabe der Regelkette, leitet eingehende Nachrichten an die nächste zugehörige Regelkette weiter",
+ "type-unknown": "Unbekannt",
+ "type-unknown-details": "Nicht aufgelöster Regelknoten",
+ "directive-is-not-loaded": "Definierte Konfigurationsanweisung '{{directiveName}}' ist nicht verfügbar.",
+ "ui-resources-load-error": "Fehler beim Laden der Konfigurations-UI-Ressourcen.",
+ "invalid-target-rulechain": "Zielregelkette kann nicht aufgelöst werden!",
+ "test-script-function": "Skriptfunktion testen",
+ "message": "Nachricht",
+ "message-type": "Nachrichtentyp",
+ "select-message-type": "Nachrichtentyp auswählen",
+ "message-type-required": "Nachrichtentyp ist erforderlich",
+ "metadata": "Metadaten",
+ "metadata-required": "Metadateneinträge dürfen nicht leer sein.",
+ "output": "Ausgabe",
+ "test": "Test",
+ "help": "Hilfe"
+ },
+ "tenant": {
+ "tenant": "Mandant",
+ "tenants": "Mandanten",
+ "management": "Mandantenverwaltung",
+ "add": "Mandant hinzufügen",
+ "admins": "Administratoren",
+ "manage-tenant-admins": "Mandantenadministratoren verwalten",
+ "delete": "Mandant löschen",
+ "add-tenant-text": "Neuen Mandanten hinzufügen",
+ "no-tenants-text": "Keine Mandanten gefunden",
+ "tenant-details": "Mandantendetails",
+ "delete-tenant-title": "Möchten Sie den Mandanten '{{tenantTitle}}' wirklich löschen?",
+ "delete-tenant-text": "Vorsicht, nach Bestätigung werden der Mandant und alle zugehörigen Daten gelöscht.",
+ "delete-tenants-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Mandant} other {# Mandanten} } löschen möchten?",
+ "delete-tenants-action-title": "{ count, plural, 1 {1 Mandant} other {# Mandanten} } löschen",
+ "delete-tenants-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Mandanten entfernt und alle zugehörigen Daten werden gelöscht.",
+ "title": "Titel",
+ "title-required": "Titel ist erforderlich.",
+ "description": "Beschreibung",
+ "details": "Details",
+ "events": "Ereignisse",
+ "copyId": "Mandanten-ID kopieren",
+ "idCopiedMessage": "Mandanten-ID wurde in die Zwischenablage kopiert",
+ "select-tenant": "Mandant auswählen",
+ "no-tenants-matching": "Es wurden keine passenden Mandanten für '{{entity}}' gefunden.",
+ "tenant-required": "Mandant ist erforderlich"
+ },
+ "timeinterval": {
+ "seconds-interval": "{ seconds, plural, 1 {1 Sekunde} other {# Sekunden} }",
+ "minutes-interval": "{ minutes, plural, 1 {1 Minute} other {# Minuten} }",
+ "hours-interval": "{ hours, plural, 1 {1 Stunde} other {# Stunden} }",
+ "days-interval": "{ days, plural, 1 {1 Tag} other {# Tage} }",
+ "days": "Tage",
+ "hours": "Stunden",
+ "minutes": "Minuten",
+ "seconds": "Sekunden",
+ "advanced": "Erweitert"
+ },
+ "timewindow": {
+ "days": "{ days, plural, 1 { Tag } other {# Tage } }",
+ "hours": "{ hours, plural, 0 { Stunde } 1 {1 Stunde } other {# Stunden } }",
+ "minutes": "{ minutes, plural, 0 { Minute } 1 {1 Minute } other {# Minuten } }",
+ "seconds": "{ seconds, plural, 0 { Sekunde } 1 {1 Sekunde } other {# Sekunden } }",
+ "realtime": "Echtzeit",
+ "history": "Historie",
+ "last-prefix": "letzte",
+ "period": "von {{ startTime }} bis {{ endTime }}",
+ "edit": "Zeitfenster bearbeiten",
+ "date-range": "Datumsbereich",
+ "last": "Letzte",
+ "time-period": "Zeitfenster"
+ },
+ "user": {
+ "user": "User",
+ "users": "Users",
+ "customer-users": "Kunden Users",
+ "tenant-admins": "Mandanten-Administratoren",
+ "sys-admin": "System-Administrator",
+ "tenant-admin": "Mandanten-Administrator",
+ "customer": "Kunde",
+ "anonymous": "Anonym",
+ "add": "Benutzer hinzufügen",
+ "delete": "Benutzer löschen",
+ "add-user-text": "Neuen Benutzer hinzufügen",
+ "no-users-text": "Keine Benutzer gefunden",
+ "user-details": "Benutzer-Details",
+ "delete-user-title": "Möchten Sie den Benutzer '{{userEmail}}' wirklich löschen?",
+ "delete-user-text": "Vorsicht, nach Bestätigung werden der Benutzer und alle zugehörigen Daten gelöscht.",
+ "delete-users-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Benutzer} other {# Benutzer} } löschen möchten??",
+ "delete-users-action-title": "{ count, plural, 1 {1 Benutzer} other {# Benutzer} } löschen",
+ "delete-users-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Benutzer entfernt und alle zugehörigen Daten werden gelöscht.",
+ "activation-email-sent-message": "Aktivierungs E-Mail wurde erfolgreich gesendet!",
+ "resend-activation": "Aktivierung erneut senden",
+ "email": "E-Mail",
+ "email-required": "E-Mail ist erforderlich.",
+ "invalid-email-format": "Ungültiges E-Mail Format.",
+ "first-name": "Vorname",
+ "last-name": "Nachname",
+ "description": "Beschreibung",
+ "default-dashboard": "Standard-Dashboard",
+ "always-fullscreen": "Immer Vollbild",
+ "select-user": "Benutzer auswählen",
+ "no-users-matching": "Keine passenden Benutzer für '{{entity}}' gefunden.",
+ "user-required": "Benutzer ist erforderlich",
+ "activation-method": "Aktivierungsmethode",
+ "display-activation-link": "Aktivierungslink anzeigen",
+ "send-activation-mail": "Aktivierungs E-Mail senden",
+ "activation-link": "Link zur Benutzer-Aktivierung",
+ "activation-link-text": "Um den Benutzer zu aktivieren, verwenden Sie bitte folgenden Aktivierungslink:",
+ "copy-activation-link": "Aktivierungslink kopieren",
+ "activation-link-copied-message": "Der Link zur Benutzer-Aktivierung wurde in die Zwischenablage kopiert ",
+ "details": "Details",
+ "login-as-tenant-admin": "Als Mandanten-Administrator anmelden",
+ "login-as-customer-user": "Als Kunden-Benutzer anmelden"
+ },
+ "value": {
+ "type": "Wertetyp",
+ "string": "Text",
+ "string-value": "Textwert",
+ "integer": "Ganzzahlig",
+ "integer-value": "Ganzzahliger Wert",
+ "invalid-integer-value": "Ungültiger ganzzahliger Wert",
+ "double": "Gleitkommazahl",
+ "double-value": "Gleitkomma Wert",
+ "boolean": "Binär",
+ "boolean-value": "Binärwert",
+ "false": "Falsch",
+ "true": "Wahr",
+ "long": "Lang"
+ },
+ "widget": {
+ "widget-library": "Widget-Bibliothek",
+ "widget-bundle": "Widget-Paket",
+ "select-widgets-bundle": "Widget-Paket auswählen",
+ "management": "Widget Verwaltung",
+ "editor": "Widget Editor",
+ "widget-type-not-found": "Problem beim Laden der Widget-Konfiguration.
Zugeordneter Widget-Typ wurde entfernt.",
+ "widget-type-load-error": "Widget wurde aufgrund der folgenden Fehler nicht geladen:",
+ "remove": "Widget entfernen",
+ "edit": "Widget bearbeiten",
+ "remove-widget-title": "Möchten Sie das Widget '{{widgetTitle}}' wirklich entfernen?",
+ "remove-widget-text": "Nach der Bestätigung werden das Widget und alle zugehörigen Daten nicht wiederhergestellt.",
+ "timeseries": "Zeitreihe",
+ "search-data": "Daten suchen",
+ "no-data-found": "Keine Daten gefunden",
+ "latest-values": "Neueste Werte",
+ "rpc": "Steuerungswidget",
+ "alarm": "Alarm-Widget",
+ "static": "Statisches Widget",
+ "select-widget-type": "Widget-Typ auswählen",
+ "missing-widget-title-error": "Widget-Titel muss angegeben werden!",
+ "widget-saved": "Widget gespeichert",
+ "unable-to-save-widget-error": "Das Widget kann nicht gespeichert werden! Fehlermeldung!",
+ "save": "Widget speichern",
+ "saveAs": "Widget speichern unter",
+ "save-widget-type-as": "Widget-Typ speichern unter",
+ "save-widget-type-as-text": "Bitte geben Sie den neuen Widget-Titel ein und/oder wählen Sie das Ziel-Widget-Paket aus",
+ "toggle-fullscreen": "Vollbild umschalten",
+ "run": "Widget ausführen",
+ "title": "Widget-Titel",
+ "title-required": "Widget-Titel ist erforderlich.",
+ "type": "Widget-Typ",
+ "resources": "Ressourcen",
+ "resource-url": "JavaScript/CSS URL",
+ "remove-resource": "Ressource entfernen",
+ "add-resource": "Ressource hinzufügen",
+ "html": "HTML",
+ "tidy": "Aufgeräumt",
+ "css": "CSS",
+ "settings-schema": "Einstellungsschema",
+ "datakey-settings-schema": "Datenschlüssel-Einstellungsschema",
+ "javascript": "Javascript",
+ "remove-widget-type-title": "Möchten Sie den Widget-Typ '{{widgetName}}' wirklich entfernen?",
+ "remove-widget-type-text": "Nach der Bestätigung werden der Widget-Typ und alle zugehörigen Daten nicht wiederhergestellt.",
+ "remove-widget-type": "Widget-Typ entfernen",
+ "add-widget-type": "Neuen Widget-Typ hinzufügen",
+ "widget-type-load-failed-error": "Widget-Typ konnte nicht geladen werden!",
+ "widget-template-load-failed-error": "Widget-Vorlage konnte nicht geladen werden!",
+ "add": "Widget hinzufügen",
+ "undo": "Widget-Änderungen widerrufen ",
+ "export": "Widget exportieren"
+ },
+ "widget-action": {
+ "header-button": "Widget-Header-Schaltfläche",
+ "open-dashboard-state": "Zum neuen Dashboard-Status navigieren",
+ "update-dashboard-state": "Aktuellen Dashboard-Status aktualisieren",
+ "open-dashboard": "Zu einem anderen Dashboard navigieren",
+ "custom": "Benutzerdefinierte Aktion",
+ "target-dashboard-state": "Zielstatus des Dashboards",
+ "target-dashboard-state-required": "Der Zielstatus ist erforderlich",
+ "set-entity-from-widget": "Widget-Entität festlegen",
+ "target-dashboard": "Ziel-Dashboard",
+ "open-right-layout": "Das rechte Dashboard-Layout öffnen (mobile Ansicht)"
+ },
+ "widgets-bundle": {
+ "current": "Aktuelles Paket",
+ "widgets-bundles": "Widget-Pakete",
+ "add": "Widget-Pakete hinzufügen",
+ "delete": "Widget-Pakete löschen",
+ "title": "Titel",
+ "title-required": "Titel ist erforderlich.",
+ "add-widgets-bundle-text": "Neues Widget-Paket hinzufügen",
+ "no-widgets-bundles-text": "Keine Widget-Pakete gefunden",
+ "empty": "Widget-Paket ist leer ",
+ "details": "Details",
+ "widgets-bundle-details": "Widget-Paket-Details",
+ "delete-widgets-bundle-title": "Möchten Sie das Widget-Paket '{{widgetsBundleTitle}}' wirklich löschen? ",
+ "delete-widgets-bundle-text": "Seien Sie vorsichtig, nach der Bestätigung werden das Widget-Paket und alle zugehörigen Daten gelöscht.",
+ "delete-widgets-bundles-title": "Sind Sie sicher, dass Sie { count, plural, 1 {1 Widget-Paket} other {# Widget-Pakete} } löschen möchten?",
+ "delete-widgets-bundles-action-title": "{ count, plural, 1 {1 Widgets-Paket} other {# Widget-Pakete} } löschen",
+ "delete-widgets-bundles-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Widget-Pakete entfernt und alle zugehörigen Daten werden gelöscht.",
+ "no-widgets-bundles-matching": "Keine passenden Widget-Pakete '{{widgetsBundle}}' gefunden.",
+ "widgets-bundle-required": "Widget-Paket ist erforderlich.",
+ "system": "System",
+ "import": "Widget-Paket importieren",
+ "export": "Widget-Paket exportieren",
+ "export-failed-error": "Widget-Paket kann nicht exportiert werden: {{error}}",
+ "create-new-widgets-bundle": "Neues Widget-Paket erstellen",
+ "widgets-bundle-file": "Widget-Paket-Datei",
+ "invalid-widgets-bundle-file-error": "Widget-Paket kann nicht importiert werden: Ungültige Widget-Paket-Datenstruktur."
+ },
+ "widget-config": {
+ "data": "Daten",
+ "settings": "Einstellungen",
+ "advanced": "Erweitert ",
+ "title": "Titel",
+ "general-settings": "Allgemeine Einstellungen",
+ "display-title": "Titel anzeigen",
+ "drop-shadow": "Schlagschatten",
+ "enable-fullscreen": "Vollbild aktivieren",
+ "background-color": "Hintergrundfarbe",
+ "text-color": "Textfarbe",
+ "padding": "Pufferung",
+ "margin": "Rand",
+ "widget-style": "Widget-Stil",
+ "title-style": "Titel-Stil",
+ "mobile-mode-settings": "Einstellungen für den mobilen Modus",
+ "order": "Reihenfolge",
+ "height": "Größe",
+ "units": "Spezielles Symbol, das neben dem Wert angezeigt wird",
+ "decimals": "Anzahl der Stellen nach dem Fließkomma",
+ "timewindow": "Zeitfenster",
+ "use-dashboard-timewindow": "Dashboard-Zeitfenster verwenden",
+ "display-legend": "Legende anzeigen",
+ "datasources": "Datenquellen",
+ "maximum-datasources": "Maximal { count, plural, 1 {1 Datenquelle ist erlaubt} other {# Datenquellen sind erlaubt} }.",
+ "datasource-type": "Typ",
+ "datasource-parameters": "Parameter",
+ "remove-datasource": "Datenquelle entfernen",
+ "add-datasource": "Datenquelle hinzufügen ",
+ "target-device": "Zielgerät",
+ "alarm-source": "Alarmquelle",
+ "actions": "Aktionen",
+ "action": "Aktion",
+ "add-action": "Aktion hinzufügen",
+ "search-actions": "Aktion suchen",
+ "action-source": "Aktionsquelle",
+ "action-source-required": "Aktionsquelle ist erforderlich.",
+ "action-name": "Name",
+ "action-name-required": "Aktionsname ist erforderlich.",
+ "action-name-not-unique": "Eine andere Aktion mit demselben Namen ist bereits vorhanden.
Der Aktionsname sollte innerhalb derselben Aktionsquelle eindeutig sein.",
+ "action-icon": "Symbol ",
+ "action-type": "Art",
+ "action-type-required": "Aktionsart ist erforderlich.",
+ "edit-action": "Aktion bearbeiten",
+ "delete-action": "Aktion löschen",
+ "delete-action-title": "Widget-Aktion löschen",
+ "delete-action-text": "Möchten Sie die Widget-Aktion mit Namen '{{actionName}}' wirklich löschen?"
+ },
+ "widget-type": {
+ "import": "Widget-Typ importieren",
+ "export": "Widget-Typ exportieren",
+ "export-failed-error": "Widget-Typ kann nicht exportiert werden: {{error}}",
+ "create-new-widget-type": "Neuen Widget-Typ erstellen",
+ "widget-type-file": "Widget-Typdatei",
+ "invalid-widget-type-file-error": "Widget-Typ kann nicht importiert werden: Ungültige Datenstruktur des Widget-Typs."
+ },
+ "icon": {
+ "icon": "Symbol",
+ "select-icon": "Symbol auswählen",
+ "material-icons": "Material-Symbole",
+ "show-all": "Alle Symbole anzeigen"
+ },
+ "custom": {
+ "widget-action": {
+ "action-cell-button": "Aktionszellenschaltfläche",
+ "row-click": "Klick auf Zeile",
+ "marker-click": "Klick auf Marker",
+ "tooltip-tag-action": "Tooltip-Tag-Aktion"
+ }
+ },
+ "language": {
+ "language": "Sprache",
+ "locales": {
+ "de_DE": "Deutsch",
+ "fr_FR": "Französisch",
+ "zh_CN": "Chinesisch",
+ "en_US": "Englisch",
+ "it_IT": "Italienisch",
+ "ko_KR": "Koreanisch",
+ "ru_RU": "Russisch",
+ "es_ES": "Spanisch",
+ "ja_JA": "Japanisch",
+ "tr_TR": "Türkisch"
+ }
+ }
+}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json
index 30e1eb119b..4f12ee056e 100644
--- a/ui/src/app/locale/locale.constant-en_US.json
+++ b/ui/src/app/locale/locale.constant-en_US.json
@@ -1008,6 +1008,8 @@
"modbus-add-server": "Add server/slave",
"modbus-add-server-prompt": "Please add server/slave",
"modbus-transport": "Transport",
+ "modbus-tcp-reconnect": "Automatically reconnect",
+ "modbus-rtu-over-tcp": "RTU over TCP",
"modbus-port-name": "Serial port name",
"modbus-encoding": "Encoding",
"modbus-parity": "Parity",
@@ -1032,7 +1034,6 @@
"modbus-register-count": "Register count",
"modbus-register-count-range": "Register count should be a positive value.",
"modbus-byte-order": "Byte order",
-
"sync": {
"status": "Status",
"sync": "Sync",
@@ -1040,7 +1041,6 @@
"last-sync-time": "Last sync time",
"not-available": "Not available"
},
-
"export-extensions-configuration": "Export extensions configuration",
"import-extensions-configuration": "Import extensions configuration",
"import-extensions": "Import extensions",
@@ -1566,7 +1566,8 @@
"language": {
"language": "Language",
"locales": {
- "fr_FR": "French",
+ "de_DE": "German",
+ "fr_FR": "French",
"zh_CN": "Chinese",
"en_US": "English",
"it_IT": "Italian",
@@ -1577,4 +1578,4 @@
"tr_TR": "Turkish"
}
}
-}
+}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-es_ES.json b/ui/src/app/locale/locale.constant-es_ES.json
index 7b0214190b..8190157e7a 100644
--- a/ui/src/app/locale/locale.constant-es_ES.json
+++ b/ui/src/app/locale/locale.constant-es_ES.json
@@ -2,9 +2,9 @@
"access": {
"unauthorized": "No autorizado",
"unauthorized-access": "Acceso no autorizado",
- "unauthorized-access-text": "Debe registrarse para tener acceso a este recurso!",
+ "unauthorized-access-text": "¡Debe registrarse para tener acceso a este recurso!",
"access-forbidden": "Acceso Prohibido",
- "access-forbidden-text": "No tiene derechos para acceder a esta ubicación!
Intente registrarse con otro usuario si aún desea acceder a esta ubicación.",
+ "access-forbidden-text": "No tiene permisos para acceder a esta ubicación!
Intente registrarse con otro usuario si aún desea acceder a esta ubicación.",
"refresh-token-expired": "La sesión ha expirado",
"refresh-token-failed": "No se puede actualizar la sesión"
},
@@ -14,7 +14,7 @@
"save": "Guardar",
"saveAs": "Guardar como",
"cancel": "Cancelar",
- "ok": "OK",
+ "ok": "Aceptar",
"delete": "Eliminar",
"add": "Agregar",
"yes": "Si",
@@ -30,17 +30,17 @@
"apply": "Aplicar",
"apply-changes": "Aplicar cambios",
"edit-mode": "Modo edición",
- "enter-edit-mode": "Ingresar modo edición",
+ "enter-edit-mode": "Entrar en modo edición",
"decline-changes": "Descartar cambios",
"close": "Cerrar",
"back": "Atras",
"run": "Ejecutar",
- "sign-in": "Registrarse!",
+ "sign-in": "¡Registrarse!",
"edit": "Editar",
"view": "Ver",
"create": "Crear",
"drag": "Arrastrar",
- "refresh": "Refrecar",
+ "refresh": "Actualizar",
"undo": "Deshacer",
"copy": "Copiar",
"paste": "Pegar",
@@ -48,7 +48,7 @@
"paste-reference": "Pegar referencia",
"import": "Importar",
"export": "Exportar",
- "share-via": "Share via {{provider}}"
+ "share-via": "Compartir via {{provider}}"
},
"aggregation": {
"aggregation": "Agregación",
@@ -68,11 +68,11 @@
"outgoing-mail": "Servidor de correo",
"outgoing-mail-settings": "Configuración del servidor de correo de salida",
"system-settings": "Configuración del sistema",
- "test-mail-sent": "Correo de prueba fue enviado exitosamente!",
+ "test-mail-sent": "¡El correo de prueba fue enviado correctamente!",
"base-url": "URL base",
"base-url-required": "URL base es requerida.",
"mail-from": "Correo desde",
- "mail-from-required": "Correo Desde es requerido.",
+ "mail-from-required": "Correo desde es requerido.",
"smtp-protocol": "Protocolo SMTP",
"smtp-host": "Host SMTP",
"smtp-host-required": "Host SMTP es requerido.",
@@ -93,11 +93,11 @@
"alarm-required": "Alarma es requerida",
"alarm-status": "Estado de la alarma",
"search-status": {
- "ANY": "Alguna",
- "ACTIVE": "Activa",
- "CLEARED": "Borrada",
- "ACK": "Reconocida",
- "UNACK": "Ignorada"
+ "ANY": "Todas",
+ "ACTIVE": "Activas",
+ "CLEARED": "Borradas",
+ "ACK": "Reconocidas",
+ "UNACK": "Ignoradas"
},
"display-status": {
"ACTIVE_UNACK": "Activa ignorada",
@@ -105,10 +105,10 @@
"CLEARED_UNACK": "Borrada ignorada",
"CLEARED_ACK": "Borrada reconocida"
},
- "no-alarms-prompt": "Alarmas no encontradas",
+ "no-alarms-prompt": "No se encontraron alarmas",
"created-time": "Tiempo de creación",
"type": "Tipo",
- "severity": "Severidad",
+ "severity": "Criticidad",
"originator": "Origen",
"originator-type": "Tipo de origen",
"details": "Detalles",
@@ -119,27 +119,27 @@
"ack-time": "Tiempo de reconocimiento",
"clear-time": "Tiempo de borrado",
"severity-critical": "Crítica",
- "severity-major": "Mayor",
- "severity-minor": "Menor",
+ "severity-major": "Alta",
+ "severity-minor": "Baja",
"severity-warning": "Alerta",
"severity-indeterminate": "Indeterminada",
"acknowledge": "Reconocer",
"clear": "Borrar",
"search": "buscar alarmas",
- "selected-alarms": "{ count, plural, 1 {1 alarm} other {# alarms} } seleccionadas",
+ "selected-alarms": "{ count, plural, 1 {1 alarma} other {# alarmas} } seleccionadas",
"no-data": "No hay datos para mostrar",
"polling-interval": "Intervalo de sondeo de alarmas (seg)",
"polling-interval-required": "Intervalo de sondeo de alarmas es requerido.",
"min-polling-interval-message": "Se permite al menos 1 segundo de intervalo de sondeo.",
- "aknowledge-alarms-title": "Reconocer { count, plural, 1 {1 alarm} other {# alarms} }",
- "aknowledge-alarms-text": "¿Está seguro de que desea reconocer { count, plural, 1 {1 alarm} other {# alarms} }?",
- "aknowledge-alarm-title": "Acknowledge Alarm",
- "aknowledge-alarm-text": "Are you sure you want to acknowledge Alarm?",
- "clear-alarms-title": "Borrar { count, plural, 1 {1 alarm} other {# alarms} }",
- "clear-alarms-text": "¿Está seguro de que desea borrar { count, plural, 1 {1 alarm} other {# alarms} }?",
- "clear-alarm-title": "Clear Alarm",
- "clear-alarm-text": "Are you sure you want to clear Alarm?",
- "alarm-status-filter": "Alarm Status Filter"
+ "aknowledge-alarms-title": "Reconocer { count, plural, 1 {1 alarma} other {# alarmas} }",
+ "aknowledge-alarms-text": "¿Está seguro de que desea reconocer { count, plural, 1 {1 alarma} other {# alarmas} }?",
+ "aknowledge-alarm-title": "Reconocer alarma",
+ "aknowledge-alarm-text": "¿Está seguro que quirere reconocer la alarma?",
+ "clear-alarms-title": "Quitar { count, plural, 1 {1 alarma} other {# alarmas} }",
+ "clear-alarms-text": "¿Está seguro de que desea quitar { count, plural, 1 {1 alarma} other {# alarmas}?",
+ "clear-alarm-title": "Quitar alarma",
+ "clear-alarm-text": "¿Está seguro que quiere quitar la alarma?",
+ "alarm-status-filter": "Filtro de estado de alarma"
},
"alias": {
"add": "Agregar alias",
@@ -151,24 +151,29 @@
"filter-type-entity-list": "Lista de entidades",
"filter-type-entity-name": "Nombre de entidad",
"filter-type-state-entity": "Entidad del panel de estados",
- "filter-type-state-entity-description": "Entidad tomada desde los parámetro del panel de estados",
+ "filter-type-state-entity-description": "Entidad tomada desde los parámetros del panel de estados",
"filter-type-asset-type": "Tipo de activo",
"filter-type-asset-type-description": "Activos de tipo '{{assetType}}'",
- "filter-type-asset-type-and-name-description": "Activos de tipo '{{assetType}}' y con nombre comenzando con '{{prefix}}'",
+ "filter-type-asset-type-and-name-description": "Activos del tipo '{{assetType}}' y su nombre empieza con '{{prefix}}'",
"filter-type-device-type": "Tipo de dispositivo",
"filter-type-device-type-description": "Dispositivos de tipo '{{deviceType}}'",
- "filter-type-device-type-and-name-description": "Dispositivos de tipo '{{deviceType}}' y con nombre comenzando con '{{prefix}}'",
+ "filter-type-device-type-and-name-description": "Dispositivos del tipo '{{deviceType}}' y su nombre empieza con '{{prefix}}'",
+ "filter-type-entity-view-type": "Tipo de vista de entidad",
+ "filter-type-entity-view-type-description": "Vista de entidad del tipo '{{entityView}}'",
+ "filter-type-entity-view-type-and-name-description": "Las vista de entidad del tipo '{{entityView}}' y cuyo nombre comienza con '{{prefix}}'",
"filter-type-relations-query": "Consulta de relaciones",
"filter-type-relations-query-description": "{{entities}} que tienen {{relationType}} relación {{direction}} {{rootEntity}}",
"filter-type-asset-search-query": "Consultar búsqueda de activos",
"filter-type-asset-search-query-description": "Activos con tipos {{assetTypes}} que tienen {{relationType}} relación {{direction}} {{rootEntity}}",
"filter-type-device-search-query": "Consultar búqueda de dispositivos",
"filter-type-device-search-query-description": "Dispositivos con tipos {{deviceTypes}} que tienen {{relationType}} relación {{direction}} {{rootEntity}}",
+ "filter-type-entity-view-search-query": "Consultar vista de entidad",
+ "filter-type-entity-view-search-query-description": "Las vista de entidad de tipo {{entityViewTypes}} que tienen {{relationType}} relación {{direction}} {{rootEntity}}",
"entity-filter": "Filtro de entidad",
"resolve-multiple": "Resolver como entidades múltiples",
"filter-type": "Tipo de filtro",
"filter-type-required": "Tipo de filtro es requerido.",
- "entity-filter-no-entity-matched": "Entidades que coincidan con el filtro especificado no fueron encontradas.",
+ "entity-filter-no-entity-matched": "No se encontraron entidades que coincidan con el filtro especificado.",
"no-entity-filter-specified": "No se especificó el filtro de entidad",
"root-state-entity": "Utilizar la entidad del panel de estados como raíz",
"root-entity": "Entidad raíz",
@@ -185,13 +190,13 @@
"asset": "Activo",
"assets": "Activos",
"management": "Gestión de activos",
- "view-assets": "Ver Activos",
- "add": "Agregar Activo",
+ "view-assets": "Ver activos",
+ "add": "Agregar activo",
"assign-to-customer": "Asignar al cliente",
- "assign-asset-to-customer": "Asignar Activo(s) Al Cliente",
- "assign-asset-to-customer-text": "Por favor seleccionar los activos para asignar al cliente",
- "no-assets-text": "Activos no encontrados",
- "assign-to-customer-text": "Por favor seleccionar el cliente para asignar el(los) activo(s)",
+ "assign-asset-to-customer": "Asignar activo(s) al cliente",
+ "assign-asset-to-customer-text": "Por favor, seleccione los activos para asignar al cliente",
+ "no-assets-text": "No se encontraron activos",
+ "assign-to-customer-text": "Por favor, seleccione el cliente para asignar el(los) activo(s)",
"public": "Público",
"assignedToCustomer": "Asignado al cliente",
"make-public": "Hacer público el activo",
@@ -202,9 +207,9 @@
"asset-type": "Tipo de activo",
"asset-type-required": "El tipo de activo es requerido.",
"select-asset-type": "Seleccionar tipo de activo",
- "enter-asset-type": "Ingresar tipo de activo",
+ "enter-asset-type": "Introduzca el tipo de activo",
"any-asset": "Algún activo",
- "no-asset-types-matching": "Tipos de activos que coincidan con '{{entitySubtype}}' no fueron encontrados.",
+ "no-asset-types-matching": "No se encontraron tipos de activos que coincidan con '{{entitySubtype}}'.",
"asset-type-list-empty": "No se seleccionaron tipos de activos.",
"asset-types": "Tipos de activos",
"name": "Nombre",
@@ -217,16 +222,16 @@
"add-asset-text": "Agregar nuevos activos",
"asset-details": "Detalles del activo",
"assign-assets": "Asignar activos",
- "assign-assets-text": "Asignar { count, plural, 1 {1 asset} other {# assets} } al cliente",
+ "assign-assets-text": "Asignar { count, plural, 1 {1 activo} other {# activos} } al cliente",
"delete-assets": "Eliminar activos",
"unassign-assets": "Anular asignación de activos",
- "unassign-assets-action-title": "Anular asignación { count, plural, 1 {1 asset} other {# assets} } del cliente",
+ "unassign-assets-action-title": "Anular asignación { count, plural, 1 {1 activo} other {# activos} } del cliente",
"assign-new-asset": "Asignar nuevo activo",
"delete-asset-title": "¿Está seguro de que desea eliminar el activo '{{assetName}}'?",
- "delete-asset-text": "Tener cuidado, después de la confirmación, el activo y todos los datos relacionados se volverán irrecuperables.",
- "delete-assets-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 asset} other {# assets} }?",
- "delete-assets-action-title": "Eliminar { count, plural, 1 {1 asset} other {# assets} }",
- "delete-assets-text": "Tener cuidado, después de la confirmación se eliminarán todos los activos seleccionados y todos los datos relacionados se volverán irrecuperables.",
+ "delete-asset-text": "¡Cuidado! Después de la confirmación, el activo y todos los datos relacionados serán irrecuperables.",
+ "delete-assets-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 activos} other {# activos} }?",
+ "delete-assets-action-title": "Eliminar { count, plural, 1 {1 activo} other {# activos} }",
+ "delete-assets-text": "¡Cuidado! Después de la confirmación se eliminarán todos los activos seleccionados y todos los datos relacionados serán irrecuperables.",
"make-public-asset-title": "¿Está seguro de que desea que el activo '{{assetName}}' sea público?",
"make-public-asset-text": "Después de la confirmación, el activo y todos sus datos se harán públicos y accesibles por otros.",
"make-private-asset-title": "¿Está seguro de que desea que el activo '{{assetName}}' sea privado?",
@@ -234,12 +239,12 @@
"unassign-asset-title": "¿Está seguro de que desea anular asignación del activo '{{assetName}}'?",
"unassign-asset-text": "Después de la confirmación, se anulará asignación del activo y no será accesible por el cliente.",
"unassign-asset": "Anular asignación activo",
- "unassign-assets-title": "¿Está seguro de que desea anular asignación { count, plural, 1 {1 asset} other {# assets} }?",
+ "unassign-assets-title": "¿Está seguro de que desea anular asignación { count, plural, 1 {1 activo} other {# activos} }?",
"unassign-assets-text": "Después de la confirmación, se anulará asignación de todos los activos seleccionados y no serán accesibles por el cliente",
"copyId": "Copiar ID del activo",
"idCopiedMessage": "ID del activo has sido copiada al portapapeles",
"select-asset": "Seleccionar activo",
- "no-assets-matching": "Activos que coincidan con '{{entity}}' no fueron encontrados.",
+ "no-assets-matching": "No se encontraron activos que coincidan con '{{entity}}'.",
"asset-required": "El activo es requerido",
"name-starts-with": "El nombre del activo comienza con"
},
@@ -257,25 +262,25 @@
"key-required": "La clave del aributo es requerida.",
"value": "Valor",
"value-required": "Valor del atributo es requerido.",
- "delete-attributes-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 attribute} other {# attributes} }?",
- "delete-attributes-text": "Tener cuidado, después de la confirmación, se eliminarán todos los atributos seleccionados.",
+ "delete-attributes-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 atributo} other {# atributos} }?",
+ "delete-attributes-text": "¡Cuidado! Después de la confirmación, se eliminarán todos los atributos seleccionados.",
"delete-attributes": "Eliminar atributos",
- "enter-attribute-value": "Ingresar valor del atributo",
+ "enter-attribute-value": "Introduzca el valor del atributo",
"show-on-widget": "Mostrar en widget",
"widget-mode": "Modo widget",
"next-widget": "Widget siguiente",
"prev-widget": "Widget previo",
"add-to-dashboard": "Agregar al panel",
"add-widget-to-dashboard": "Agregar widget al panel",
- "selected-attributes": "{ count, plural, 1 {1 attribute} other {# attributes} } seleccionados",
+ "selected-attributes": "{ count, plural, 1 {1 atributo} other {# atributos} } seleccionados",
"selected-telemetry": "{ count, plural, 1 {1 telemetry unit} other {# telemetry units} } seleccionadas"
},
"audit-log": {
- "audit": "Auditar",
- "audit-logs": "Auditar Registros",
+ "audit": "Auditoría",
+ "audit-logs": "Registros de auditoría",
"timestamp": "Marca de tiempo",
- "entity-type": "Tipo de Entidad",
- "entity-name": "Nombre de Entidad",
+ "entity-type": "Tipo de entidad",
+ "entity-name": "Nombre de entidad",
"user": "Usuario",
"type": "Tipo",
"status": "Estado",
@@ -287,7 +292,7 @@
"type-attributes-deleted": "Atributos eliminados",
"type-rpc-call": "Llamada RPC",
"type-credentials-updated": "Credenciales actualizadas",
- "type-assigned-to-customer": "Asignado al Cliente",
+ "type-assigned-to-customer": "Asignado al cliente",
"type-unassigned-from-customer": "Asignación anulada del cliente",
"type-activated": "Activado",
"type-suspended": "Suspendido",
@@ -298,18 +303,18 @@
"type-relations-delete": "Toda relación eliminada",
"type-alarm-ack": "Reconocida",
"type-alarm-clear": "Borrada",
- "status-success": "Éxito",
- "status-failure": "Falla",
- "audit-log-details": "Auditar detalles de regisstro",
- "no-audit-logs-prompt": "Registros no encontrados",
+ "status-success": "Correcto",
+ "status-failure": "Erróneo",
+ "audit-log-details": "Detalle del registro de auditoría",
+ "no-audit-logs-prompt": "No se encontraron registros",
"action-data": "Datos de acción",
- "failure-details": "Detalles de falla",
+ "failure-details": "Detalles del error",
"search": "Buscar registros de auditoría",
"clear-search": "Borrar búsqueda"
},
"confirm-on-exit": {
"message": "Tiene cambios sin guardar. ¿Está seguro de que desea salir de esta página?",
- "html-message": "Tiene cambios sin guardar..
¿Está seguro de que desea salir de esta página?",
+ "html-message": "Tiene cambios sin guardar.
¿Está seguro de que desea salir de esta página?",
"title": "Cambios sin guardar"
},
"contact": {
@@ -327,9 +332,9 @@
"common": {
"username": "Nombre de usuario",
"password": "Contraseña",
- "enter-username": "Ingresar nombre de usuario",
- "enter-password": "Ingresar contraseña",
- "enter-search": "Ingresar búsqueda"
+ "enter-username": "Introduzca nombre de usuario",
+ "enter-password": "Introduzca contraseña",
+ "enter-search": "Introduzca búsqueda"
},
"content-type": {
"json": "Json",
@@ -340,15 +345,15 @@
"customer": "Cliente",
"customers": "Clientes",
"management": "Gestión del cliente",
- "dashboard": "Panel del Cliente",
- "dashboards": "Paneles del Cliente",
- "devices": "Dispositivos del Cliente",
- "entity-views": "Customer Entity Views",
+ "dashboard": "Panel del cliente",
+ "dashboards": "Paneles del cliente",
+ "devices": "Dispositivos del cliente",
+ "entity-views": "Vistas de entidad del cliente",
"assets": "Activos del Cliente",
- "public-dashboards": "Paneles Públicos",
- "public-devices": "Dispositivos Públicos",
- "public-assets": "Activos Públicos",
- "public-entity-views": "Public Entity Views",
+ "public-dashboards": "Paneles públicos",
+ "public-devices": "Dispositivos públicos",
+ "public-assets": "Activos públicos",
+ "public-entity-views": "Vista de entidad públicas",
"add": "Agregar cliente",
"delete": "Eliminar cliente",
"manage-customer-users": "Gestionar usuarios del cliente",
@@ -359,13 +364,13 @@
"manage-customer-assets": "Gestionar activos del cliente",
"manage-public-assets": "Gestionar activos públicos",
"add-customer-text": "Agregar nuevo cliente",
- "no-customers-text": "Clientes no encontrados",
+ "no-customers-text": "No se encontraron clientes",
"customer-details": "Detalles del cliente",
"delete-customer-title": "¿Está seguro de que desea eliminar al cliente '{{customerTitle}}'?",
- "delete-customer-text": "Tener cuidado, después de la confirmación, el cliente y todos los datos relacionados se volverán irrecuperables.",
- "delete-customers-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 customer} other {# customers} }?",
- "delete-customers-action-title": "Eliminar { count, plural, 1 {1 customer} other {# customers} }",
- "delete-customers-text": "Tener cuidado, después de la confirmación, todos los clientes seleccionados serán eliminados y todos los datos relacionados se volverán irrecuperables.",
+ "delete-customer-text": "¡Cuidado! Después de la confirmación, el cliente y todos los datos relacionados serán irrecuperables.",
+ "delete-customers-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 cliente} other {# clientes} }?",
+ "delete-customers-action-title": "Eliminar { count, plural, 1 {1 cliente} other {# clientes} }",
+ "delete-customers-text": "¡Cuidado! Después de la confirmación, todos los clientes seleccionados serán eliminados y todos los datos relacionados serán irrecuperables.",
"manage-users": "Gestionar usuarios",
"manage-assets": "Gestionar activos",
"manage-devices": "Gestionar dispositivos",
@@ -378,7 +383,7 @@
"copyId": "Copiar ID del cliente",
"idCopiedMessage": "ID del cliente ha sido copiada al portapapeles",
"select-customer": "Seleccionar cliente",
- "no-customers-matching": "Clientes que coincidan con '{{entity}}' no fueron encontrados.",
+ "no-customers-matching": "No se encontraron clientes que coincidan con '{{entity}}'.",
"customer-required": "El cliente es requerido",
"select-default-customer": "Seleccionar cliente predeterminado",
"default-customer": "Cliente predeterminado",
@@ -394,22 +399,22 @@
"dashboard": "Panel",
"dashboards": "Paneles",
"management": "Gestión del panel",
- "view-dashboards": "Ver Panel",
- "add": "Agregar Paneles",
- "assign-dashboard-to-customer": "Asignar Panel(es) Al Cliente",
- "assign-dashboard-to-customer-text": "Por favor seleccionar los paneles para asignar al cliente",
- "assign-to-customer-text": "Por favor seleccionar el cliente para asignar el(los) panel(es)",
+ "view-dashboards": "Ver panel",
+ "add": "Agregar paneles",
+ "assign-dashboard-to-customer": "Asignar panel(es) al cliente",
+ "assign-dashboard-to-customer-text": "Por favor selecciona los paneles para asignar al cliente",
+ "assign-to-customer-text": "Por favor selecciona el cliente para asignar el(los) panel(es)",
"assign-to-customer": "Asignar al cliente",
"unassign-from-customer": "Anular asignación del cliente",
"make-public": "Hacer panel público",
- "make-private": "Hcer panel privado",
+ "make-private": "Hacer panel privado",
"manage-assigned-customers": "Gestionar clientes asignados",
"assigned-customers": "Clientes asignados",
- "assign-to-customers": "Asignar Panel(es) Al(Los) Cliente(s)",
+ "assign-to-customers": "Asignar panel(es) al(los) cliente(s)",
"assign-to-customers-text": "Por favor seleccionar los clientes para asignar el(los) panel(es)",
- "unassign-from-customers": "Anular Asignación Del(De Los) Panel(es) De Los Clientes",
- "unassign-from-customers-text": "Por favor seeccionar los clientes oara anular asignación del(de los) panel(es)",
- "no-dashboards-text": "Paneles no encontrados",
+ "unassign-from-customers": "Anular asignación del(de los) panel(es) de los clientes",
+ "unassign-from-customers-text": "Por favor selecciona los clientes para anular asignación del(de los) panel(es)",
+ "no-dashboards-text": "No se encontraron paneles",
"no-widgets": "Sin widgets configurados",
"add-widget": "Agregar nuevo widget",
"title": "Título",
@@ -419,7 +424,7 @@
"title-required": "El título es requerido.",
"description": "Descripción",
"details": "Detalles",
- "dashboard-details": "Detalles del Panel",
+ "dashboard-details": "Detalles del panel",
"add-dashboard-text": "Agregar nuevo panel",
"assign-dashboards": "Asignar paneles",
"assign-new-dashboard": "Aignar nuevo panel",
@@ -429,10 +434,10 @@
"unassign-dashboards": "Anular asignación de paneles",
"unassign-dashboards-action-title": "Anular asignación { count, plural, 1 {1 dashboard} other {# dashboards} } del cliente",
"delete-dashboard-title": "¿Está seguro de que desea eliminar el panel '{{dashboardTitle}}'?",
- "delete-dashboard-text": "Tener cuidado, después de la confirmación, el panel y todos los datos relacionados se volverán irrecuperables.",
+ "delete-dashboard-text": "¡Cuidado! Después de la confirmación, el panel y todos los datos relacionados serán irrecuperables.",
"delete-dashboards-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 dashboard} other {# dashboards} }?",
"delete-dashboards-action-title": "Eliminar { count, plural, 1 {1 dashboard} other {# dashboards} }",
- "delete-dashboards-text": "Tener cuidado, después de la confirmación, todos los paneles seleccionados serán eliminados y todos los datos relacionados se volverán irrecuperables.",
+ "delete-dashboards-text": "¡Cuidado! Después de la confirmación, todos los paneles seleccionados serán eliminados y todos los datos relacionados serán irrecuperables.",
"unassign-dashboard-title": "¿Está seguro de que desea anular la asignación del panel '{{dashboardTitle}}'?",
"unassign-dashboard-text": "Después de la confirmación, se anulará la asignación del panel y no será accesible por el cliente.",
"unassign-dashboard": "Anular asignación del panel",
@@ -460,25 +465,25 @@
"no-image": "Ninguna imagen seleccionada",
"drop-image": "Colocar una imagen o hacer clic para seleccionar un archivo para cargar.",
"settings": "Configuración",
- "columns-count": "Conteo de columnas",
- "columns-count-required": "Conteo de columnas es requerido.",
- "min-columns-count-message": "Solamente contar 10 columnas como mínimo es permitido",
- "max-columns-count-message": "Solamente contar 1000 columnas como máximo es permitiddo",
+ "columns-count": "Número de columnas",
+ "columns-count-required": "Número de columnas es requerido.",
+ "min-columns-count-message": "Sólo está permitido 10 columnas como mínimo.",
+ "max-columns-count-message": "Sólo está permitido 1000 columnas como máximo.",
"widgets-margins": "Margen entre widgets",
"horizontal-margin": "Margen horizontal",
"horizontal-margin-required": "El valor del margen horizontal es requerido.",
- "min-horizontal-margin-message": "Solamente es permitido el 0 como valor mínimo para el margen horizontal",
- "max-horizontal-margin-message": "Solamente es permitido el 50 como valor máximo para el margen horizontal",
+ "min-horizontal-margin-message": "Sólo está permitido el 0 como valor mínimo para el margen horizontal",
+ "max-horizontal-margin-message": "Sólo está permitido el 50 como valor máximo para el margen horizontal",
"vertical-margin": "Margen vertical",
"vertical-margin-required": "El valor del margen vertical es requerido.",
- "min-vertical-margin-message": "Solamente es permitido el 0 como valor mínimo para el margen vertical.",
- "max-vertical-margin-message": "Solamente es permitido el 50 como valor máximo para el margen vertical",
+ "min-vertical-margin-message": "Sólo está permitido el 0 como valor mínimo para el margen vertical.",
+ "max-vertical-margin-message": "Sólo está permitido el 50 como valor máximo para el margen vertical",
"autofill-height": "Llenado automático de altura de diseño",
"mobile-layout": "Configuración de diseño para móvil",
"mobile-row-height": "Altura de fila para móvil, píxel",
"mobile-row-height-required": "Altura de fila para móvil es requerida.",
- "min-mobile-row-height-message": "Solamente es permitido 5 píxeles como valor mínimo de altura de fila para móvil.",
- "max-mobile-row-height-message": "Solamente es permitido 200 píxeles como valor máximo de altura de fila para móvil.",
+ "min-mobile-row-height-message": "Sólo está permitido 5 píxeles como valor mínimo en la altura de fila para móvil.",
+ "max-mobile-row-height-message": "Sólo está permitido 200 píxeles como valor máximo en la altura de fila para móvil.",
"display-title": "Mostrar título del panel",
"toolbar-always-open": "Mantener la barra de herramientas abierta",
"title-color": "Color del título",
@@ -550,7 +555,12 @@
"alarm-fields-required": "Campos de alarma son requeridos.",
"function-types": "Tipos de funciones",
"function-types-required": "Tipos de funciones son requeridos.",
- "maximum-function-types": "Máximo { count, plural, 1 {1 function type is allowed.} other {# function types are allowed} }"
+ "maximum-function-types": "Máximo { count, plural, 1 {1 function type is allowed.} other {# function types are allowed} }",
+ "time-description": "timestamp of the current value;",
+ "value-description": "the current value;",
+ "prev-value-description": "result of the previous function call;",
+ "time-prev-description": "timestamp of the previous value;",
+ "prev-orig-value-description": "original previous value;"
},
"datasource": {
"type": "Tipo de fuente de datos",
@@ -558,23 +568,23 @@
"add-datasource-prompt": "Por favor agregue fuente de datos"
},
"details": {
- "details": "Detalles",
- "edit-mode": "Modo de edición"
+ "edit-mode": "Modo de edición",
+ "toggle-edit-mode": "Cambiar mode de edición"
},
"device": {
"device": "Dispositivo",
"device-required": "Dispositivo es requerido.",
"devices": "Dispositivos",
"management": "Gestión del dispositivo",
- "view-devices": "Ver Dispositivos",
+ "view-devices": "Ver dispositivos",
"device-alias": "Alias del dispositivo",
"aliases": "Alias de los dispositivos",
"no-alias-matching": "'{{alias}}' no encontrado.",
- "no-aliases-found": "Alias no encontrados.",
+ "no-aliases-found": "No se encontraron alias.",
"no-key-matching": "'{{key}}' no encontrado.",
"no-keys-found": "Claves no encontradas.",
- "create-new-alias": "Crear uno nuevo!",
- "create-new-key": "Crear una nueva!",
+ "create-new-alias": "¡Crear uno nuevo!",
+ "create-new-key": "¡Crear una nueva!",
"duplicate-alias-error": "Alias duplicado encontrado '{{alias}}'.
Los alias del dispositivo deben ser únicos dentro del panel.",
"configure-alias": "Configurar '{{alias}}' alias",
"no-devices-matching": "Dispositivos que coincidan con '{{entity}}' no fueron encontrados.",
@@ -591,10 +601,10 @@
"add": "Agregar Dispositivo",
"assign-to-customer": "Asignar al cliente",
"assign-device-to-customer": "Asignar Dispositivo(s) Al Cliente",
- "assign-device-to-customer-text": "Por favor seleccionar los dispositivos para asignar al cliente",
+ "assign-device-to-customer-text": "Por favor selecciona los dispositivos para asignar al cliente",
"make-public": "Hacer público el dispositivo",
"make-private": "Hacer privado el dispositivo",
- "no-devices-text": "Dispositivos no encontrados",
+ "no-devices-text": "No se encontraron dispositivos",
"assign-to-customer-text": "Por favor seleccionar el cliente para asignar el(los) dispositivo(s)",
"device-details": "Detalles del dispositivo",
"add-device-text": "Agregar nuevo dispositivo",
@@ -602,11 +612,11 @@
"manage-credentials": "Gestionar credenciales",
"delete": "Eliminar dispositivo",
"assign-devices": "Asignar dispositivos",
- "assign-devices-text": "Asignar { count, plural, 1 {1 device} other {# devices} } al cliente",
+ "assign-devices-text": "Asignar { count, plural, 1 {1 dispositivo} other {# dispositivos} } al cliente",
"delete-devices": "Eliminar dispositivos",
"unassign-from-customer": "Anular asignación del cliente",
"unassign-devices": "Anular asignación de dispositivos",
- "unassign-devices-action-title": "Anular asignación { count, plural, 1 {1 device} other {# devices} } del cliente",
+ "unassign-devices-action-title": "Anular asignación { count, plural, 1 {1 dispositivo} other {# dispositivos} } del cliente",
"assign-new-device": "Asignar nuevo dispositivo",
"make-public-device-title": "¿Está seguro de que desea hacer el dispositivo '{{deviceName}}' público?",
"make-public-device-text": "Después de la confirmación, el dispositivo y todos sus datos se harán públicos y accesibles por otros.",
@@ -614,14 +624,14 @@
"make-private-device-text": "Después de la confirmación, el dispositivo y todos sus datos se harán privados y no serán accesibles para otros.",
"view-credentials": "Ver credenciales",
"delete-device-title": "¿Está seguro de que desea hacer el dispositivo '{{deviceName}}'?",
- "delete-device-text": "Tener cuidado, después de la confirmación, el dispositivo y todos sus datos relacionados se volverán irrecuperables.",
- "delete-devices-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 device} other {# devices} }?",
- "delete-devices-action-title": "Eliminar { count, plural, 1 {1 device} other {# devices} }",
- "delete-devices-text": "Tener cuidado, después de la confirmación, todos los dispositivos seleccionados serán eliminados y todos los datos relacionados se volverán irrecuperables.",
+ "delete-device-text": "¡Cuidado! Después de la confirmación, el dispositivo y todos sus datos relacionados serán irrecuperables.",
+ "delete-devices-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 dispositivo} other {# dispositivos} }?",
+ "delete-devices-action-title": "Eliminar { count, plural, 1 {1 dispositivo} other {# dispositivos} }",
+ "delete-devices-text": "¡Cuidado! Después de la confirmación, todos los dispositivos seleccionados serán eliminados y todos los datos relacionados serán irrecuperables.",
"unassign-device-title": "¿Está seguro de que desea anular la asignación del dispositivo '{{deviceName}}'?",
"unassign-device-text": "Después de la confirmación, se anulará asignación del dispositivo y no será accesible por el cliente.",
"unassign-device": "Anular asignación del dispositivo",
- "unassign-devices-title": "¿Está seguro de que desea anular asignación { count, plural, 1 {1 device} other {# devices} }?",
+ "unassign-devices-title": "¿Está seguro de que desea anular asignación { count, plural, 1 {1 dispositivo} other {# dispositivos} }?",
"unassign-devices-text": "Después de la confirmación, se anulará asignación de todos los dispositivos seleccionados y no serán accesibles por el cliente.",
"device-credentials": "Credenciales del dispositivo",
"credentials-type": "Tipo de credenciales",
@@ -635,7 +645,7 @@
"device-type": "Tipo de dispositivo",
"device-type-required": "Tipo de dispositivo es requerido.",
"select-device-type": "Seleccionar tipo de dispositivo",
- "enter-device-type": "Ingresar tipo de dispositivo",
+ "enter-device-type": "Teclee tipo de dispositivo",
"any-device": "Algún dispositivo",
"no-device-types-matching": "Tipos de dispositivos que coincidan con '{{entitySubtype}}' no fueron encontrados.",
"device-type-list-empty": "No se seleccionaron tipos de dispositivos.",
@@ -661,7 +671,7 @@
"close": "Cerrar diálogo"
},
"error": {
- "unable-to-connect": "No se puede conectar al servidor! Por favor revise su conexión a Internet.",
+ "unable-to-connect": "¡No se puede conectar al servidor! Por favor, revise su conexión a Internet.",
"unhandled-error-code": "Código de error no controlado: {{errorCode}}",
"unknown-error": "Error desconocido"
},
@@ -671,7 +681,7 @@
"aliases": "Alias de las entidades",
"entity-alias": "Alias de la entidad",
"unable-delete-entity-alias-title": "No se puede borrar alias de la entidad",
- "unable-delete-entity-alias-text": "Alias de la entidad '{{entityAlias}}' no piuede ser eliminado porque es usado por los siguientes widget(s):
{{widgetsList}}",
+ "unable-delete-entity-alias-text": "Alias de la entidad '{{entityAlias}}' no se puede eliminar porque es usado por los siguientes widget(s):
{{widgetsList}}",
"duplicate-alias-error": "Alias duplicado fue encontrado '{{alias}}'.
Alias de las entidades deben ser únicos dentro del panel.",
"missing-entity-filter-error": "Falta filtro para el alias '{{alias}}'.",
"configure-alias": "Configurar '{{alias}}' alias",
@@ -684,58 +694,58 @@
"entity-types": "Tipos de entidades",
"entity-type-list": "Lista de tipos de entidades",
"any-entity": "Alguna entidad",
- "enter-entity-type": "Ingresara tipo de entidad",
- "no-entities-matching": "Entidades que coincidan con '{{entity}}' no fueron encontradas.",
- "no-entity-types-matching": "Tipos de entidades que coincidan con '{{entityType}}' no fueron encontrados.",
+ "enter-entity-type": "Teclee tipo de entidad",
+ "no-entities-matching": "No se encontraron entidades que coincidan con '{{entity}}'.",
+ "no-entity-types-matching": "No se encontraron tipos de entidades que coincidan con '{{entityType}}'.",
"name-starts-with": "El nombre comienza con",
"use-entity-name-filter": "Utilizar filtro",
"entity-list-empty": "Entidades no seleccionadas.",
"entity-type-list-empty": "Tipos de entidades no seleccionados.",
"entity-name-filter-required": "Filtro del nombre de la entidad es requerido.",
- "entity-name-filter-no-entity-matched": "Entidades que comienzan con '{{entity}}' no fueron encontradas.",
+ "entity-name-filter-no-entity-matched": "No se encontraron entidades que comienzan con '{{entity}}'.",
"all-subtypes": "Todas",
"select-entities": "Seleccionar entidades",
- "no-aliases-found": "Alias no encontrados.",
+ "no-aliases-found": "No se encontraron alias.",
"no-alias-matching": "'{{alias}}' no encontrado.",
- "create-new-alias": "Crear uno nuevo!",
+ "create-new-alias": "¡Crear uno nuevo!",
"key": "Clave",
"key-name": "Nombre de clave",
- "no-keys-found": "Claves no encontradas.",
+ "no-keys-found": "No se encontraron claves.",
"no-key-matching": "'{{key}}' no encontrada.",
- "create-new-key": "Crear una nueva!",
+ "create-new-key": "¡Crear una nueva!",
"type": "Tipo",
"type-required": "Tipo de entidad es requerido.",
"type-device": "Dispositivo",
"type-devices": "Dispositivos",
- "list-of-devices": "{ count, plural, 1 {One device} other {List of # devices} }",
+ "list-of-devices": "{ count, plural, 1 {Un dispositivo} other {Lista de # dispositivos} }",
"device-name-starts-with": "Dispositivos cuyos nombres comienzan con '{{prefix}}'",
"type-asset": "Activo",
"type-assets": "Activos",
- "list-of-assets": "{ count, plural, 1 {One asset} other {List of # assets} }",
+ "list-of-assets": "{ count, plural, 1 {Un activo} other {Lista de # activos} }",
"asset-name-starts-with": "Activos cuyos nombres comienzan con '{{prefix}}'",
- "type-entity-view": "Entity View",
- "type-entity-views": "Entity Views",
- "list-of-entity-views": "{ count, plural, 1 {One entity view} other {List of # entity views} }",
- "entity-view-name-starts-with": "Entity Views whose names start with '{{prefix}}'",
+ "type-entity-view": "Vista de entidad",
+ "type-entity-views": "Vistas de entidad",
+ "list-of-entity-views": "{ count, plural, 1 {Una vista de entidad} other {Lista de # vistas de entidad} }",
+ "entity-view-name-starts-with": "Vistas de entidad cuyos nombres que comienzan con '{{prefix}}'",
"type-rule": "Regla",
"type-rules": "Reglas",
- "list-of-rules": "{ count, plural, 1 {One rule} other {List of # rules} }",
+ "list-of-rules": "{ count, plural, 1 {Una regla} other {Lista de # reglas} }",
"rule-name-starts-with": "Reglas cuyos nombres comienzan con '{{prefix}}'",
"type-plugin": "Complemento",
"type-plugins": "Complementos",
- "list-of-plugins": "{ count, plural, 1 {One plugin} other {List of # plugins} }",
+ "list-of-plugins": "{ count, plural, 1 {Un complemento} other {Lista de # complementos} }",
"plugin-name-starts-with": "Complementos cuyos nombres comienzan con '{{prefix}}'",
"type-tenant": "Organización",
"type-tenants": "Organizaciones",
- "list-of-tenants": "{ count, plural, 1 {One tenant} other {List of # tenants} }",
+ "list-of-tenants": "{ count, plural, 1 {Una organización} other {Lista de # organizaciones} }",
"tenant-name-starts-with": "Organizaciones cuyos nombres comienzan con '{{prefix}}'",
"type-customer": "Cliente",
"type-customers": "Clientes",
- "list-of-customers": "{ count, plural, 1 {One customer} other {List of # customers} }",
+ "list-of-customers": "{ count, plural, 1 {Un cliente} other {Lista de # clientes} }",
"customer-name-starts-with": "Clientes cuyos nombres comienzan con '{{prefix}}'",
"type-user": "Usuario",
"type-users": "Usuarios",
- "list-of-users": "{ count, plural, 1 {One user} other {List of # users} }",
+ "list-of-users": "{ count, plural, 1 {Un usuario} other {Lista de # usuarios} }",
"user-name-starts-with": "Usuarios cuyos nombres comienzan con '{{prefix}}'",
"type-dashboard": "Panel",
"type-dashboards": "Paneles",
@@ -743,103 +753,115 @@
"dashboard-name-starts-with": "Paneles cuyos nombres comienzan con '{{prefix}}'",
"type-alarm": "Alarma",
"type-alarms": "Alarmas",
- "list-of-alarms": "{ count, plural, 1 {One alarms} other {List of # alarms} }",
+ "list-of-alarms": "{ count, plural, 1 {Una alarma} other {Lista de # alarmas} }",
"alarm-name-starts-with": "Alarmas cuyos nombres comienzan con '{{prefix}}'",
"type-rulechain": "Cadena de reglas",
"type-rulechains": "Cadenas de reglas",
- "list-of-rulechains": "{ count, plural, 1 {One rule chain} other {List of # rule chains} }",
- "rulechain-name-starts-with": "Cadenas reglas cuyos nombres comienzan con '{{prefix}}'",
+ "list-of-rulechains": "{ count, plural, 1 {Una cadena de reglas} other {Lista de # cadenas de reglas} }",
+ "rulechain-name-starts-with": "Cadenas de reglas cuyos nombres comienzan con '{{prefix}}'",
"type-rulenode": "Nodo de reglas",
"type-rulenodes": "Nodos de reglas",
- "list-of-rulenodes": "{ count, plural, 1 {One rule node} other {List of # rule nodes} }",
+ "list-of-rulenodes": "{ count, plural, 1 {Un nodo de reglas} other {Lista de # nodos de reglas} }",
"rulenode-name-starts-with": "Nodos de reglas cuyos nombres comienzan con '{{prefix}}'",
"type-current-customer": "Cliente Actual",
"search": "Buscar entidades",
- "selected-entities": "{ count, plural, 1 {1 entity} other {# entities} } seleccionadas",
+ "selected-entities": "{ count, plural, 1 {1 entidad} other {# entidades} } seleccionadas",
"entity-name": "Nombre de la entidad",
"details": "Detalles de la entidad",
"no-entities-prompt": "Entidades no encontradas",
"no-data": "No hay datos para mostrar",
- "columns-to-display": "Columns to Display"
+ "columns-to-display": "Columnas a mostrar"
},
"entity-view": {
- "entity-view": "Entity View",
- "entity-views": "Entity Views",
- "management": "Entity View management",
- "view-entity-views": "View Entity Views",
- "entity-view-alias": "Entity View alias",
- "aliases": "Entity View aliases",
- "no-alias-matching": "'{{alias}}' not found.",
- "no-aliases-found": "No aliases found.",
- "no-key-matching": "'{{key}}' not found.",
- "no-keys-found": "No keys found.",
- "create-new-alias": "Create a new one!",
- "create-new-key": "Create a new one!",
- "duplicate-alias-error": "Duplicate alias found '{{alias}}'.
Entity View aliases must be unique whithin the dashboard.",
- "configure-alias": "Configure '{{alias}}' alias",
- "no-entity-views-matching": "No entity views matching '{{entity}}' were found.",
+ "entity-view": "Vista de entidad",
+ "entity-view-required": "Vista de entidad es requerido.",
+ "entity-views": "Vistas de entidad",
+ "management": "Gestión de vistas de entidad",
+ "view-entity-views": "Ver vista de entidad",
+ "entity-view-alias": "Alias de vista de entidad",
+ "aliases": "Alias de vista de entidad",
+ "no-alias-matching": "'{{alias}}' no encontrado.",
+ "no-aliases-found": "No se encontraron alias.",
+ "no-key-matching": "'{{key}}' no encontrado.",
+ "no-keys-found": "No se encontraron claves.",
+ "create-new-alias": "¡Crear un nuevo!",
+ "create-new-key": "¡Crear una nueva!",
+ "duplicate-alias-error": "Alias duplicado'{{alias}}'.
El alias de la vista de entidad debe ser único en el dashboard.",
+ "configure-alias": "Configurar alias '{{alias}}'",
+ "no-entity-views-matching": "No se encontraron vistas que coincidan con '{{entity}}'.",
"alias": "Alias",
- "alias-required": "Entity View alias is required.",
- "remove-alias": "Remove entity view alias",
- "add-alias": "Add entity view alias",
- "name-starts-with": "Entity View name starts with",
- "entity-view-list": "Entity View list",
- "use-entity-view-name-filter": "Use filter",
- "entity-view-list-empty": "No entity views selected.",
- "entity-view-name-filter-required": "Entity view name filter is required.",
- "entity-view-name-filter-no-entity-view-matched": "No entity views starting with '{{entityView}}' were found.",
- "add": "Add Entity View",
- "assign-to-customer": "Assign to customer",
- "assign-entity-view-to-customer": "Assign Entity View(s) To Customer",
- "assign-entity-view-to-customer-text": "Please select the entity views to assign to the customer",
- "no-entity-views-text": "No entity views found",
- "assign-to-customer-text": "Please select the customer to assign the entity view(s)",
- "entity-view-details": "Entity view details",
- "add-entity-view-text": "Add new entity view",
- "delete": "Delete entity view",
- "assign-entity-views": "Assign entity views",
- "assign-entity-views-text": "Assign { count, plural, 1 {1 entityView} other {# entityViews} } to customer",
- "delete-entity-views": "Delete entity views",
- "unassign-from-customer": "Unassign from customer",
- "unassign-entity-views": "Unassign entity views",
- "unassign-entity-views-action-title": "Unassign { count, plural, 1 {1 entityView} other {# entityViews} } from customer",
- "assign-new-entity-view": "Assign new entity view",
- "delete-entity-view-title": "Are you sure you want to delete the entity view '{{entityViewName}}'?",
- "delete-entity-view-text": "Be careful, after the confirmation the entity view and all related data will become unrecoverable.",
- "delete-entity-views-title": "Are you sure you want to entity view { count, plural, 1 {1 entityView} other {# entityViews} }?",
- "delete-entity-views-action-title": "Delete { count, plural, 1 {1 entityView} other {# entityViews} }",
- "delete-entity-views-text": "Be careful, after the confirmation all selected entity views will be removed and all related data will become unrecoverable.",
- "unassign-entity-view-title": "Are you sure you want to unassign the entity view '{{entityViewName}}'?",
- "unassign-entity-view-text": "After the confirmation the entity view will be unassigned and won't be accessible by the customer.",
- "unassign-entity-view": "Unassign entity view",
- "unassign-entity-views-title": "Are you sure you want to unassign { count, plural, 1 {1 entityView} other {# entityViews} }?",
- "unassign-entity-views-text": "After the confirmation all selected entity views will be unassigned and won't be accessible by the customer.",
- "entity-view-type": "Entity View type",
- "entity-view-type-required": "Entity View type is required.",
- "select-entity-view-type": "Select entity view type",
- "enter-entity-view-type": "Enter entity view type",
- "any-entity-view": "Any entity view",
- "no-entity-view-types-matching": "No entity view types matching '{{entitySubtype}}' were found.",
- "entity-view-type-list-empty": "No entity view types selected.",
- "entity-view-types": "Entity View types",
- "name": "Name",
- "name-required": "Name is required.",
- "description": "Description",
- "events": "Events",
- "details": "Details",
- "copyId": "Copy entity view Id",
- "assignedToCustomer": "Assigned to customer",
- "unable-entity-view-device-alias-title": "Unable to delete entity view alias",
- "unable-entity-view-device-alias-text": "Device alias '{{entityViewAlias}}' can't be deleted as it used by the following widget(s):
{{widgetsList}}",
- "select-entity-view": "Select entity view",
- "make-public": "Make entity view public",
- "start-ts": "Start time",
- "end-ts": "End time",
- "date-limits": "Date limits",
- "client-attributes": "Client attributes",
- "shared-attributes": "Shared attributes",
- "server-attributes": "Server attributes",
- "timeseries": "Timeseries"
+ "alias-required": "Alias de vista de entidad es requerido.",
+ "remove-alias": "Borrar alias de la vista de entidad",
+ "add-alias": "Añadir alias a la vista de entidad",
+ "name-starts-with": "Nombre de vista de entidad comienza con",
+ "entity-view-list": "Lista de vistas de entidad",
+ "use-entity-view-name-filter": "Usar el filtro",
+ "entity-view-list-empty": "No hay vistas de entidad seleccionadas.",
+ "entity-view-name-filter-required": "Nombre del filtro de vista de entidad es requerido.",
+ "entity-view-name-filter-no-entity-view-matched": "No se econtraron vistas de entidad que comiencen con '{{entityView}}'.",
+ "add": "Añadir vista de entidad",
+ "assign-to-customer": "Asignar a cliente",
+ "assign-entity-view-to-customer": "Asignar vista de entidad a cliente",
+ "assign-entity-view-to-customer-text": "Por favor, seleccione las vistas de entidad para asignar al cliente",
+ "no-entity-views-text": "No se encontraron vistas de entidad",
+ "assign-to-customer-text": "Por favor, seleccione el cliente para asignar la vista de entidad",
+ "entity-view-details": "Detalles de la vista de entidad",
+ "add-entity-view-text": "Añadir nueva vista de entidad",
+ "delete": "Borrar vista de entidad",
+ "assign-entity-views": "Asignar vistas de entidad",
+ "assign-entity-views-text": "Asignar { count, plural, 1 {1 vista de entidad} other {# vistas de entidad} } a cliente",
+ "delete-entity-views": "Borrar vistas de entidad",
+ "unassign-from-customer": "Anular asignación a cliente",
+ "unassign-entity-views": "Anular asignación de vistas de entidad",
+ "unassign-entity-views-action-title": "Anular asignación { count, plural, 1 {1 vista de entidad} other {# vistas de entidad} } al cliente",
+ "assign-new-entity-view": "Asignar nueva vista de entidad",
+ "delete-entity-view-title": "¿Está seguro que quiere borrar la vista de entidad '{{entityViewName}}'?",
+ "delete-entity-view-text": "¡Cuidado! Después de la confirmación, la vista de la entidad y todos los datos relacionados serán irrecuperables.",
+ "delete-entity-views-title": "¿Está seguro que quiere borrar las vistas de entidad { count, plural, 1 {1 entityView} other {# entityViews} }?",
+ "delete-entity-views-action-title": "Borrar { count, plural, 1 {1 vista de entidad} other {# vistas de entidad} }",
+ "delete-entity-views-text": "¡Cuidado! Después de la confirmación, todas las vistas de entidades seleccionadas se eliminarán y todos los datos relacionados serán irrecuperables.",
+ "unassign-entity-view-title": "¿Está seguro que quiere anular la asignación de la vista de entidad '{{entityViewName}}'?",
+ "unassign-entity-view-text": "Después de la confirmación, la vista de la entidad quedará sin asignar y el cliente no podrá acceder a ella.",
+ "unassign-entity-view": "Anular asignación de la vista de entidad",
+ "unassign-entity-views-title": "¿Está seguro que quiere anular la asignación de { count, plural, 1 {1 vista de entidad} other {# vistas de entidad} }?",
+ "unassign-entity-views-text": "Después de la confirmación, todas las vistas de entidades seleccionadas quedarán sin asignar y el cliente no podrá acceder a ellas.",
+ "entity-view-type": "Tipo de vista de entidad",
+ "entity-view-type-required": "Tipo de vista de entidad es requerido.",
+ "select-entity-view-type": "Seleccione el tipo de vista de entidad",
+ "enter-entity-view-type": "Teclee el tipo de vista de entidad",
+ "any-entity-view": "Cualquier vista de entidad",
+ "no-entity-view-types-matching": "No se encontraron typos de vista de entidad '{{entitySubtype}}'.",
+ "entity-view-type-list-empty": "No hay tipos de vista de entidad seleccionados.",
+ "entity-view-types": "Tipos de vista de entidad",
+ "name": "Nombre",
+ "name-required": "Nombre es requerido.",
+ "description": "Descripción",
+ "events": "Eventos",
+ "details": "Detalles",
+ "copyId": "Copiar el Id de la vista de entidad",
+ "assignedToCustomer": "Asignado a cliente",
+ "unable-entity-view-device-alias-title": "No se puede eliminar el alias de vista de entidad",
+ "unable-entity-view-device-alias-text": "El alias del dispositivo '{{entityViewAlias}}' no se puede borrar porque está siendo usado por el widget(s):
{{widgetsList}}",
+ "select-entity-view": "Seleccionar vista de entidad",
+ "make-public": "Hacer pública la vista de entidad",
+ "start-date": "Fecha de inicio",
+ "start-ts": "Tiempo de inicio",
+ "end-date": "Fecha de finalización",
+ "end-ts": "Tiempo de finalización",
+ "date-limits": "Limites de fecha",
+ "client-attributes": "Atributos de cliente",
+ "shared-attributes": "Atributos compartidos",
+ "server-attributes": "Atributos de servidor",
+ "timeseries": "Series de tiempo",
+ "client-attributes-placeholder": "Atributos de cliente",
+ "shared-attributes-placeholder": "Atributos compartidos",
+ "server-attributes-placeholder": "Atributos de servidor",
+ "timeseries-placeholder": "Series de tiempo",
+ "target-entity": "Entidad objetivo",
+ "attributes-propagation": "Propagación de atributos",
+ "attributes-propagation-hint": "La vista de entidad copiará automáticamente los atributos especificados de la entidad de destino cada vez que guarde o actualice esta vista de entidad. Por razones de rendimiento, los atributos de entidad objetivo no se propagan a la vista de entidad en cada cambio de atributo. Puede habilitar la propagación automática configurando el nodo de la regla \"copiar a la vista\" en su cadena de reglas y vincular los mensajes \"Atributos de la publicación\" y \"Atributos actualizados\" al nuevo nodo de la regla.",
+ "timeseries-data": "Datos de series de tiempo",
+ "timeseries-data-hint": "Configure las claves de los datos de las series de tiempo de la entidad de destino que serán accesibles para la vista de la entidad. Los datos de esta serie temporal son de solo lectura."
},
"event": {
"event-type": "Tipo de evento",
@@ -848,7 +870,7 @@
"type-stats": "Estadísticas",
"type-debug-rule-node": "Depurar",
"type-debug-rule-chain": "Depurar",
- "no-events-prompt": "Eventos no encontrados",
+ "no-events-prompt": "No se encontraron eventos",
"error": "Error",
"alarm": "Alarma",
"event-time": "Tiempo del evento",
@@ -865,14 +887,14 @@
"data": "Datos",
"event": "Evento",
"status": "Estado",
- "success": "Éxito",
- "failed": "Falla",
+ "success": "Correcto",
+ "failed": "Erróneo",
"messages-processed": "Mensajes procesados",
"errors-occurred": "Errores ocurridos"
},
"extension": {
"extensions": "Extensiones",
- "selected-extensions": "{ count, plural, 1 {1 extension} other {# extensions} } seleccionadas",
+ "selected-extensions": "{ count, plural, 1 {1 extension} other {# extensiones} } seleccionadas",
"type": "Tipo",
"key": "Clave",
"value": "Valor",
@@ -885,9 +907,9 @@
"add": "Agregar extensión",
"edit": "Editar extensión",
"delete-extension-title": "¿Está seguro de que desea eliminar la extensión '{{extensionId}}'?",
- "delete-extension-text": "Tener cuidado, después de la confirmación, la extensión y todos los datos relacionados se volverán irrecuperables.",
- "delete-extensions-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 extension} other {# extensions} }?",
- "delete-extensions-text": "Tener cuidado, después de la confirmación, se eliminarán todas las extensiones seleccionadas.",
+ "delete-extension-text": "¡Cuidado! Después de la confirmación, la extensión y todos los datos relacionados serán irrecuperables.",
+ "delete-extensions-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 extension} other {# extensiones} }?",
+ "delete-extensions-text": "¡Cuidado! Después de la confirmación, se eliminarán todas las extensiones seleccionadas.",
"converters": "Conversores",
"converter-id": "ID del conversor",
"configuration": "Configuración",
@@ -986,6 +1008,8 @@
"modbus-add-server": "Agregar servidor/esclavo",
"modbus-add-server-prompt": "Por favor agregar servidor/esclavo",
"modbus-transport": "Transporte",
+ "modbus-tcp-reconnect": "Reconexión automática",
+ "modbus-rtu-over-tcp": "RTU sobre TCP",
"modbus-port-name": "Nombre del puerto serial",
"modbus-encoding": "Codificación",
"modbus-parity": "Paridad",
@@ -1010,7 +1034,6 @@
"modbus-register-count": "Contador del registro",
"modbus-register-count-range": "Contador del registro debe ser un valor positivo.",
"modbus-byte-order": "Orden del byte",
-
"sync": {
"status": "Estado",
"sync": "Sincronización",
@@ -1018,7 +1041,6 @@
"last-sync-time": "Último tiempo de sincroniación",
"not-available": "No disponible"
},
-
"export-extensions-configuration": "Exportar configuración de extensiones",
"import-extensions-configuration": "Importar configuración de extensiones",
"import-extensions": "Importar extensiones",
@@ -1038,12 +1060,12 @@
},
"grid": {
"delete-item-title": "¿Está seguro de que desea eliminar este ítem?",
- "delete-item-text": "Tener cuidado, después de la confirmación, este ítem y todos los datos relacionados se volverán irrecuperables.",
- "delete-items-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 item} other {# items} }?",
- "delete-items-action-title": "Eliminar { count, plural, 1 {1 item} other {# items} }",
- "delete-items-text": "Tener cuidado, después de la confirmación se eliminarán todos los ítems seleccionados y todos los datos relacionados se volverán irrecuperables.",
+ "delete-item-text": "¡Cuiado! Después de la confirmación, este ítem y todos los datos relacionados serán irrecuperables.",
+ "delete-items-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 ítem} other {# ítems} }?",
+ "delete-items-action-title": "Eliminar { count, plural, 1 {1 ítem} other {# ítems} }",
+ "delete-items-text": "¡Cuidado! Después de la confirmación se eliminarán todos los ítems seleccionados y todos los datos relacionados serán irrecuperables.",
"add-item-text": "Agregar nuevo ítem",
- "no-items-text": "Ítems no encontrados",
+ "no-items-text": "No se encontraron ítems",
"item-details": "Detalles del ítem",
"delete-item": "Eliminar ítem",
"delete-items": "Eliminar ítems",
@@ -1070,7 +1092,7 @@
"js-func": {
"no-return-error": "La función debe devolver el valor!",
"return-type-mismatch": "La función debe devolver el valor de '{{type}}' type!",
- "tidy": "Ordenado"
+ "tidy": "Formatear"
},
"key-val": {
"key": "Clave",
@@ -1102,19 +1124,19 @@
},
"login": {
"login": "Iniciar sesión",
- "request-password-reset": "Solicitar Restablecimiento Contraseña",
- "reset-password": "Restablecer Contraseña",
- "create-password": "Crear Contraseña",
- "passwords-mismatch-error": "Las contraseñas introducidas deben ser las mismas!",
- "password-again": "Contraseña nuevamente",
- "sign-in": "Por favor registrarse",
+ "request-password-reset": "Restablecer contraseña",
+ "reset-password": "Restablecer contraseña",
+ "create-password": "Crear contraseña",
+ "passwords-mismatch-error": "¡Las contraseñas introducidas deben ser iguales!",
+ "password-again": "Repita la contraseña de nuevo",
+ "sign-in": "Por favor registrese",
"username": "Nombre de usuario (correo electrónico)",
"remember-me": "Recordarme",
- "forgot-password": "Olvidó Contraseña?",
- "password-reset": "Restablecimiento de Contraseña",
+ "forgot-password": "¿Olvidó la contraseña?",
+ "password-reset": "Restablecer contraseña",
"new-password": "Nueva contraseña",
- "new-password-again": "Nueva contraseña otra vez",
- "password-link-sent-message": "El enlace para el restablecimieneto de la contraseña fue enviado exitosamente!",
+ "new-password-again": "Repita la nueva contraseña",
+ "password-link-sent-message": "¡El enlace para el restablecer la contraseña fue enviado correctamente!",
"email": "Correo electrónico"
},
"position": {
@@ -1141,7 +1163,7 @@
},
"from-relations": "Relaciones salientes",
"to-relations": "Relaciones entrantes",
- "selected-relations": "{ count, plural, 1 {1 relation} other {# relations} } selecciondas",
+ "selected-relations": "{ count, plural, 1 {1 relación} other {# relaciones} } selecciondas",
"type": "Tipo",
"to-entity-type": "Hacia tipo de entidad",
"to-entity-name": "Hacia nombre de entidad",
@@ -1156,13 +1178,13 @@
"add": "Agregar relación",
"edit": "Editar relación",
"delete-to-relation-title": "¿Está seguro de que desea eliminar la relación hacia la entidad '{{entityName}}'?",
- "delete-to-relation-text": "Tener cuidado, después de la confirmación, la entidad '{{entityName}}' no estará relacionada desde la entidad actual.",
- "delete-to-relations-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 relation} other {# relations} }?",
- "delete-to-relations-text": "Tener cuidado, después de la confirmación, se eliminarán todas las relaciones seleccionadas y las entidades correspondientes no estarán relacionadas desde la entidad actual.",
+ "delete-to-relation-text": "¡Cuidado! Después de la confirmación, la entidad '{{entityName}}' no estará relacionada desde la entidad actual.",
+ "delete-to-relations-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 relación} other {# relaciones} }?",
+ "delete-to-relations-text": "¡Cuidado! Después de la confirmación, se eliminarán todas las relaciones seleccionadas y las entidades correspondientes no estarán relacionadas desde la entidad actual.",
"delete-from-relation-title": "¿Está seguro de que desea eliminar la relación desde la entidad '{{entityName}}'?",
- "delete-from-relation-text": "Tener cuidado, después de la confirmación, la entidad actual no será relacionada desde la entidad '{{entityName}}'.",
- "delete-from-relations-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 relation} other {# relations} }?",
- "delete-from-relations-text": "Tener cuidado, después de la confirmación, se eliminarán todas las relaciones seleccionadas y la entidad actual no será relacionada desde las correspondientes entidades.",
+ "delete-from-relation-text": "¡Cuidado! Después de la confirmación, la entidad actual no será relacionada desde la entidad '{{entityName}}'.",
+ "delete-from-relations-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 relación} other {# relaciones} }?",
+ "delete-from-relations-text": "¡Cuidado! Después de la confirmación, se eliminarán todas las relaciones seleccionadas y la entidad actual no será relacionada desde las correspondientes entidades.",
"remove-relation-filter": "Eliminar filtro de relación",
"add-relation-filter": "Agregar filtro de relación",
"any-relation": "Alguna relación",
@@ -1183,10 +1205,10 @@
"set-root-rulechain-title": "¿Está seguro de que desea hacer la cadena de reglas '{{ruleChainName}}' root?",
"set-root-rulechain-text": "Después de la confirmación, la cadena de reglas se volverá raíz y manejará todos los mensajes de transporte entrantes.",
"delete-rulechain-title": "¿Está seguro de que desea eliminar la cadena de reglas '{{ruleChainName}}'?",
- "delete-rulechain-text": "Tener cuidado, después de la confirmación, la cadena de reglas y todos los datos relacionados se volverán irrecuperables.",
- "delete-rulechains-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 rule chain} other {# rule chains} }?",
- "delete-rulechains-action-title": "Eliminar { count, plural, 1 {1 rule chain} other {# rule chains} }",
- "delete-rulechains-text": "Tener cuidado, después de la confirmación se eliminarán todas las cadenas de reglas seleccionadas y todos los datos relacionados se volverán irrecuperables.",
+ "delete-rulechain-text": "¡Cuidado! Después de la confirmación, la cadena de reglas y todos los datos relacionados serán irrecuperables.",
+ "delete-rulechains-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 cadena de reglas} other {# cadenas de reglas} }?",
+ "delete-rulechains-action-title": "Eliminar { count, plural, 1 {1 cadena de reglas} other {# cadenas de reglas} }",
+ "delete-rulechains-text": "¡Cuidado! Después de la confirmación se eliminarán todas las cadenas de reglas seleccionadas y todos los datos relacionados serán irrecuperables.",
"add-rulechain-text": "Agregar nueva cadena de reglas",
"no-rulechains-text": "Cadenas de reglas no encontradas",
"rulechain-details": "Detalles de la cadena de reglas",
@@ -1211,7 +1233,7 @@
"details": "Detalles",
"events": "Eventos",
"search": "Nodos de búsqueda",
- "open-node-library": "Abrir libreria de nodos",
+ "open-node-library": "Abrir librería de nodos",
"add": "Agregar nodo de reglas",
"name": "Nombre",
"name-required": "El nombre es requerido.",
@@ -1237,7 +1259,7 @@
"custom-link-label-required": "Etiqueta del enlace personalizado es requerida.",
"link-labels": "Etiquetas del enlace",
"link-labels-required": "Etiquetas del enlace son requeridas.",
- "no-link-labels-found": "Etiquetas de enlaces no encontradas",
+ "no-link-labels-found": "No se encontraron etiquetas de enlaces",
"no-link-label-matching": "'{{label}}' no encontrada.",
"create-new-link-label": "Crear una nueva!",
"type-filter": "Filtro",
@@ -1258,7 +1280,7 @@
"type-unknown-details": "Regla de nodo no resuelta",
"directive-is-not-loaded": "La directiva de configuración definida '{{directiveName}}' no está disponible.",
"ui-resources-load-error": "Error al cargar los recursos de configuración ui.",
- "invalid-target-rulechain": "No se puede resolver la cadena de reglas objetivo!",
+ "invalid-target-rulechain": "¡No se puede resolver la cadena de reglas objetivo!",
"test-script-function": "Probar función script",
"message": "Mensaje",
"message-type": "Tipo de mensaje",
@@ -1274,7 +1296,7 @@
"tenant": "Organización",
"tenants": "Organizaciones",
"management": "Gestión de la organización",
- "add": "Agregar Organización",
+ "add": "Agregar organización",
"admins": "Administradores",
"manage-tenant-admins": "Gestionar administradores de la organización",
"delete": "Eliminar organización",
@@ -1282,10 +1304,10 @@
"no-tenants-text": "Organizaciones no encontradas",
"tenant-details": "Detalles de la organización",
"delete-tenant-title": "¿Está seguro de que desea eliminar la organización '{{tenantTitle}}'?",
- "delete-tenant-text": "Tener cuidado, después de la confirmación, la organización y todos los datos relacionados se volverán irrecuperables.",
- "delete-tenants-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 tenant} other {# tenants} }?",
- "delete-tenants-action-title": "Eliminar { count, plural, 1 {1 tenant} other {# tenants} }",
- "delete-tenants-text": "Tener cuidado, después de la confirmación se eliminarán todas las organizaciones seleccionadas y todos los datos relacionados se volverán irrecuperables.",
+ "delete-tenant-text": "¡Cuidado! Después de la confirmación, la organización y todos los datos relacionados serán irrecuperables.",
+ "delete-tenants-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 organización} other {# organizaciones} }?",
+ "delete-tenants-action-title": "Eliminar { count, plural, 1 {1 organización} other {# organizaciones} }",
+ "delete-tenants-text": "¡Cuidado! Después de la confirmación se eliminarán todas las organizaciones seleccionadas y todos los datos relacionados serán irrecuperables.",
"title": "Título",
"title-required": "Título es requerido.",
"description": "Descripción",
@@ -1294,14 +1316,14 @@
"copyId": "Copiar ID de la organización",
"idCopiedMessage": "ID de la organización ha sido copiado al portapapeles",
"select-tenant": "Seleccionar organización",
- "no-tenants-matching": "Organizaciones que coincidan con '{{entity}}' no fueron encontradas.",
+ "no-tenants-matching": "No se encontraron organizaciones que coincidan con '{{entity}}'.",
"tenant-required": "Organización es requerida"
},
"timeinterval": {
- "seconds-interval": "{ seconds, plural, 1 {1 second} other {# seconds} }",
- "minutes-interval": "{ minutes, plural, 1 {1 minute} other {# minutes} }",
- "hours-interval": "{ hours, plural, 1 {1 hour} other {# hours} }",
- "days-interval": "{ days, plural, 1 {1 day} other {# days} }",
+ "seconds-interval": "{ seconds, plural, 1 {1 segundo} other {# segundos} }",
+ "minutes-interval": "{ minutes, plural, 1 {1 minuto} other {# minutos} }",
+ "hours-interval": "{ hours, plural, 1 {1 hora} other {# horas} }",
+ "days-interval": "{ days, plural, 1 {1 día} other {# días} }",
"days": "Días",
"hours": "Horas",
"minutes": "Minutos",
@@ -1309,17 +1331,17 @@
"advanced": "Avanzado"
},
"timewindow": {
- "days": "{ days, plural, 1 { day } other {# days } }",
- "hours": "{ hours, plural, 0 { hour } 1 {1 hour } other {# hours } }",
- "minutes": "{ minutes, plural, 0 { minute } 1 {1 minute } other {# minutes } }",
- "seconds": "{ seconds, plural, 0 { second } 1 {1 second } other {# seconds } }",
+ "days": "{ days, plural, 1 { día } other {# días } }",
+ "hours": "{ hours, plural, 0 { horas } 1 {1 hora } other {# horas } }",
+ "minutes": "{ minutes, plural, 0 { minutos } 1 {1 minuto } other {# minutos } }",
+ "seconds": "{ seconds, plural, 0 { segundos } 1 {1 segundo } other {# segundos } }",
"realtime": "Tiempo real",
"history": "Historia",
- "last-prefix": "última",
- "period": "desde {{ startTime }} to {{ endTime }}",
- "edit": "Editat ventana de tiempo",
+ "last-prefix": "último(s)",
+ "period": "desde {{ startTime }} hasta {{ endTime }}",
+ "edit": "Editar ventana de tiempo",
"date-range": "Rango de fecha",
- "last": "Última",
+ "last": "Último(s)",
"time-period": "Período de tiempo"
},
"user": {
@@ -1334,14 +1356,14 @@
"add": "Agregar Usuario",
"delete": "Eliminar usuario",
"add-user-text": "Agregar nuevo usuario",
- "no-users-text": "Usuarios no encontrados",
+ "no-users-text": "No se encontraron usuarios",
"user-details": "Detalles de usuario",
"delete-user-title": "¿Está seguro de que desea eliminar el usuario '{{userEmail}}'?",
- "delete-user-text": "Tener cuidado, después de la confirmación, el usuario y todos los datos relacionados se volverán irrecuperables.",
- "delete-users-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 user} other {# users} }?",
- "delete-users-action-title": "Delete { count, plural, 1 {1 user} other {# users} }",
- "delete-users-text": "Tener cuidado, después de la confirmación se eliminarán todas los usuarios seleccionados y todos los datos relacionados se volverán irrecuperables.",
- "activation-email-sent-message": "Correo electrónico de activación fue enviado exitosamente!",
+ "delete-user-text": "¡Cuidado! Después de la confirmación, el usuario y todos los datos relacionados serán irrecuperables.",
+ "delete-users-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 usuario} other {# usuarios} }?",
+ "delete-users-action-title": "Borrar { count, plural, 1 {1 usuario} other {# usuarios} }",
+ "delete-users-text": "¡Cuidado! Después de la confirmación se eliminarán todas los usuarios seleccionados y todos los datos relacionados serán irrecuperables.",
+ "activation-email-sent-message": "¡Correo electrónico de activación fue enviado correctamente!",
"resend-activation": "Reenviar activación",
"email": "Correo electrónico",
"email-required": "Correo electrónico es requerido.",
@@ -1358,12 +1380,12 @@
"display-activation-link": "Mostrar enlace de activación",
"send-activation-mail": "Enviar correo electrónico de activación",
"activation-link": "Enlace de activación de usuario",
- "activation-link-text": "Para activar el usuario, utilizar los siguientes activation link :",
+ "activation-link-text": "Para activar el usuario, utilice el siguiente enlace de activación :",
"copy-activation-link": "Copiar enlace de activación",
"activation-link-copied-message": "El enlace de activación de usuario ha sido copiado al portapapeles",
"details": "Detalles",
"login-as-tenant-admin": "Iniciar sesión como Administrador de la Organización",
- "login-as-customer-user": "Iniciar sesión como Usuario Cliente"
+ "login-as-customer-user": "Iniciar sesión como Usuario cliente"
},
"value": {
"type": "Tipo de valor",
@@ -1381,32 +1403,32 @@
"long": "Largo"
},
"widget": {
- "widget-library": "Libreria de Widgets",
- "widget-bundle": "Paquete de Widgets",
+ "widget-library": "Librería de widgets",
+ "widget-bundle": "Paquete de widgets",
"select-widgets-bundle": "Seleccionar paquete de widgets",
"management": "Gestión de widget",
"editor": "Editor de Widget",
- "widget-type-not-found": "Problema cargando configuración de widget.
Probablemente tipo de widget asociado fue eliminado.",
+ "widget-type-not-found": "Problema cargando configuración de widget.
Probablemente el tipo de widget asociado fue eliminado.",
"widget-type-load-error": "El widget no fue cargado debido a los siguientes errores:",
"remove": "Eliminar widget",
"edit": "Editar widget",
"remove-widget-title": "¿Está seguro de que desea eliminar el widget '{{widgetTitle}}'?",
- "remove-widget-text": "Después de la confirmación, el widget y todos los datos relacionados se volverán irrecuperables.",
+ "remove-widget-text": "Después de la confirmación, el widget y todos los datos relacionados serán irrecuperables.",
"timeseries": "Series temporales",
"search-data": "Buscar datos",
- "no-data-found": "Datos no encontrados",
+ "no-data-found": "No se encontraron datos",
"latest-values": "Últimos valores",
"rpc": "Widget de control",
"alarm": "Widget de alarma",
"static": "Widget estático",
"select-widget-type": "Seleccionar tipo de widget",
- "missing-widget-title-error": "Título del widget debe ser especificado!",
+ "missing-widget-title-error": "¡Título del widget debe ser especificado!",
"widget-saved": "Widget guardado",
- "unable-to-save-widget-error": "No se puede guardar widget! El widget tiene errores!",
+ "unable-to-save-widget-error": "¡No se puede guardar widget! ¡El widget tiene errores!",
"save": "Guardar widget",
"saveAs": "Guardar widget como",
"save-widget-type-as": "Guardar tipo de widget como",
- "save-widget-type-as-text": "Por favor ingresar nuevo título del widget y/o seleccionar paquete de widgets objetivo",
+ "save-widget-type-as-text": "Por favor escriba el nuevo título del widget y/o seleccionar paquete de widgets objetivo",
"toggle-fullscreen": "Alternar pantalla completa",
"run": "Ejecutar widget",
"title": "Título del widget",
@@ -1415,20 +1437,20 @@
"resources": "Recursos",
"resource-url": "JavaScript/CSS URL",
"remove-resource": "Eliminar recurso",
- "add-resource": "Agregar recursose",
+ "add-resource": "Agregar recurso",
"html": "HTML",
- "tidy": "Ordenado",
+ "tidy": "Formatear",
"css": "CSS",
"settings-schema": "Esquema de configuración",
"datakey-settings-schema": "Esquema de configuración de clave de datos",
"javascript": "Javascript",
"remove-widget-type-title": "¿Está seguro de que desea eliminar el tipo de widget '{{widgetName}}'?",
- "remove-widget-type-text": "Después de la confirmación, el tipo de widget y todos los datos relacionados se volverán irrecuperables.",
+ "remove-widget-type-text": "Después de la confirmación, el tipo de widget y todos los datos relacionados serán irrecuperables.",
"remove-widget-type": "Eliminar tipo de widget",
"add-widget-type": "Agregar nuevo tipo de widget",
- "widget-type-load-failed-error": "Failed to load widget type!",
- "widget-template-load-failed-error": "Error al cargar la plantilla del widget!",
- "add": "Agregar Widget",
+ "widget-type-load-failed-error": "¡Error al cargar el tipo de widget!",
+ "widget-template-load-failed-error": "¡Error al cargar la plantilla del widget!",
+ "add": "Agregar widget",
"undo": "Deshacer cambios en el widget",
"export": "Exportar widget"
},
@@ -1446,21 +1468,21 @@
},
"widgets-bundle": {
"current": "Paquete actual",
- "widgets-bundles": "Paquetes de Widgets",
- "add": "Agregar Paquete de Widgets",
- "delete": "Eliminar paquete de widget",
+ "widgets-bundles": "Paquetes de widgets",
+ "add": "Agregar paquete de widgets",
+ "delete": "Eliminar paquete de widgets",
"title": "Título",
"title-required": "Título es requerido.",
"add-widgets-bundle-text": "Agregar nuevo paquete de widgets",
- "no-widgets-bundles-text": "Paquetes de widgets no encontrados",
+ "no-widgets-bundles-text": "No se encontraron paquetes de widgets",
"empty": "Paquete de widgets está vacío",
"details": "Detalles",
"widgets-bundle-details": "Detalles del paquete de widgets",
"delete-widgets-bundle-title": "¿Está seguro de que desea eliminar el paquete de widgets '{{widgetsBundleTitle}}'?",
- "delete-widgets-bundle-text": "Tener cuidado, después de la confirmación, el paquete de widgets y todos los datos relacionados se volverán irrecuperables.",
- "delete-widgets-bundles-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 widgets bundle} other {# widgets bundles} }?",
- "delete-widgets-bundles-action-title": "Eliminar { count, plural, 1 {1 widgets bundle} other {# widgets bundles} }",
- "delete-widgets-bundles-text": "Tener cuidado, después de la confirmación se eliminarán todas los paquetes de widgets seleccionados y todos los datos relacionados se volverán irrecuperables.",
+ "delete-widgets-bundle-text": "¡Cuidado! Después de la confirmación, el paquete de widgets y todos los datos relacionados serán irrecuperables.",
+ "delete-widgets-bundles-title": "¿Está seguro de que desea eliminar { count, plural, 1 {1 paquete de widgets} other {# paquetes de widgets} }?",
+ "delete-widgets-bundles-action-title": "Eliminar { count, plural, 1 {1 paquete de widgets} other {# paquetes de widgets} }",
+ "delete-widgets-bundles-text": "¡Cuidado! Después de la confirmación se eliminarán todas los paquetes de widgets seleccionados y todos los datos relacionados serán irrecuperables.",
"no-widgets-bundles-matching": "Paquetes de widgets que coincidan con '{{widgetsBundle}}' no fueron encontrados.",
"widgets-bundle-required": "Paquete de widgets es requerido.",
"system": "Sistema",
@@ -1492,25 +1514,25 @@
"units": "Símbolo especial para mostrar junto al valor.",
"decimals": "Número de dígitos después del punto flotante",
"timewindow": "Ventana de tiempo",
- "use-dashboard-timewindow": "Utilizar ventana de timpo del panel",
+ "use-dashboard-timewindow": "Utilizar ventana de tiempo del panel",
"display-legend": "Mostrar leyenda",
- "datasources": "Fuentes de datos",
- "maximum-datasources": "Máximo { count, plural, 1 {1 datasource is allowed.} other {# datasources are allowed} }",
+ "datasources": "Orígenes de datos",
+ "maximum-datasources": "Máximo { count, plural, 1 {1 origen de datos permitido.} other {# origenes de datos permitidos} }",
"datasource-type": "Tipo",
- "datasource-parameters": "Parametros",
- "remove-datasource": "Eliminar fuente de datos",
- "add-datasource": "Agregar fuente de datos",
+ "datasource-parameters": "Parámetros",
+ "remove-datasource": "Eliminar origen de datos",
+ "add-datasource": "Agregar origen de datos",
"target-device": "Dispositivo objetivo",
- "alarm-source": "Fuente de alarma",
- "actions": "Accines",
+ "alarm-source": "Origen de la alarma",
+ "actions": "Acciones",
"action": "Acción",
"add-action": "Agregar acción",
"search-actions": "Buscar acciones",
- "action-source": "Fuente de acción",
+ "action-source": "Origen de acción",
"action-source-required": "Fuente de acción es requerida.",
"action-name": "Nombre",
"action-name-required": "Nombre de acción es requerido.",
- "action-name-not-unique": "Ya existe otra acción con el mismo nombre.
El nombre de la acción debe ser único dentro de la misma fuente de acción.",
+ "action-name-not-unique": "Ya existe otra acción con el mismo nombre.
El nombre de la acción debe ser único dentro del mismo orígen de acción.",
"action-icon": "Icono",
"action-type": "Tipo",
"action-type-required": "Tipo de acción es requerido.",
@@ -1530,7 +1552,7 @@
"icon": {
"icon": "Icono",
"select-icon": "Seleccionar icono",
- "material-icons": "Iconos de maerial",
+ "material-icons": "Iconos de material design",
"show-all": "Mostrar todos los iconos"
},
"custom": {
@@ -1544,6 +1566,7 @@
"language": {
"language": "Lenguaje",
"locales": {
+ "de_DE": "Alemán",
"fr_FR": "Francés",
"zh_CN": "Chino",
"en_US": "Inglés",
@@ -1555,4 +1578,4 @@
"tr_TR": "Turco"
}
}
-}
+}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-fr_FR.json b/ui/src/app/locale/locale.constant-fr_FR.json
index dd2fa0d864..5b4edd95c4 100644
--- a/ui/src/app/locale/locale.constant-fr_FR.json
+++ b/ui/src/app/locale/locale.constant-fr_FR.json
@@ -1003,6 +1003,7 @@
"language": {
"language": "Language",
"locales": {
+ "de_DE": "Allemand",
"en_US": "Anglais",
"fr_FR": "Français",
"es_ES": "Espagnol",
@@ -1459,4 +1460,4 @@
"widgets-bundle-required": "Un groupe de widgets est requis.",
"widgets-bundles": "Groupes de widgets"
}
-}
+}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-it_IT.json b/ui/src/app/locale/locale.constant-it_IT.json
index 49f9b4880d..4c73548df6 100644
--- a/ui/src/app/locale/locale.constant-it_IT.json
+++ b/ui/src/app/locale/locale.constant-it_IT.json
@@ -100,7 +100,7 @@
"UNACK": "Non riconosciuto"
},
"display-status": {
- "ACTIVE_UNACK": "Active Unacknowledged",
+ "ACTIVE_UNACK": "Active Unacknowledged",
"ACTIVE_ACK": "Active Acknowledged",
"CLEARED_UNACK": "Cleared Unacknowledged",
"CLEARED_ACK": "Cleared Acknowledged"
@@ -109,8 +109,8 @@
"created-time": "Orario di creazione",
"type": "Tipo",
"severity": "Livello di gravità",
- "originator": "Origine",
- "originator-type": "Tipo origine",
+ "originator": "Origine",
+ "originator-type": "Tipo origine",
"details": "Dettagli",
"status": "Stato",
"alarm-details": "Dettagli allarme",
@@ -132,9 +132,9 @@
"polling-interval-required": "Intervallo di polling Allarmi richiesto.",
"min-polling-interval-message": "L'intervallo di polling deve essere di almeno 1 sec.",
"aknowledge-alarms-title": "Conferma { count, plural, 1 {1 allarme} other {# allarmi} }",
- "aknowledge-alarms-text": "Sei sicuro di voler confermare { count, plural, 1 {1 allarme} other {# allarmi} }?",
+ "aknowledge-alarms-text": "Sei sicuro di voler confermare { count, plural, 1 {1 allarme} other {# allarmi} }?",
"clear-alarms-title": "Elimina { count, plural, 1 {1 allarme} other {# allarmi} }",
- "clear-alarms-text": "Sei sicuro di voler eliminare { count, plural, 1 {1 allarme} other {# allarmi} }?"
+ "clear-alarms-text": "Sei sicuro di voler eliminare { count, plural, 1 {1 allarme} other {# allarmi} }?"
},
"alias": {
"add": "Aggiungi alias",
@@ -910,7 +910,6 @@
"modbus-register-count": "Register count",
"modbus-register-count-range": "Register count should be a positive value.",
"modbus-byte-order": "Byte order",
-
"sync": {
"status": "Stato",
"sync": "Sincronizzato",
@@ -918,7 +917,6 @@
"last-sync-time": "Ultima sincronizzazione",
"not-available": "Non disponibile"
},
-
"export-extensions-configuration": "Esporta configurazione estensioni",
"import-extensions-configuration": "Importa configurazione estensioni",
"import-extensions": "Importa estensione",
@@ -1414,7 +1412,7 @@
"export": "Esporta un tipo di widget",
"export-failed-error": "Impossibile esportare il tipo di widget: {{error}}",
"create-new-widget-type": "Crea un nuovo tipo di widget",
- "widget-type-file": "Widget type file",
+ "widget-type-file": "Widget type file",
"invalid-widget-type-file-error": "Impossibile importare un tipo di widget: struttura dati del widget non valida."
},
"icon": {
@@ -1424,7 +1422,7 @@
"show-all": "Mostra tutte le icone"
},
"custom": {
- "widget-action": {
+ "widget-action": {
"action-cell-button": "Action cell button",
"row-click": "On row click",
"marker-click": "On marker click",
@@ -1434,7 +1432,8 @@
"language": {
"language": "Lingua",
"locales": {
- "fr_FR": "Francese",
+ "de_DE": "Tedesco",
+ "fr_FR": "Francese",
"zh_CN": "Cinese",
"ko_KR": "Coreano",
"en_US": "Inglese",
@@ -1445,4 +1444,4 @@
"tr_TR": "Turco"
}
}
-}
+}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-ja_JA.json b/ui/src/app/locale/locale.constant-ja_JA.json
index 2ab2bcb909..fea4ab335d 100644
--- a/ui/src/app/locale/locale.constant-ja_JA.json
+++ b/ui/src/app/locale/locale.constant-ja_JA.json
@@ -288,11 +288,11 @@
"type-suspended": "一時停止中",
"type-credentials-read": "信用証明書を読む",
"type-attributes-read": "読み取られた属性",
- "type-relation-add-or-update": "関係が更新されました",
- "type-relation-delete": "関係が削除されました",
- "type-relations-delete": "すべてのリレーションを削除",
- "type-alarm-ack": "承認された",
- "type-alarm-clear": "クリアされた",
+ "type-relation-add-or-update": "関係が更新されました",
+ "type-relation-delete": "関係が削除されました",
+ "type-relations-delete": "すべてのリレーションを削除",
+ "type-alarm-ack": "承認された",
+ "type-alarm-clear": "クリアされた",
"status-success": "成功",
"status-failure": "失敗",
"audit-log-details": "監査ログの詳細",
@@ -322,7 +322,7 @@
"common": {
"username": "ユーザー名",
"password": "パスワード",
- "enter-username": "ユーザーネームを入力してください",
+ "enter-username": "ユーザーネームを入力してください",
"enter-password": "パスワードを入力する",
"enter-search": "検索を入力"
},
@@ -919,7 +919,6 @@
"modbus-register-count": "レジスタ数",
"modbus-register-count-range": "レジスタ数は正の値でなければなりません。",
"modbus-byte-order": "バイト順",
-
"sync": {
"status": "状態",
"sync": "同期",
@@ -927,7 +926,6 @@
"last-sync-time": "前回の同期時間",
"not-available": "利用不可"
},
-
"export-extensions-configuration": "エクステンション設定のエクスポート",
"import-extensions-configuration": "エクステンション設定のインポート",
"import-extensions": "拡張機能のインポート",
@@ -1417,7 +1415,7 @@
"action-source-required": "アクションソースが必要です。",
"action-name": "名",
"action-name-required": "アクション名は必須です。",
- "action-name-not-unique": "同じ名前の別のアクションがすでに存在します。
アクション名は、同じアクションソース内で一意である必要があります。",
+ "action-name-not-unique": "同じ名前の別のアクションがすでに存在します。
アクション名は、同じアクションソース内で一意である必要があります。",
"action-icon": "アイコン",
"action-type": "タイプ",
"action-type-required": "アクションタイプが必要です。",
@@ -1427,7 +1425,7 @@
"delete-action-text": "'{{actionName}}'?"
},
"widget-type": {
- "import": "インポートウィジェットタイプ",
+ "import": "インポートウィジェットタイプ",
"export": "ウィジェットのタイプをエクスポートする",
"export-failed-error": "{{error}}",
"create-new-widget-type": "新しいウィジェットタイプを作成する",
@@ -1451,6 +1449,7 @@
"language": {
"language": "言語",
"locales": {
+ "de_DE": "ドイツ語",
"en_US": "英語",
"ko_KR": "韓国語",
"it_IT": "イタリアの",
@@ -1461,4 +1460,4 @@
"tr_TR": "トルコ語"
}
}
-}
+}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-ko_KR.json b/ui/src/app/locale/locale.constant-ko_KR.json
index 62c0054d53..4ddd9b5afa 100644
--- a/ui/src/app/locale/locale.constant-ko_KR.json
+++ b/ui/src/app/locale/locale.constant-ko_KR.json
@@ -85,7 +85,6 @@
"enable-tls": "TLS 사용",
"send-test-mail": "테스트 메일 보내기"
},
-
"alarm": {
"alarm": "Alarm",
"alarms": "Alarms",
@@ -831,7 +830,6 @@
"modbus-register-count": "Register count",
"modbus-register-count-range": "Register count should be a positive value.",
"modbus-byte-order": "Byte order",
-
"sync": {
"status": "Status",
"sync": "Sync",
@@ -839,7 +837,6 @@
"last-sync-time": "Last sync time",
"not-available": "Not available"
},
-
"export-extensions-configuration": "Export extensions configuration",
"import-extensions-configuration": "Import extensions configuration",
"import-extensions": "Import extensions",
@@ -1328,8 +1325,9 @@
"language": {
"language": "언어",
"locales": {
+ "de_DE": "독일어",
"en_US": "영어",
- "fr_FR": "프랑스의",
+ "fr_FR": "프랑스의",
"ko_KR": "한글",
"zh_CN": "중국어",
"ru_RU": "러시아어",
@@ -1339,4 +1337,4 @@
"tr_TR": "터키어"
}
}
-}
+}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-ru_RU.json b/ui/src/app/locale/locale.constant-ru_RU.json
index eb9996d274..c087649789 100644
--- a/ui/src/app/locale/locale.constant-ru_RU.json
+++ b/ui/src/app/locale/locale.constant-ru_RU.json
@@ -22,8 +22,9 @@
"update": "Обновить",
"remove": "Удалить",
"search": "Поиск",
+ "clear-search": "Очистить",
"assign": "Присвоить",
- "unassign": "Отменить присвоение",
+ "unassign": "Отозвать",
"share": "Поделиться",
"make-private": "Закрыть для общего доступа",
"apply": "Применить",
@@ -43,6 +44,8 @@
"undo": "Откатить",
"copy": "Копировать",
"paste": "Вставить",
+ "copy-reference": "Копировать ссылку",
+ "paste-reference": "Вставить ссылку",
"import": "Импортировать",
"export": "Экспортировать",
"share-via": "Поделиться в {{provider}}"
@@ -83,168 +86,179 @@
"send-test-mail": "Отправить пробное письмо"
},
"alarm": {
- "alarm": "Alarm",
- "alarms": "Alarms",
- "select-alarm": "Select alarm",
- "no-alarms-matching": "No alarms matching '{{entity}}' were found.",
- "alarm-required": "Alarm is required",
- "alarm-status": "Alarm status",
+ "alarm": "Оповещение",
+ "alarms": "Оповещения",
+ "select-alarm": "Выбрать оповещение",
+ "no-alarms-matching": "Оповещения '{{entity}}' не найдены.",
+ "alarm-required": "Оповещение обязательно",
+ "alarm-status": "Статус оповещения",
"search-status": {
- "ANY": "Any",
- "ACTIVE": "Active",
- "CLEARED": "Cleared",
- "ACK": "Acknowledged",
- "UNACK": "Unacknowledged"
+ "ANY": "Все",
+ "ACTIVE": "Активные",
+ "CLEARED": "Сброшенные",
+ "ACK": "Подтвержденные",
+ "UNACK": "Неподтвержденные"
},
"display-status": {
- "ACTIVE_UNACK": "Active Unacknowledged",
- "ACTIVE_ACK": "Active Acknowledged",
- "CLEARED_UNACK": "Cleared Unacknowledged",
- "CLEARED_ACK": "Cleared Acknowledged"
+ "ACTIVE_UNACK": "Активные неподтвержденные",
+ "ACTIVE_ACK": "Активные подтвержденные",
+ "CLEARED_UNACK": "Сброшенные неподтвержденные",
+ "CLEARED_ACK": "Сброшенные подтвержденные"
},
- "no-alarms-prompt": "No alarms found",
- "created-time": "Created time",
- "type": "Type",
- "severity": "Severity",
- "originator": "Originator",
- "originator-type": "Originator type",
- "details": "Details",
- "status": "Status",
- "alarm-details": "Alarm details",
- "start-time": "Start time",
- "end-time": "End time",
- "ack-time": "Acknowledged time",
- "clear-time": "Cleared time",
- "severity-critical": "Critical",
- "severity-major": "Major",
- "severity-minor": "Minor",
- "severity-warning": "Warning",
- "severity-indeterminate": "Indeterminate",
- "acknowledge": "Acknowledge",
- "clear": "Clear",
- "search": "Search alarms",
- "selected-alarms": "{ count, plural, 1 {1 alarm} other {# alarms} } selected",
- "no-data": "No data to display",
- "polling-interval": "Alarms polling interval (sec)",
- "polling-interval-required": "Alarms polling interval is required.",
- "min-polling-interval-message": "At least 1 sec polling interval is allowed.",
- "aknowledge-alarms-title": "Acknowledge { count, plural, 1 {1 alarm} other {# alarms} }",
- "aknowledge-alarms-text": "Are you sure you want to acknowledge { count, plural, 1 {1 alarm} other {# alarms} }?",
- "clear-alarms-title": "Clear { count, plural, 1 {1 alarm} other {# alarms} }",
- "clear-alarms-text": "Are you sure you want to clear { count, plural, 1 {1 alarm} other {# alarms} }?"
+ "no-alarms-prompt": "Оповещения отсутствуют",
+ "created-time": "Время создания",
+ "type": "Тип",
+ "severity": "Уровень",
+ "originator": "Инициатор",
+ "originator-type": "Тип инициатора",
+ "details": "Подробности",
+ "status": "Статус",
+ "alarm-details": "Подробности об оповещении",
+ "start-time": "Время начала",
+ "end-time": "Время окончания",
+ "ack-time": "Время подтверждения",
+ "clear-time": "Время сброса",
+ "severity-critical": "Критический",
+ "severity-major": "Основной",
+ "severity-minor": "Второстепенный",
+ "severity-warning": "Предупреждение",
+ "severity-indeterminate": "Неопределенный",
+ "acknowledge": "Подтвердить",
+ "clear": "Сбросить",
+ "search": "Поиск оповещений",
+ "selected-alarms": "Выбрано { count, plural, 1 {1 оповещение} few {# оповещения} other {# оповещений} }",
+ "no-data": "Нет данных для отображения",
+ "polling-interval": "Интервал опроса оповещений (сек)",
+ "polling-interval-required": "Интервал опроса оповещений обязателен.",
+ "min-polling-interval-message": "Минимальный интервал опроса оповещений 1 секунда.",
+ "aknowledge-alarms-title": "Подтвердить { count, plural, 1 {1 оповещение} other {# оповещений} }",
+ "aknowledge-alarms-text": "Вы точно хотите подтвердить { count, plural, 1 {1 оповещение} other {# оповещений} }?",
+ "aknowledge-alarm-title": "Подтвердить оповещение",
+ "aknowledge-alarm-text": "Вы точно хотите подтвердить оповещение?",
+ "clear-alarms-title": "Сбросить { count, plural, 1 {1 оповещение} other {# оповещений} }",
+ "clear-alarms-text": "Вы точно хотите сбросить { count, plural, 1 {1 оповещение} other {# оповещений} }?",
+ "clear-alarm-title": "Сбросить оповещение",
+ "clear-alarm-text": "Вы точно хотите сбросить оповещение?",
+ "alarm-status-filter": "Фильтр оповещений"
},
"alias": {
- "add": "Add alias",
- "edit": "Edit alias",
- "name": "Alias name",
- "name-required": "Alias name is required",
- "duplicate-alias": "Alias with same name is already exists.",
- "filter-type-single-entity": "Single entity",
- "filter-type-entity-list": "Entity list",
- "filter-type-entity-name": "Entity name",
- "filter-type-state-entity": "Entity from dashboard state",
- "filter-type-state-entity-description": "Entity taken from dashboard state parameters",
- "filter-type-asset-type": "Asset type",
- "filter-type-asset-type-description": "Assets of type '{{assetType}}'",
- "filter-type-asset-type-and-name-description": "Assets of type '{{assetType}}' and with name starting with '{{prefix}}'",
- "filter-type-device-type": "Device type",
- "filter-type-device-type-description": "Devices of type '{{deviceType}}'",
- "filter-type-device-type-and-name-description": "Devices of type '{{deviceType}}' and with name starting with '{{prefix}}'",
- "filter-type-relations-query": "Relations query",
- "filter-type-relations-query-description": "{{entities}} that have {{relationType}} relation {{direction}} {{rootEntity}}",
- "filter-type-asset-search-query": "Asset search query",
- "filter-type-asset-search-query-description": "Assets with types {{assetTypes}} that have {{relationType}} relation {{direction}} {{rootEntity}}",
- "filter-type-device-search-query": "Device search query",
- "filter-type-device-search-query-description": "Devices with types {{deviceTypes}} that have {{relationType}} relation {{direction}} {{rootEntity}}",
- "entity-filter": "Entity filter",
- "resolve-multiple": "Resolve as multiple entities",
- "filter-type": "Filter type",
- "filter-type-required": "Filter type is required.",
- "entity-filter-no-entity-matched": "No entities matching specified filter were found.",
- "no-entity-filter-specified": "No entity filter specified",
- "root-state-entity": "Use dashboard state entity as root",
- "root-entity": "Root entity",
- "state-entity-parameter-name": "State entity parameter name",
- "default-state-entity": "Default state entity",
- "default-entity-parameter-name": "By default",
- "max-relation-level": "Max relation level",
- "unlimited-level": "Unlimited level",
- "state-entity": "Dashboard state entity",
- "all-entities": "All entities",
- "any-relation": "any"
+ "add": "Добавить псевдоним",
+ "edit": "Редактировать псевдоним",
+ "name": "Псевдоним",
+ "name-required": "Псевдоним обязателен",
+ "duplicate-alias": "Такой псевдоним уже существует.",
+ "filter-type-single-entity": "Отдельный объект",
+ "filter-type-entity-list": "Список объектов",
+ "filter-type-entity-name": "Название объекта",
+ "filter-type-state-entity": "Объект, полученный из дашборда",
+ "filter-type-state-entity-description": "Объект, полученный из параметров дашборда",
+ "filter-type-asset-type": "Тип актива",
+ "filter-type-asset-type-description": "Активы типа '{{assetType}}'",
+ "filter-type-asset-type-and-name-description": "Активы типа '{{assetType}}' и названием, начинающимся с '{{prefix}}'",
+ "filter-type-device-type": "Тип устройства",
+ "filter-type-device-type-description": "Устройства типа '{{deviceType}}'",
+ "filter-type-device-type-and-name-description": "Устройства типа '{{deviceType}}' и названием, начинающимся с '{{prefix}}'",
+ "filter-type-entity-view-type": "Тип Представления Объекта",
+ "filter-type-entity-view-type-description": "Представления Объекта типа '{{entityView}}'",
+ "filter-type-entity-view-type-and-name-description": "Представления Объекта типа '{{entityView}}' и названием, начинающимся с '{{prefix}}'",
+ "filter-type-relations-query": "Запрос по типу отношений",
+ "filter-type-relations-query-description": "{{entities}}, имеющие отношение типа {{relationType}} {{direction}} {{rootEntity}}",
+ "filter-type-asset-search-query": "Поисковый запрос по активам",
+ "filter-type-asset-search-query-description": "Активы типа {{assetTypes}}, имеющие отношение типа {{relationType}} {{direction}} {{rootEntity}}",
+ "filter-type-device-search-query": "Поисковый запрос по устройствам",
+ "filter-type-device-search-query-description": "Устройства типа {{deviceTypes}}, имеющие отношение типа {{relationType}} {{direction}} {{rootEntity}}",
+ "filter-type-entity-view-search-query": "Поисковый запрос по представлениям объектов",
+ "filter-type-entity-view-search-query-description": "Представления объектов типа {{entityViewTypes}}, имеющие отношение типа {{relationType}} {{direction}} {{rootEntity}}",
+ "entity-filter": "Фильтр объектов",
+ "resolve-multiple": "Принять как несколько объектов",
+ "filter-type": "Тип фильтра",
+ "filter-type-required": "Тип фильтра обязателен.",
+ "entity-filter-no-entity-matched": "Объекты, соответствующие фильтру, не найдены.",
+ "no-entity-filter-specified": "Не указан фильтр объектов",
+ "root-state-entity": "Использовать объект, полученный из дашборда, как корневой",
+ "root-entity": "Корневой объект",
+ "state-entity-parameter-name": "Название объекта состояния",
+ "default-state-entity": "Объект состояния по умолчанию",
+ "default-entity-parameter-name": "По умолчанию",
+ "max-relation-level": "Максимальная глубина отношений",
+ "unlimited-level": "Неограниченная глубина",
+ "state-entity": "Объект состояния дашборда",
+ "all-entities": "Все объекты",
+ "any-relation": "не указано"
},
"asset": {
- "asset": "Asset",
- "assets": "Assets",
- "management": "Asset management",
- "view-assets": "View Assets",
- "add": "Add Asset",
- "assign-to-customer": "Assign to customer",
- "assign-asset-to-customer": "Assign Asset(s) To Customer",
- "assign-asset-to-customer-text": "Please select the assets to assign to the customer",
- "no-assets-text": "No assets found",
- "assign-to-customer-text": "Please select the customer to assign the asset(s)",
- "public": "Public",
- "assignedToCustomer": "Assigned to customer",
- "make-public": "Make asset public",
- "make-private": "Make asset private",
- "unassign-from-customer": "Unassign from customer",
- "delete": "Delete asset",
- "asset-public": "Asset is public",
- "asset-type": "Asset type",
- "asset-type-required": "Asset type is required.",
- "select-asset-type": "Select asset type",
- "enter-asset-type": "Enter asset type",
- "any-asset": "Any asset",
- "no-asset-types-matching": "No asset types matching '{{entitySubtype}}' were found.",
- "asset-type-list-empty": "No asset types selected.",
- "asset-types": "Asset types",
- "name": "Name",
- "name-required": "Name is required.",
- "description": "Description",
- "type": "Type",
- "type-required": "Type is required.",
- "details": "Details",
- "events": "Events",
- "add-asset-text": "Add new asset",
- "asset-details": "Asset details",
- "assign-assets": "Assign assets",
- "assign-assets-text": "Assign { count, plural, 1 {1 asset} other {# assets} } to customer",
- "delete-assets": "Delete assets",
- "unassign-assets": "Unassign assets",
- "unassign-assets-action-title": "Unassign { count, plural, 1 {1 asset} other {# assets} } from customer",
- "assign-new-asset": "Assign new asset",
- "delete-asset-title": "Are you sure you want to delete the asset '{{assetName}}'?",
- "delete-asset-text": "Be careful, after the confirmation the asset and all related data will become unrecoverable.",
- "delete-assets-title": "Are you sure you want to delete { count, plural, 1 {1 asset} other {# assets} }?",
- "delete-assets-action-title": "Delete { count, plural, 1 {1 asset} other {# assets} }",
- "delete-assets-text": "Be careful, after the confirmation all selected assets will be removed and all related data will become unrecoverable.",
- "make-public-asset-title": "Are you sure you want to make the asset '{{assetName}}' public?",
- "make-public-asset-text": "After the confirmation the asset and all its data will be made public and accessible by others.",
- "make-private-asset-title": "Are you sure you want to make the asset '{{assetName}}' private?",
- "make-private-asset-text": "After the confirmation the asset and all its data will be made private and won't be accessible by others.",
- "unassign-asset-title": "Are you sure you want to unassign the asset '{{assetName}}'?",
- "unassign-asset-text": "After the confirmation the asset will be unassigned and won't be accessible by the customer.",
- "unassign-asset": "Unassign asset",
- "unassign-assets-title": "Are you sure you want to unassign { count, plural, 1 {1 asset} other {# assets} }?",
- "unassign-assets-text": "After the confirmation all selected assets will be unassigned and won't be accessible by the customer.",
- "copyId": "Copy asset Id",
- "idCopiedMessage": "Asset Id has been copied to clipboard",
- "select-asset": "Select asset",
- "no-assets-matching": "No assets matching '{{entity}}' were found.",
- "asset-required": "Asset is required",
- "name-starts-with": "Asset name starts with"
+ "asset": "Актив",
+ "assets": "Активы",
+ "management": "Управление активами",
+ "view-assets": "Просмотреть активы",
+ "add": "Добавить актив",
+ "assign-to-customer": "Присвоить клиенту",
+ "assign-asset-to-customer": "Присвоить актив(ы) клиенту",
+ "assign-asset-to-customer-text": "Пожалуйста, выберите активы, которые нужно присвоить объекту",
+ "no-assets-text": "Активы не найдены",
+ "assign-to-customer-text": "Пожалуйста, выберите клиента, которому нужно присвоить актив(ы)",
+ "public": "Общедоступные",
+ "assignedToCustomer": "Присвоить клиенту",
+ "make-public": "Открыть общий доступ к активу",
+ "make-private": "Закрыть общий доступ к активу",
+ "unassign-from-customer": "Отозвать у клиента",
+ "delete": "Удалить актив",
+ "asset-public": "Актив общедоступный",
+ "asset-type": "Тип актива",
+ "asset-type-required": "Тип актива обязателен.",
+ "select-asset-type": "Выберите тип актива",
+ "enter-asset-type": "Введите тип актива",
+ "any-asset": "Любой актив",
+ "no-asset-types-matching": "Активы типа '{{entitySubtype}}' не найдены.",
+ "asset-type-list-empty": "Типы активов не выбраны.",
+ "asset-types": "Типы активов",
+ "name": "Название",
+ "name-required": "Название обязательно.",
+ "description": "Описание",
+ "type": "Тип",
+ "type-required": "Тип обязателен.",
+ "details": "Подробности",
+ "events": "События",
+ "add-asset-text": "Добавить новый актив",
+ "asset-details": "Подробности об активе",
+ "assign-assets": "Присвоить активы",
+ "assign-assets-text": "Присвоить { count, plural, 1 {1 актив} few {# актива} other {# активов} } клиенту",
+ "delete-assets": "Удалить активы",
+ "unassign-assets": "Отозвать активы",
+ "unassign-assets-action-title": "Отозвать { count, plural, 1 {1 актив} few {# актива} other {# активов} } у клиента",
+ "assign-new-asset": "Присвоить новый актив",
+ "delete-asset-title": "Вы точно хотите удалить '{{assetName}}'?",
+ "delete-asset-text": "Внимание, после подтверждения актив и все связанные с ним данные будут безвозвратно удалены.",
+ "delete-assets-title": "Вы точно хотите удалить { count, plural, 1 {1 актив} few {# актива} other {# активов} }",
+ "delete-assets-action-title": "Удалить { count, plural, 1 {1 актив} few {# актива} other {# активов} }",
+ "delete-assets-text": "Внимание, после подтверждения выбранные активы и все связанные с ними данные будут безвозвратно удалены.",
+ "make-public-asset-title": "Вы точно хотите открыть общий доступ к активу '{{assetName}}'?",
+ "make-public-asset-text": "Внимание, после подтверждения актив и все связанные с ним данные станут общедоступными.",
+ "make-private-asset-title": "Вы точно хотите закрыть общий доступ к активу '{{assetName}}'?",
+ "make-private-asset-text": "После подтверждения актив и все связанные с ним данные будут закрыты для общего доступа",
+ "unassign-asset-title": "Вы точно хотите отозвать актив '{{assetName}}'?",
+ "unassign-asset-text": "После подтверждения актив будут отозван, и клиент потеряет к нему доступ.",
+ "unassign-asset": "Отозвать актив",
+ "unassign-assets-title": "Вы точно хотите отозвать { count, plural, 1 {1 актив} few {# актива} other {# активов} }?",
+ "unassign-assets-text": "После подтверждения активы будут отозваны, и клиент потеряет к ним доступ.",
+ "copyId": "Копировать ИД актива",
+ "idCopiedMessage": "ИД актива скопировано в буфер обмена",
+ "select-asset": "Выбрать активы",
+ "no-assets-matching": "Активы, соответствующие '{{entity}}', не найдены.",
+ "asset-required": "Актив обязателен",
+ "name-starts-with": "Название актива, начинающееся с"
},
"attribute": {
"attributes": "Атрибуты",
"latest-telemetry": "Последняя телеметрия",
- "attributes-scope": "Контекст атрибутов устройства",
+ "attributes-scope": "Контекст атрибутов объекта",
"scope-latest-telemetry": "Последняя телеметрия",
"scope-client": "Клиентские атрибуты",
"scope-server": "Серверные атрибуты",
"scope-shared": "Общие атрибуты",
"add": "Добавить атрибут",
"key": "Ключ",
+ "last-update-time": "Последнее обновление",
"key-required": "Ключ атрибута обязателен.",
"value": "Значение",
"value-required": "Значение атрибута обязательно.",
@@ -262,36 +276,41 @@
"selected-telemetry": "{ count, plural, 1 {Выбран} other {Выбраны} } { count, plural, 1 {1 параметр} few {# параметра} other {# параметров} } телеметрии"
},
"audit-log": {
- "audit": "Audit",
- "audit-logs": "Audit Logs",
- "timestamp": "Timestamp",
- "entity-type": "Entity Type",
- "entity-name": "Entity Name",
- "user": "User",
- "type": "Type",
- "status": "Status",
- "details": "Details",
- "type-added": "Added",
- "type-deleted": "Deleted",
- "type-updated": "Updated",
- "type-attributes-updated": "Attributes updated",
- "type-attributes-deleted": "Attributes deleted",
- "type-rpc-call": "RPC call",
- "type-credentials-updated": "Credentials updated",
- "type-assigned-to-customer": "Assigned to Customer",
- "type-unassigned-from-customer": "Unassigned from Customer",
- "type-activated": "Activated",
- "type-suspended": "Suspended",
- "type-credentials-read": "Credentials read",
- "type-attributes-read": "Attributes read",
- "status-success": "Success",
- "status-failure": "Failure",
- "audit-log-details": "Audit log details",
- "no-audit-logs-prompt": "No logs found",
- "action-data": "Action data",
- "failure-details": "Failure details",
- "search": "Search audit logs",
- "clear-search": "Clear search"
+ "audit": "Аудит",
+ "audit-logs": "Логи аудита",
+ "timestamp": "Время",
+ "entity-type": "Тип объекта",
+ "entity-name": "Название объекта",
+ "user": "Пользователь",
+ "type": "Тип",
+ "status": "Статус",
+ "details": "Подробности",
+ "type-added": "Добавленный",
+ "type-deleted": "Удаленный",
+ "type-updated": "Обновленный",
+ "type-attributes-updated": "Обновлены атрибуты",
+ "type-attributes-deleted": "Удалены атрибуты",
+ "type-rpc-call": "RPC вызов",
+ "type-credentials-updated": "Обновлены учетные данные",
+ "type-assigned-to-customer": "Присвоен клиенту",
+ "type-unassigned-from-customer": "Отозван у клиента",
+ "type-activated": "Активирован",
+ "type-suspended": "Приостановлен",
+ "type-credentials-read": "Чтение учетные данных",
+ "type-attributes-read": "Чтение атрибутов",
+ "type-relation-add-or-update": "Обновлены отношения",
+ "type-relation-delete": "Удалены отношения",
+ "type-relations-delete": "Удалены все отношения",
+ "type-alarm-ack": "Подтвержден",
+ "type-alarm-clear": "Сброшен",
+ "status-success": "Успех",
+ "status-failure": "Сбой",
+ "audit-log-details": "Подробности аудит лога",
+ "no-audit-logs-prompt": "Логи не найдены",
+ "action-data": "Данные действия",
+ "failure-details": "Подробности сбоя",
+ "search": "Поиск аудит логов",
+ "clear-search": "Очистить поиск"
},
"confirm-on-exit": {
"message": "У вас есть несохраненные изменения. Вы точно хотите покинуть эту страницу?",
@@ -319,17 +338,22 @@
},
"content-type": {
"json": "Json",
- "text": "Text",
- "binary": "Binary (Base64)"
+ "text": "Текстовый",
+ "binary": "Бинарный (Base64)"
},
"customer": {
+ "customer": "Клиент",
"customers": "Клиенты",
"management": "Управление клиентами",
- "dashboard": "Дашборд клиентов",
- "dashboards": "Дашборды клиентов",
+ "dashboard": "Дашборд клиента",
+ "dashboards": "Дашборды клиента",
"devices": "Устройства клиента",
+ "entity-views": "Представления объектов клиента",
+ "assets": "Активы клиента",
"public-dashboards": "Общедоступные дашборды",
"public-devices": "Общедоступные устройства",
+ "public-assets": "Общедоступные активы",
+ "public-entity-views": "Общедоступные представления объектов",
"add": "Добавить клиента",
"delete": "Удалить клиента",
"manage-customer-users": "Управление пользователями клиента",
@@ -337,31 +361,33 @@
"manage-customer-dashboards": "Управление дашбордами клиента",
"manage-public-devices": "Управление общедоступными устройствами",
"manage-public-dashboards": "Управление общедоступными дашбордами",
+ "manage-customer-assets": "Управление активами клиента",
+ "manage-public-assets": "Управление общедоступными активами",
"add-customer-text": "Добавить нового клиента",
"no-customers-text": "Клиенты не найдены",
"customer-details": "Подробности о клиенте",
"delete-customer-title": "Вы точно хотите удалить клиента '{{customerTitle}}'?",
- "delete-customer-text": "Внимание, после подтверждения клиент и вся связанная с ним информация будут безвозвратно утеряны.",
- "delete-customers-title": "Вы точно хотите удалить { count, plural, one {1 клиента} other {# клиентов} }?",
- "delete-customers-action-title": "Удалить { count, plural, one {1 клиента} other {# клиентов} } }",
- "delete-customers-text": "Внимание, после подтверждения клиенты и вся связанная с ними информация будут безвозвратно утеряны.",
+ "delete-customer-text": "Внимание, после подтверждения клиент и все связанные с ним данные будут безвозвратно удалены.",
+ "delete-customers-title": "Вы точно хотите удалить { count, plural, 1 {1 клиент} few {# клиента} other {# клиентов} }?",
+ "delete-customers-action-title": "Удалить { count, plural, 1 {1 клиент} few {# клиента} other {# клиентов} }",
+ "delete-customers-text": "Внимание, после подтверждения выбранные клиенты и все связанные с ними данные будут безвозвратно удалены.",
"manage-users": "Управление пользователями",
- "manage-assets": "Manage assets",
+ "manage-assets": "Управление активами",
"manage-devices": "Управление устройствами",
"manage-dashboards": "Управление дашбордами",
"title": "Имя",
"title-required": "Название обязательно.",
"description": "Описание",
- "details": "Details",
- "events": "Events",
- "copyId": "Copy customer Id",
- "idCopiedMessage": "Customer Id has been copied to clipboard",
- "select-customer": "Select customer",
- "no-customers-matching": "No customers matching '{{entity}}' were found.",
- "customer-required": "Customer is required",
- "select-default-customer": "Select default customer",
- "default-customer": "Default customer",
- "default-customer-required": "Default customer is required in order to debug dashboard on Tenant level"
+ "details": "Подробности",
+ "events": "События",
+ "copyId": "Копировать ИД клиента",
+ "idCopiedMessage": "ИД клиента скопирован в буфер обмена",
+ "select-customer": "Выбрать клиента",
+ "no-customers-matching": "Клиенты, соответствующие '{{entity}}', не найдены.",
+ "customer-required": "Клиент обязателен",
+ "select-default-customer": "Выбрать клиента по умолчанию",
+ "default-customer": "Клиент по умолчанию",
+ "default-customer-required": "Клиент по умолчанию обязателен для отладки дашборда на уровне на уровне Владельца"
},
"datetime": {
"date-from": "Дата с",
@@ -379,9 +405,15 @@
"assign-dashboard-to-customer-text": "Пожалуйста, выберите дашборды, которые нужно прикрепить к клиенту",
"assign-to-customer-text": "Пожалуйста, выберите клиента, к которому нужно прикрепить дашборд(ы)",
"assign-to-customer": "Прикрепить к клиенту",
- "unassign-from-customer": "Открепить от клиента",
+ "unassign-from-customer": "Отозвать у клиента",
"make-public": "Открыть дашборд для общего доступа",
"make-private": "Закрыть дашборд для общего доступа",
+ "manage-assigned-customers": "Управление назначенными клиентами",
+ "assigned-customers": "Назначенные клиенты",
+ "assign-to-customers": "Присвоить дашборд(ы) клиенту",
+ "assign-to-customers-text": "Пожалуйста, выбери клиентов, которым нужно присвоить дашборд(ы)",
+ "unassign-from-customers": "Отозвать дашборд(ы) у клиентов",
+ "unassign-from-customers-text": "Пожалуйста, выберите клиентов, у которых нужно отозвать дашборд(ы)",
"no-dashboards-text": "Дашборды не найдены",
"no-widgets": "Виджеты не сконфигурированы",
"add-widget": "Добавить новый виджет",
@@ -396,19 +428,20 @@
"add-dashboard-text": "Добавить новый дашборд",
"assign-dashboards": "Прикрепить дашборды",
"assign-new-dashboard": "Прикрепить новый дашборд",
- "assign-dashboards-text": "Прикрепить { count, plural, 1 {1 дашборд} other {# дашборда} } к клиенту",
+ "assign-dashboards-text": "Прикрепить { count, plural, 1 {1 дашборд} few {# дашборда} other {# дашбордов} } к клиенту",
+ "unassign-dashboards-action-text": "Отозвать { count, plural, 1 {1 дашборд} few {# дашборда} other {# дашбордов} } у клиента",
"delete-dashboards": "Удалить дашборды",
- "unassign-dashboards": "Открепить дашборды",
- "unassign-dashboards-action-title": "Открепить { count, plural, one {1 дашборд} few {# дашборда} other {# дашбордов} } от клиента",
+ "unassign-dashboards": "Отозвать дашборды",
+ "unassign-dashboards-action-title": "Отозвать { count, plural, one {1 дашборд} few {# дашборда} other {# дашбордов} } у клиента",
"delete-dashboard-title": "Вы точно хотите удалить дашборд '{{dashboardTitle}}'?",
"delete-dashboard-text": "Внимание, после подтверждения дашборд и все связанные с ним данные будут безвозвратно утеряны.",
"delete-dashboards-title": "Вы точно хотите удалить { count, plural, one {1 дашборд} few {# дашборда} other {# дашбордов} }?",
"delete-dashboards-action-title": "Удалить { count, plural, one {1 дашборд} few {# дашборда} other {# дашбордов} }",
"delete-dashboards-text": "Внимание, после подтверждения дашборды и все связанные с ними данные будут безвозвратно утеряны.",
- "unassign-dashboard-title": "Вы точно хотите открепить дашборд '{{dashboardTitle}}'?",
+ "unassign-dashboard-title": "Вы точно хотите отозвать дашборд '{{dashboardTitle}}'?",
"unassign-dashboard-text": "После подтверждения дашборд не будет доступен клиенту.",
- "unassign-dashboard": "Открепить дашборд",
- "unassign-dashboards-title": "Вы точно хотите открепить { count, plural, one {1 дашборд} few {# дашборда} other {# дашбордов} }?",
+ "unassign-dashboard": "Отозвать дашборд",
+ "unassign-dashboards-title": "Вы точно хотите отозвать { count, plural, one {1 дашборд} few {# дашборда} other {# дашбордов} }?",
"unassign-dashboards-text": "После подтверждения выбранные дашборды не будут доступны клиенту.",
"public-dashboard-title": "Теперь дашборд общедоступный",
"public-dashboard-text": "Теперь ваш дашборд {{dashboardTitle}} доступен всем по ссылке:",
@@ -445,9 +478,17 @@
"vertical-margin-required": "Величина вертикального отступа обязательна.",
"min-vertical-margin-message": "Минимальная величина вертикального отступа - 0.",
"max-vertical-margin-message": "Максимальная величина вертикального отступа - 50.",
+ "autofill-height": "Автозаполнение по высоте",
+ "mobile-layout": "Настройки мобильного режима",
+ "mobile-row-height": "Высота строки в мобильном режиме, px",
+ "mobile-row-height-required": "Высота строки в мобильном режиме обязательна.",
+ "min-mobile-row-height-message": "Минимальная высота строки в мобильном режиме составляет 5 px.",
+ "max-mobile-row-height-message": "Максимальная высота строки в мобильном режиме составляет 200 px.",
"display-title": "Показать название дашборда",
+ "toolbar-always-open": "Отображать панель инструментов",
"title-color": "Цвет названия",
- "display-device-selection": "Показать выборку устройств",
+ "display-dashboards-selection": "Отображать выборку дашбордов",
+ "display-entities-selection": "Отображать выбору объектов",
"display-dashboard-timewindow": "Показать временное окно",
"display-dashboard-export": "Показать экспорт",
"import": "Импортировать дашборд",
@@ -456,66 +497,74 @@
"create-new-dashboard": "Создать новый дашборд",
"dashboard-file": "Файл дашборда",
"invalid-dashboard-file-error": "Не удалось импортировать дашборд: неизвестная схема данных дашборда.",
- "dashboard-import-missing-aliases-title": "Конфигурировать псевдонимы импортированного дашборда",
+ "dashboard-import-missing-aliases-title": "Настроить псевдонимы импортированного дашборда",
"create-new-widget": "Создать новый виджет",
- "import-widget": "Импортировать новый виджет",
- "widget-file": "Файл виджета",
- "invalid-widget-file-error": "Не удалось импортировать виджет: неизвестная схема данных виджета.",
- "widget-import-missing-aliases-title": "Конфигурировать псевдонимы импортированного виджета",
- "open-toolbar": "Открыть панель инструментов",
+ "import-widget": "Импортировать виджет",
+ "widget-file": "Виджет-файл",
+ "invalid-widget-file-error": "Не удалось импортировать виджет: неправильный формат данных.",
+ "widget-import-missing-aliases-title": "Настроить псевдонимы, которые использует импортированный виджет",
+ "open-toolbar": "Открыть панель инструментов дашборда",
"close-toolbar": "Закрыть панель инструментов",
- "configuration-error": "Ошибка конфигурирования",
- "alias-resolution-error-title": "Ошибка конфигурирования псевдонимов дашборда",
- "invalid-aliases-config": "Не удалось найти устройства, соответствующие фильтру псевдонимов.
Пожалуйста, свяжитесь с администратором для устранения этой проблемы.",
+ "configuration-error": "Ошибка в настройках",
+ "alias-resolution-error-title": "Ошибка в настройках псевдонимов дашборда",
+ "invalid-aliases-config": "Не удалось найти устройство, соответствующее фильтру псевдонимов.
Пожалуйста, обратитесь к администратору для устранения неполадки.",
"select-devices": "Выберите устройства",
- "assignedToCustomer": "Прикреплен к клиенту",
- "public": "Общедоступный",
- "public-link": "Общедоступная ссылка",
- "copy-public-link": "Скопировать общедоступную ссылку",
- "public-link-copied-message": "Общедоступная ссылка на дашборд скопирована в буфер обмена",
- "manage-states": "Manage dashboard states",
- "states": "Dashboard states",
- "search-states": "Search dashboard states",
- "selected-states": "{ count, plural, 1 {1 dashboard state} other {# dashboard states} } selected",
- "edit-state": "Edit dashboard state",
- "delete-state": "Delete dashboard state",
- "add-state": "Add dashboard state",
- "state": "Dashboard state",
- "state-name": "Name",
- "state-name-required": "Dashboard state name is required.",
- "state-id": "State Id",
- "state-id-required": "Dashboard state id is required.",
- "state-id-exists": "Dashboard state with the same id is already exists.",
- "is-root-state": "Root state",
- "delete-state-title": "Delete dashboard state",
- "delete-state-text": "Are you sure you want delete dashboard state with name '{{stateName}}'?",
- "show-details": "Show details",
- "hide-details": "Hide details",
- "select-state": "Select target state",
- "state-controller": "State controller"
+ "assignedToCustomer": "Присвоенные клиенту",
+ "assignedToCustomers": "Присвоенные клиентам",
+ "public": "Публичный",
+ "public-link": "Публичная ссылка",
+ "copy-public-link": "Копировать публичную ссылку",
+ "public-link-copied-message": "Публичная ссылка на дашборд скопирована в буфер обмена.",
+ "manage-states": "Управление состоянием дашборда",
+ "states": "Состояния дашборда",
+ "search-states": "Поиск состояния дашборда",
+ "selected-states": "Выбрано { count, plural, 1 {1 состояние} few {# состояния} other {# состояний} } дашборда",
+ "edit-state": "Изменить состояние дашборда",
+ "delete-state": "Удалить состояние дашборда",
+ "add-state": "Добавить состояние дашборда",
+ "state": "Состояние дашборда",
+ "state-name": "Название",
+ "state-name-required": "Название состояния дашборда обязательно.",
+ "state-id": "ИД состояния",
+ "state-id-required": "ИД состояния дашборда обязателен.",
+ "state-id-exists": "Состояния дашборда с таким именем уже существует.",
+ "is-root-state": "Корневое состояние",
+ "delete-state-title": "Удалить состояние дашборда",
+ "delete-state-text": "Вы точно хотите удалить состояние дашборда '{{stateName}}'?",
+ "show-details": "Показать подробности",
+ "hide-details": "Скрыть подробности",
+ "select-state": "Выбрать состояние",
+ "state-controller": "Контроллер состояния"
},
"datakey": {
"settings": "Настройки",
"advanced": "Дополнительно",
"label": "Метка",
"color": "Цвет",
- "units": "Special symbol to show next to value",
- "decimals": "Number of digits after floating point",
+ "units": "Укажите символы, которые нужно указывать после значения",
+ "decimals": "Число знаков после запятой",
"data-generation-func": "Функция генерации данных",
"use-data-post-processing-func": "Использовать функцию пост-обработки данных",
"configuration": "Конфигурация ключа данных",
- "timeseries": "Выборка по времени",
+ "timeseries": "Телеметрия",
"attributes": "Атрибуты",
- "timeseries-required": "Выборка по времени обязательна.",
- "timeseries-or-attributes-required": "Выборка по времени/атрибуты обязательны.",
- "maximum-timeseries-or-attributes": "Maximum { count, plural, 1 {1 timeseries/attribute is allowed.} other {# timeseries/attributes are allowed} }",
- "alarm-fields-required": "Alarm fields are required.",
+ "alarm": "Параметры оповещения",
+ "timeseries-required": "Телеметрия объекта обязательна.",
+ "timeseries-or-attributes-required": "Телеметрия/атрибуты обязательны.",
+ "maximum-timeseries-or-attributes": "Максимальное количество параметров телеметрии или атрибутов равно {{count}}",
+ "alarm-fields-required": "Параметры оповещения обязательны.",
"function-types": "Тип функции",
"function-types-required": "Тип функции обязателен.",
- "maximum-function-types": "Maximum { count, plural, 1 {1 function type is allowed.} other {# function types are allowed} }"
+ "maximum-function-types": "Максимальное количество типов функции равно {{count}}",
+ "time-description": "время текущего значения;",
+ "value-description": "текущее значение;",
+ "prev-value-description": "результат предыдущего вызова функции;",
+ "time-prev-description": "время предыдущего значения;",
+ "prev-orig-value-description": "исходное предыдущее значение;"
},
"datasource": {
"type": "Тип источника данных",
+ "name": "Название",
"add-datasource-prompt": "Пожалуйста, добавьте источник данных"
},
"details": {
@@ -537,7 +586,7 @@
"create-new-alias": "Создать новый!",
"create-new-key": "Создать новый!",
"duplicate-alias-error": "Найден дублирующийся псевдоним '{{alias}}'.
В рамках дашборда псевдонимы устройств должны быть уникальными.",
- "configure-alias": "Конфигурировать '{{alias}}' псевдоним",
+ "configure-alias": "Настроить '{{alias}}' псевдоним",
"no-devices-matching": "Устройство '{{entity}}' не найдено.",
"alias": "Псевдоним",
"alias-required": "Псевдоним устройства обязателен.",
@@ -565,9 +614,9 @@
"assign-devices": "Присвоить устройство",
"assign-devices-text": "Присвоить { count, plural, one {1 устройство} few {# устройства} other {# устройств} } клиенту",
"delete-devices": "Удалить устройства",
- "unassign-from-customer": "Отменить присвоение клиенту",
- "unassign-devices": "Отменить присвоение устройств",
- "unassign-devices-action-title": "Отменить присвоение { count, plural, one {1 устройства} few {# устройств} other {# устройств} } клиенту",
+ "unassign-from-customer": "Отозвать у клиенту",
+ "unassign-devices": "Отозвать устройства",
+ "unassign-devices-action-title": "Отозвать у клиента { count, plural, one {1 устройство} few {# устройства} other {# устройств} }",
"assign-new-device": "Присвоить новое устройство",
"make-public-device-title": "Вы точно хотите открыть общий доступ к устройству '{{deviceName}}'?",
"make-public-device-text": "После подтверждения устройство и все связанные с ним данные будут общедоступными.",
@@ -579,10 +628,10 @@
"delete-devices-title": "Вы точно хотите удалить { count, plural, one {1 устройство} few {# устройства} other {# устройств} }?",
"delete-devices-action-title": "Удалить { count, plural, one {1 устройство} few {# устройства} other {# устройств} } }",
"delete-devices-text": "Внимание, после подтверждения выбранные устройства и все связанные с ними данные будут безвозвратно утеряны..",
- "unassign-device-title": "Вы точно хотите отменить присвоение устройства '{{deviceName}}'?",
+ "unassign-device-title": "Вы точно хотите отозвать устройство '{{deviceName}}'?",
"unassign-device-text": "После подтверждения устройство будет недоступно клиенту.",
- "unassign-device": "Отменить присвоение устройства",
- "unassign-devices-title": "Вы точно хотите отменить присвоение { count, plural, one {1 устройство} few {# устройства} other {# устройств} } }?",
+ "unassign-device": "Отозвать устройство",
+ "unassign-devices-title": "Вы точно хотите отозвать { count, plural, one {1 устройство} few {# устройства} other {# устройств} }?",
"unassign-devices-text": "После подтверждения выбранные устройства будут недоступны клиенту.",
"device-credentials": "Учетные данные устройства",
"credentials-type": "Тип учетных данных",
@@ -593,6 +642,14 @@
"rsa-key-required": "Открытый ключ RSA обязателен.",
"secret": "Секрет",
"secret-required": "Секрет обязателен.",
+ "device-type": "Тип устройства",
+ "device-type-required": "Тип устройства обязатеен.",
+ "select-device-type": "Выберите тип устройства",
+ "enter-device-type": "Введите тип устройства",
+ "any-device": "Любое устройство",
+ "no-device-types-matching": "Тип устройства, соответствующий '{{entitySubtype}}', не найден.",
+ "device-type-list-empty": "Не выбран тип устройства.",
+ "device-types": "Типы устройств",
"name": "Название",
"name-required": "Название обязательно.",
"description": "Описание",
@@ -607,7 +664,8 @@
"unable-delete-device-alias-text": "Не удалось удалить псевдоним '{{deviceAlias}}' устройства, т.к. он используется следующими виджетами:
{{widgetsList}}",
"is-gateway": "Гейтвей",
"public": "Общедоступный",
- "device-public": "Устройство общедоступно"
+ "device-public": "Устройство общедоступно",
+ "select-device": "Выбрать устройство"
},
"dialog": {
"close": "Закрыть диалог"
@@ -618,100 +676,200 @@
"unknown-error": "Неизвестная ошибка"
},
"entity": {
- "entity": "Entity",
- "entities": "Entities",
- "aliases": "Entity aliases",
- "entity-alias": "Entity alias",
- "unable-delete-entity-alias-title": "Unable to delete entity alias",
- "unable-delete-entity-alias-text": "Entity alias '{{entityAlias}}' can't be deleted as it used by the following widget(s):
{{widgetsList}}",
- "duplicate-alias-error": "Duplicate alias found '{{alias}}'.
Entity aliases must be unique whithin the dashboard.",
- "missing-entity-filter-error": "Filter is missing for alias '{{alias}}'.",
- "configure-alias": "Configure '{{alias}}' alias",
- "alias": "Alias",
- "alias-required": "Entity alias is required.",
- "remove-alias": "Remove entity alias",
- "add-alias": "Add entity alias",
- "entity-list": "Entity list",
- "entity-type": "Entity type",
- "entity-types": "Entity types",
- "entity-type-list": "Entity type list",
- "any-entity": "Any entity",
- "enter-entity-type": "Enter entity type",
- "no-entities-matching": "No entities matching '{{entity}}' were found.",
- "no-entity-types-matching": "No entity types matching '{{entityType}}' were found.",
- "name-starts-with": "Name starts with",
- "use-entity-name-filter": "Use filter",
- "entity-list-empty": "No entities selected.",
- "entity-type-list-empty": "No entity types selected.",
- "entity-name-filter-required": "Entity name filter is required.",
- "entity-name-filter-no-entity-matched": "No entities starting with '{{entity}}' were found.",
- "all-subtypes": "All",
- "select-entities": "Select entities",
- "no-aliases-found": "No aliases found.",
- "no-alias-matching": "'{{alias}}' not found.",
- "create-new-alias": "Create a new one!",
- "key": "Key",
- "key-name": "Key name",
- "no-keys-found": "No keys found.",
- "no-key-matching": "'{{key}}' not found.",
- "create-new-key": "Create a new one!",
- "type": "Type",
- "type-required": "Entity type is required.",
- "type-device": "Device",
- "type-devices": "Devices",
- "list-of-devices": "{ count, plural, 1 {One device} other {List of # devices} }",
- "device-name-starts-with": "Devices whose names start with '{{prefix}}'",
- "type-asset": "Asset",
- "type-assets": "Assets",
- "list-of-assets": "{ count, plural, 1 {One asset} other {List of # assets} }",
- "asset-name-starts-with": "Assets whose names start with '{{prefix}}'",
- "type-rule": "Rule",
- "type-rules": "Rules",
- "list-of-rules": "{ count, plural, 1 {One rule} other {List of # rules} }",
- "rule-name-starts-with": "Rules whose names start with '{{prefix}}'",
- "type-plugin": "Plugin",
- "type-plugins": "Plugins",
- "list-of-plugins": "{ count, plural, 1 {One plugin} other {List of # plugins} }",
- "plugin-name-starts-with": "Plugins whose names start with '{{prefix}}'",
- "type-tenant": "Tenant",
- "type-tenants": "Tenants",
- "list-of-tenants": "{ count, plural, 1 {One tenant} other {List of # tenants} }",
- "tenant-name-starts-with": "Tenants whose names start with '{{prefix}}'",
- "type-customer": "Customer",
- "type-customers": "Customers",
- "list-of-customers": "{ count, plural, 1 {One customer} other {List of # customers} }",
- "customer-name-starts-with": "Customers whose names start with '{{prefix}}'",
- "type-user": "User",
- "type-users": "Users",
- "list-of-users": "{ count, plural, 1 {One user} other {List of # users} }",
- "user-name-starts-with": "Users whose names start with '{{prefix}}'",
- "type-dashboard": "Dashboard",
- "type-dashboards": "Dashboards",
- "list-of-dashboards": "{ count, plural, 1 {One dashboard} other {List of # dashboards} }",
- "dashboard-name-starts-with": "Dashboards whose names start with '{{prefix}}'",
- "type-alarm": "Alarm",
- "type-alarms": "Alarms",
- "list-of-alarms": "{ count, plural, 1 {One alarms} other {List of # alarms} }",
- "alarm-name-starts-with": "Alarms whose names start with '{{prefix}}'",
- "type-rulechain": "Rule chain",
- "type-rulechains": "Rule chains",
- "list-of-rulechains": "{ count, plural, 1 {One rule chain} other {List of # rule chains} }",
- "rulechain-name-starts-with": "Rule chains whose names start with '{{prefix}}'",
- "type-current-customer": "Current Customer",
- "search": "Search entities",
- "selected-entities": "{ count, plural, 1 {1 entity} other {# entities} } selected",
- "entity-name": "Entity name",
- "details": "Entity details",
- "no-entities-prompt": "No entities found",
- "no-data": "No data to display"
+ "entity": "Объект",
+ "entities": "Объекты",
+ "aliases": "Псевдонимы объекта",
+ "entity-alias": "Псевдоним объекта",
+ "unable-delete-entity-alias-title": "Не удалось удалить псевдоним объекта",
+ "unable-delete-entity-alias-text": "Псевдоним объекта '{{entityAlias}}' не может быть удален, так как используется следующим(и) виджетом(ами):
{{widgetsList}}",
+ "duplicate-alias-error": "Найден дубликат псевдонима '{{alias}}'.
В рамках одного дашборда псевдонимы объектов должны быть уникальными.",
+ "missing-entity-filter-error": "Отсутствует фильтр для псевдонима '{{alias}}'.",
+ "configure-alias": "Настроить псевдоним '{{alias}}'",
+ "alias": "Псевдоним",
+ "alias-required": "Псевдоним объекта обязателен.",
+ "remove-alias": "Убрать псевдоним объекта",
+ "add-alias": "Добавить псевдоним объекта",
+ "entity-list": "Список объектов",
+ "entity-type": "Тип объекта",
+ "entity-types": "Типы объекта",
+ "entity-type-list": "Список типов объекта",
+ "any-entity": "Любой объект",
+ "enter-entity-type": "Введите тип объекта",
+ "no-entities-matching": "Объекты, соответствующие '{{entity}}', не найдены.",
+ "no-entity-types-matching": "Типы объектов, соответствующие '{{entityType}}', не найдены.",
+ "name-starts-with": "Название, начинающееся с",
+ "use-entity-name-filter": "Использовать фильтр",
+ "entity-list-empty": "Не выбраны объекты.",
+ "entity-type-list-empty": "Не выбраны типы объекта.",
+ "entity-name-filter-required": "Фильтр по названию объекта обязателен.",
+ "entity-name-filter-no-entity-matched": "Объекты, чье название начинается с '{{entity}}', не найдены.",
+ "all-subtypes": "Все",
+ "select-entities": "Выберите объекты",
+ "no-aliases-found": "Псевдонимы не найдены.",
+ "no-alias-matching": "Псевдоним '{{alias}}' не найден.",
+ "create-new-alias": "Создать новый!",
+ "key": "Ключ",
+ "key-name": "Название ключа",
+ "no-keys-found": "Ключ не найден.",
+ "no-key-matching": "Ключ '{{key}}' не найден.",
+ "create-new-key": "Создать новый!",
+ "type": "Тип",
+ "type-required": "Тип объекта обязателен.",
+ "type-device": "Устройство",
+ "type-devices": "Устройства",
+ "list-of-devices": "{ count, plural, 1 {Одно устройство} other {Список из # устройств} }",
+ "device-name-starts-with": "Устройства, чьи название начинается с '{{prefix}}'",
+ "type-asset": "Актив",
+ "type-assets": "Активы",
+ "list-of-assets": "{ count, plural, 1 {Один актив} other {Список из # активов} }",
+ "asset-name-starts-with": "Активы, чьи название начинается с '{{prefix}}'",
+ "type-entity-view": "Представление Объекта",
+ "type-entity-views": "Представления Объекта",
+ "list-of-entity-views": "{ count, plural, 1 {Одно представление объекта} other {Список из # представлений объекта} }",
+ "entity-view-name-starts-with": "Представления Объекта, чьи название начинается с '{{prefix}}'",
+ "type-rule": "Правило",
+ "type-rules": "Правила",
+ "list-of-rules": "{ count, plural, 1 {Одно правило} other {Список из # правил} }",
+ "rule-name-starts-with": "Правила, чьи названия начинаются с '{{prefix}}'",
+ "type-plugin": "Плагин",
+ "type-plugins": "Плагины",
+ "list-of-plugins": "{ count, plural, 1 {Один плагин} other {Список из # плагинов} }",
+ "plugin-name-starts-with": "Плагины, чьи имена начинаются с '{{prefix}}'",
+ "type-tenant": "Владелец",
+ "type-tenants": "Владельцы",
+ "list-of-tenants": "{ count, plural, 1 {Один владелец} other {Список из # владельцев} }",
+ "tenant-name-starts-with": "Владельцы, чьи имена начинаются с '{{prefix}}'",
+ "type-customer": "Клиент",
+ "type-customers": "Клиенты",
+ "list-of-customers": "{ count, plural, 1 {Один клиент} other {Список из # клиентов} }",
+ "customer-name-starts-with": "Клиенты, чьи имена начинаются с '{{prefix}}'",
+ "type-user": "Пользователь",
+ "type-users": "Пользователи",
+ "list-of-users": "{ count, plural, 1 {Один пользователь} other {Список из # пользователей} }",
+ "user-name-starts-with": "Пользователи, чьи имена начинаются с '{{prefix}}'",
+ "type-dashboard": "Дашборд",
+ "type-dashboards": "Дашборды",
+ "list-of-dashboards": "{ count, plural, 1 {Один дашборд} other {Список из # дашбордов} }",
+ "dashboard-name-starts-with": "Дашборды, чьи названия начинаются с '{{prefix}}'",
+ "type-alarm": "Оповещение",
+ "type-alarms": "Оповещения",
+ "list-of-alarms": "{ count, plural, 1 {Одно оповещение} other {Список из # оповещений} }",
+ "alarm-name-starts-with": "Оповещения, чьи названия начинаются с '{{prefix}}'",
+ "type-rulechain": "Цепочка правил",
+ "type-rulechains": "Цепочки правил",
+ "list-of-rulechains": "{ count, plural, 1 {Одна цепочка правил} other {Список из # цепочек правил} }",
+ "rulechain-name-starts-with": "Цепочки правил, чьи названия начинаются с '{{prefix}}'",
+ "type-rulenode": "Правило",
+ "type-rulenodes": "Правила",
+ "list-of-rulenodes": "{ count, plural, 1 {Одно правило} other {Список из # правил} }",
+ "rulenode-name-starts-with": "Правила, чьи названия начинаются с '{{prefix}}'",
+ "type-current-customer": "Текущий клиент",
+ "search": "Поиск объектов",
+ "selected-entities": "Выбран(ы) { count, plural, 1 {1 объект} few {# объекта} other {# объектов} }",
+ "entity-name": "Название объекта",
+ "details": "Подробности об объекте",
+ "no-entities-prompt": "Объекты не найдены",
+ "no-data": "Нет данных для отображения",
+ "columns-to-display": "Отобразить следующие колонки"
+ },
+ "entity-view": {
+ "entity-view": "Представление Объекта",
+ "entity-view-required": "Представление объекта обязательно.",
+ "entity-views": "Представления Объектов",
+ "management": "Управление представлениями объектов",
+ "view-entity-views": "Просмотр представлений объектов",
+ "entity-view-alias": "Псевдоним Представления Объекта",
+ "aliases": "Псевдонимы Представления Объекта",
+ "no-alias-matching": "Псевдоним '{{alias}}' не найден.",
+ "no-aliases-found": "Псевдонимы не найдены.",
+ "no-key-matching": "Ключ '{{key}}' не найден.",
+ "no-keys-found": "Ключи не найдены.",
+ "create-new-alias": "Создать новый!",
+ "create-new-key": "Создать новый!",
+ "duplicate-alias-error": "Найден дубликат псевдонима '{{alias}}'.
В рамках одного дашборда псевдонимы представлений объектов должны быть уникальными.",
+ "configure-alias": "Настроить псевдоним '{{alias}}'",
+ "no-entity-views-matching": "Объекты, соответствующие '{{entity}}', не найдены.",
+ "alias": "Псевдонимы",
+ "alias-required": "Псевдоним представления объекта обязателен.",
+ "remove-alias": "Убрать псевдоним представления объекта",
+ "add-alias": "Добавить псевдоним представления объекта",
+ "name-starts-with": "Представления объектов, чьи название начинается с",
+ "entity-view-list": "Список представлений объектов",
+ "use-entity-view-name-filter": "Использовать фильтр",
+ "entity-view-list-empty": "Не выбраны представления объектов.",
+ "entity-view-name-filter-required": "Для представлений объектов фильтр по названиям обязателен.",
+ "entity-view-name-filter-no-entity-view-matched": "Представление объектов, чьи название начинаются с '{{entityView}}', не найдены.",
+ "add": "Представление объекта",
+ "assign-to-customer": "Назначить клиенту",
+ "assign-entity-view-to-customer": "Назначить представление(я) объекта(ов) клиенту",
+ "assign-entity-view-to-customer-text": "Пожалуйста, выберите представления объектов, которые нужно назначить клиенту",
+ "no-entity-views-text": "Представления объектов не найдены",
+ "assign-to-customer-text": "Пожалуйста, выберите клиента, которому нужно назначить представления объектов",
+ "entity-view-details": "Подробности о представлении объекта",
+ "add-entity-view-text": "Добавить новое представление объекта",
+ "delete": "Удалить представление объекта",
+ "assign-entity-views": "Назначить представления объектов",
+ "assign-entity-views-text": "Назначить клиенту { count, plural, 1 {1 представление объекта} few {# представления объектов} other {# представлений объектов} }",
+ "delete-entity-views": "Удалить представления объектов",
+ "unassign-from-customer": "Отозвать у клиента",
+ "unassign-entity-views": "Отозвать представления объектов",
+ "unassign-entity-views-action-title": "Отозвать у клиента { count, plural, 1 {1 представление объекта} few {# представления объектов} other {# представлений объектов} }",
+ "assign-new-entity-view": "Назначит новое представление объекта",
+ "delete-entity-view-title": "Вы точно хотите удалить представление объекта '{{entityViewName}}'?",
+ "delete-entity-view-text": "Внимание, после подтверждения представление объекта и все связанные с ним данные будут безвозвратно удалены.",
+ "delete-entity-views-title": "Вы точно хотите удалить { count, plural, 1 {1 представление объекта} few {# представления объектов} other {# представлений объектов} }?",
+ "delete-entity-views-action-title": "Удалить { count, plural, 1 {1 представление объекта} few {# представления объектов} other {# представлений объектов} }",
+ "delete-entity-views-text": "Внимание, после подтверждения выбранные представления объектов и все связанные с ними данные будут безвозвратно удалены.",
+ "unassign-entity-view-title": "Вы точно хотите отозвать представление объекта '{{entityViewName}}'?",
+ "unassign-entity-view-text": "После подтверждение представление объекта будет недоступно клиенту.",
+ "unassign-entity-view": "Отозвать представление объекта",
+ "unassign-entity-views-title": "Вы точно хотите отозвать { count, plural, 1 {1 представление объекта} few {# представления объектов} other {# представлений объектов} }?",
+ "unassign-entity-views-text": "После подтверждение выбранные представления объектов будет недоступно клиенту.",
+ "entity-view-type": "Тип представления объекта",
+ "entity-view-type-required": "Тип представления объекта обязателен.",
+ "select-entity-view-type": "Выберите тип представления объекта",
+ "enter-entity-view-type": "Введите тип представления объекта",
+ "any-entity-view": "Любое представление объекта",
+ "no-entity-view-types-matching": "Типы представления объекта, соответствующие '{{entitySubtype}}', не найдены.",
+ "entity-view-type-list-empty": "Не выбраны типы представления объекта.",
+ "entity-view-types": "Типы представления объекта",
+ "name": "Название",
+ "name-required": "Название обязательно.",
+ "description": "Описание",
+ "events": "События",
+ "details": "Подробности",
+ "copyId": "Копировать ИД представление объекта",
+ "assignedToCustomer": "Назначенные клиенту",
+ "unable-entity-view-device-alias-title": "Не удалось удалить псевдоним представления объекта",
+ "unable-entity-view-device-alias-text": "Не удалось удалить псевдоним устройства '{{entityViewAlias}}', т.к. он используется следующими виджетами:
{{widgetsList}}",
+ "select-entity-view": "Выбрать представление объекта",
+ "make-public": "Открыть общий доступ к представлению объекта",
+ "start-date": "Дата начала",
+ "start-ts": "Время начала",
+ "end-date": "Дата окончания",
+ "end-ts": "Время окончания",
+ "date-limits": "Временной лимит",
+ "client-attributes": "Клиентские атрибуты",
+ "shared-attributes": "Общие атрибуты",
+ "server-attributes": "Серверные атрибуты",
+ "timeseries": "Телеметрия",
+ "client-attributes-placeholder": "Клиентские атрибуты",
+ "shared-attributes-placeholder": "Общие атрибуты",
+ "server-attributes-placeholder": "Серверные атрибуты",
+ "timeseries-placeholder": "Телеметрия",
+ "target-entity": "Целевой объект",
+ "attributes-propagation": "Пробросить атрибуты",
+ "attributes-propagation-hint": "Представление объекта автоматически копирует указанные атрибуты с Целевого Объекта каждый раз, когда вы сохраняете или обновляете это представление. В целях производительности атрибуты целевого объекта не пробрасываются в представление объекта на каждом их изменении. Вы можете включить автоматический проброс, настроив в вашей цепочке правило \"copy to view\" и соединив его с сообщениями типа \"Post attributes\" и \"Attributes Updated\".",
+ "timeseries-data": "Данные телеметрии",
+ "timeseries-data-hint": "Настроить ключи данных телеметрии целевого объекта, которые будут доступны представлению объекта. Эти данные только для чтения."
},
"event": {
"event-type": "Тип события",
"type-error": "Ошибка",
"type-lc-event": "Событие жизненного цикла",
"type-stats": "Статистика",
- "type-debug-rule-node": "Debug",
- "type-debug-rule-chain": "Debug",
+ "type-debug-rule-node": "Отладка",
+ "type-debug-rule-chain": "Отладка",
"no-events-prompt": "События не найдены",
"error": "Ошибка",
"alarm": "Аварийное оповещение",
@@ -719,14 +877,14 @@
"server": "Сервер",
"body": "Тело",
"method": "Метод",
- "type": "Type",
- "entity": "Entity",
- "message-id": "Message Id",
- "message-type": "Message Type",
- "data-type": "Data Type",
- "relation-type": "Relation Type",
- "metadata": "Metadata",
- "data": "Data",
+ "type": "Тип",
+ "entity": "Объект",
+ "message-id": "ИД сообщения",
+ "message-type": "Тип сообщения",
+ "data-type": "Тип данных",
+ "relation-type": "Тип отношения",
+ "metadata": "Метаданные",
+ "data": "Данные",
"event": "Событие",
"status": "Статус",
"success": "Успех",
@@ -735,161 +893,159 @@
"errors-occurred": "Возникли ошибки"
},
"extension": {
- "extensions": "Extensions",
- "selected-extensions": "{ count, plural, 1 {1 extension} other {# extensions} } selected",
- "type": "Type",
- "key": "Key",
- "value": "Value",
- "id": "Id",
- "extension-id": "Extension id",
- "extension-type": "Extension type",
+ "extensions": "Расширение",
+ "selected-extensions": "Выбрано { count, plural, 1 {1 расширение} few {# расширения} other {# расширений} }",
+ "type": "Тип",
+ "key": "Ключ",
+ "value": "Значение",
+ "id": "ИД",
+ "extension-id": "ИД расширения",
+ "extension-type": "Тип расширения",
"transformer-json": "JSON *",
- "unique-id-required": "Current extension id already exists.",
- "delete": "Delete extension",
- "add": "Add extension",
- "edit": "Edit extension",
- "delete-extension-title": "Are you sure you want to delete the extension '{{extensionId}}'?",
- "delete-extension-text": "Be careful, after the confirmation the extension and all related data will become unrecoverable.",
- "delete-extensions-title": "Are you sure you want to delete { count, plural, 1 {1 extension} other {# extensions} }?",
- "delete-extensions-text": "Be careful, after the confirmation all selected extensions will be removed.",
- "converters": "Converters",
- "converter-id": "Converter id",
- "configuration": "Configuration",
- "converter-configurations": "Converter configurations",
- "token": "Security token",
- "add-converter": "Add converter",
- "add-config": "Add converter configuration",
- "device-name-expression": "Device name expression",
- "device-type-expression": "Device type expression",
- "custom": "Custom",
+ "unique-id-required": "Такое ИД расширения уже существует.",
+ "delete": "Удалить расширение",
+ "add": "Добавить расширение",
+ "edit": "Редактировать расширение",
+ "delete-extension-title": "Вы точно хотите удалить расширение '{{extensionId}}'?",
+ "delete-extension-text": "Внимание, после подтверждения расширение и все связанные с ним данные будут безвозвратно удалены.",
+ "delete-extensions-title": "Вы точно хотите удалить { count, plural, 1 {1 расширение} few {# расширения} other {# расширений} }?",
+ "delete-extensions-text": "Внимание, после подтверждения выбранные расширения будут удалены.",
+ "converters": "Конвертеры",
+ "converter-id": "ИД конвертера",
+ "configuration": "Конфигурация",
+ "converter-configurations": "Конфигурация конвертера",
+ "token": "Токен безопасности",
+ "add-converter": "Добавить конвертер",
+ "add-config": "Добавить конфигурацию конвертера",
+ "device-name-expression": "Маска названия устройства",
+ "device-type-expression": "Маска типа устройства",
+ "custom": "Пользовательский",
"to-double": "To Double",
- "transformer": "Transformer",
- "json-required": "Transformer json is required.",
- "json-parse": "Unable to parse transformer json.",
- "attributes": "Attributes",
- "add-attribute": "Add attribute",
- "add-map": "Add mapping element",
- "timeseries": "Timeseries",
- "add-timeseries": "Add timeseries",
- "field-required": "Field is required",
- "brokers": "Brokers",
- "add-broker": "Add broker",
- "host": "Host",
- "port": "Port",
- "port-range": "Port should be in a range from 1 to 65535.",
- "ssl": "Ssl",
- "credentials": "Credentials",
- "username": "Username",
- "password": "Password",
- "retry-interval": "Retry interval in milliseconds",
- "anonymous": "Anonymous",
- "basic": "Basic",
+ "transformer": "Преобразователь",
+ "json-required": "JSON преобразователя обязателен.",
+ "json-parse": "Не удалось распознать JSON преобразователя.",
+ "attributes": "Атрибуты",
+ "add-attribute": "Добавить атрибут",
+ "add-map": "Добавить элемент сопоставления",
+ "timeseries": "Телеметрия",
+ "add-timeseries": "Добавить параметр телеметрии",
+ "field-required": "Параметр обязателен",
+ "brokers": "Брокеры",
+ "add-broker": "Добавить брокер",
+ "host": "Хост",
+ "port": "Порт",
+ "port-range": "Значение порта лежит в диапазоне от 1 до 65535.",
+ "ssl": "SSL",
+ "credentials": "Учетные данные",
+ "username": "Имя пользователя",
+ "password": "Пароль",
+ "retry-interval": "Интервал повтора в миллисекундах",
+ "anonymous": "Анонимный",
+ "basic": "Общий",
"pem": "PEM",
- "ca-cert": "CA certificate file *",
- "private-key": "Private key file *",
- "cert": "Certificate file *",
- "no-file": "No file selected.",
- "drop-file": "Drop a file or click to select a file to upload.",
- "mapping": "Mapping",
- "topic-filter": "Topic filter",
- "converter-type": "Converter type",
- "converter-json": "Json",
- "json-name-expression": "Device name json expression",
- "topic-name-expression": "Device name topic expression",
- "json-type-expression": "Device type json expression",
- "topic-type-expression": "Device type topic expression",
- "attribute-key-expression": "Attribute key expression",
- "attr-json-key-expression": "Attribute key json expression",
- "attr-topic-key-expression": "Attribute key topic expression",
- "request-id-expression": "Request id expression",
- "request-id-json-expression": "Request id json expression",
- "request-id-topic-expression": "Request id topic expression",
- "response-topic-expression": "Response topic expression",
- "value-expression": "Value expression",
- "topic": "Topic",
- "timeout": "Timeout in milliseconds",
- "converter-json-required": "Converter json is required.",
- "converter-json-parse": "Unable to parse converter json.",
- "filter-expression": "Filter expression",
- "connect-requests": "Connect requests",
- "add-connect-request": "Add connect request",
- "disconnect-requests": "Disconnect requests",
- "add-disconnect-request": "Add disconnect request",
- "attribute-requests": "Attribute requests",
- "add-attribute-request": "Add attribute request",
- "attribute-updates": "Attribute updates",
- "add-attribute-update": "Add attribute update",
- "server-side-rpc": "Server side RPC",
- "add-server-side-rpc-request": "Add server-side RPC request",
- "device-name-filter": "Device name filter",
- "attribute-filter": "Attribute filter",
- "method-filter": "Method filter",
- "request-topic-expression": "Request topic expression",
- "response-timeout": "Response timeout in milliseconds",
- "topic-expression": "Topic expression",
- "client-scope": "Client scope",
- "add-device": "Add device",
- "opc-server": "Servers",
- "opc-add-server": "Add server",
- "opc-add-server-prompt": "Please add server",
- "opc-application-name": "Application name",
- "opc-application-uri": "Application uri",
- "opc-scan-period-in-seconds": "Scan period in seconds",
- "opc-security": "Security",
- "opc-identity": "Identity",
- "opc-keystore": "Keystore",
- "opc-type": "Type",
- "opc-keystore-type": "Type",
- "opc-keystore-location": "Location *",
- "opc-keystore-password": "Password",
- "opc-keystore-alias": "Alias",
- "opc-keystore-key-password": "Key password",
- "opc-device-node-pattern": "Device node pattern",
- "opc-device-name-pattern": "Device name pattern",
- "modbus-server": "Servers/slaves",
- "modbus-add-server": "Add server/slave",
- "modbus-add-server-prompt": "Please add server/slave",
- "modbus-transport": "Transport",
- "modbus-port-name": "Serial port name",
- "modbus-encoding": "Encoding",
- "modbus-parity": "Parity",
- "modbus-baudrate": "Baud rate",
- "modbus-databits": "Data bits",
- "modbus-stopbits": "Stop bits",
- "modbus-databits-range": "Data bits should be in a range from 7 to 8.",
- "modbus-stopbits-range": "Stop bits should be in a range from 1 to 2.",
- "modbus-unit-id": "Unit ID",
- "modbus-unit-id-range": "Unit ID should be in a range from 1 to 247.",
- "modbus-device-name": "Device name",
- "modbus-poll-period": "Poll period (ms)",
- "modbus-attributes-poll-period": "Attributes poll period (ms)",
- "modbus-timeseries-poll-period": "Timeseries poll period (ms)",
- "modbus-poll-period-range": "Poll period should be positive value.",
- "modbus-tag": "Tag",
- "modbus-function": "Function",
- "modbus-register-address": "Register address",
- "modbus-register-address-range": "Register address should be in a range from 0 to 65535.",
- "modbus-register-bit-index": "Bit index",
- "modbus-register-bit-index-range": "Bit index should be in a range from 0 to 15.",
- "modbus-register-count": "Register count",
- "modbus-register-count-range": "Register count should be a positive value.",
- "modbus-byte-order": "Byte order",
-
+ "ca-cert": "Файл CA сертификата *",
+ "private-key": "Файл приватного ключа *",
+ "cert": "Файл сертификата *",
+ "no-file": "Не выбран файл.",
+ "drop-file": "Перетяните файл или нажмите для выбора файла.",
+ "mapping": "Сопоставление",
+ "topic-filter": "Фильтр тем",
+ "converter-type": "Тип конвертера",
+ "converter-json": "JSON",
+ "json-name-expression": "JSON выражение для названия устройства",
+ "topic-name-expression": "Выражение для названия устройства в названии темы",
+ "json-type-expression": "JSON выражение для типа устройства",
+ "topic-type-expression": "Выражение для типа устройства в названии темы",
+ "attribute-key-expression": "Выражение для атрибута",
+ "attr-json-key-expression": "JSON выражение для атрибута",
+ "attr-topic-key-expression": "Выражение для атрибута в названии темы",
+ "request-id-expression": "Выражение для ИД запроса",
+ "request-id-json-expression": "JSON выражение для ИД запроса",
+ "request-id-topic-expression": "Выражение для ИД запроса в названии темы",
+ "response-topic-expression": "Выражение для темы ответов",
+ "value-expression": "Выражение для значения",
+ "topic": "Тема",
+ "timeout": "Таймаут в миллисекундах",
+ "converter-json-required": "JSON конвертер обязателен.",
+ "converter-json-parse": "Не удалось распознать JSON конвертера.",
+ "filter-expression": "Выражение для фильтрации",
+ "connect-requests": "Запросы о подключении устройства",
+ "add-connect-request": "Добавить запросы о подключении устройства",
+ "disconnect-requests": "Запросы об отсоединении устройства",
+ "add-disconnect-request": "Добавить запрос об отсоединении устройства",
+ "attribute-requests": "Запросы для атрибутов",
+ "add-attribute-request": "Добавить запрос для атрибутов",
+ "attribute-updates": "Обновление атрибутов",
+ "add-attribute-update": "Добавить обновление атрибутов",
+ "server-side-rpc": "Серверный RPC",
+ "add-server-side-rpc-request": "Добавить серверный RPC",
+ "device-name-filter": "Фильтр для названия устройства",
+ "attribute-filter": "Фильтр для атрибутов",
+ "method-filter": "Фильтр для процедур",
+ "request-topic-expression": "Выражение для темы запросов",
+ "response-timeout": "Время ожидания ответа в миллисекундах",
+ "topic-expression": "Выражение для названия темы",
+ "client-scope": "Клиентский",
+ "add-device": "Добавить устройство",
+ "opc-server": "Серверы",
+ "opc-add-server": "Добавить сервер",
+ "opc-add-server-prompt": "Пожалуйста, добавьте сервер",
+ "opc-application-name": "Название приложения",
+ "opc-application-uri": "URI приложения",
+ "opc-scan-period-in-seconds": "Частота сканирования в секундах",
+ "opc-security": "Безопасность",
+ "opc-identity": "Идентификация",
+ "opc-keystore": "Хранилище ключей",
+ "opc-type": "Тип",
+ "opc-keystore-type": "Тип",
+ "opc-keystore-location": "Расположение *",
+ "opc-keystore-password": "Пароль",
+ "opc-keystore-alias": "Псевдоним",
+ "opc-keystore-key-password": "Пароль для ключ",
+ "opc-device-node-pattern": "Паттерн OPC узла устройства",
+ "opc-device-name-pattern": "Паттерн названия устройства",
+ "modbus-server": "Серверы/ведомые устройства",
+ "modbus-add-server": "Добавить сервер/ведомое устройство",
+ "modbus-add-server-prompt": "Пожалуйста, добавить сервер/ведомое устройство",
+ "modbus-transport": "Транспорт",
+ "modbus-port-name": "Название последовательного порта",
+ "modbus-encoding": "Кодирование символов",
+ "modbus-parity": "Паритет",
+ "modbus-baudrate": "Скорость передачи",
+ "modbus-databits": "Биты данных",
+ "modbus-stopbits": "Стоп-биты",
+ "modbus-databits-range": "Параметр \"Биты данных\" может принимать значения 7 или 8.",
+ "modbus-stopbits-range": "Параметр \"Стоп-биты\" может принимать значения 1 или 2.",
+ "modbus-unit-id": "ИД устройства",
+ "modbus-unit-id-range": "ИД устройства должен быть в диапазоне от 1 до 247.",
+ "modbus-device-name": "Название устройства",
+ "modbus-poll-period": "Частота опроса (в миллисекундах)",
+ "modbus-attributes-poll-period": "Частота опроса для атрибутов (в миллисекундах)",
+ "modbus-timeseries-poll-period": "Частота опроса для телеметрии (в миллисекундах)",
+ "modbus-poll-period-range": "Значение параметра \"Частота опроса\" должно быть больше ноля.",
+ "modbus-tag": "Тег",
+ "modbus-function": "Modbus функция",
+ "modbus-register-address": "Адрес регистра",
+ "modbus-register-address-range": "Адрес регистра должен быть в диапазоне от 0 до 65535.",
+ "modbus-register-bit-index": "Номер бита",
+ "modbus-register-bit-index-range": "Номер бита должен быть в диапазоне от 0 до 15.",
+ "modbus-register-count": "Количество регистров",
+ "modbus-register-count-range": "Количество регистров должно быть больше ноля.",
+ "modbus-byte-order": "Порядок байтов",
"sync": {
- "status": "Status",
- "sync": "Sync",
- "not-sync": "Not sync",
- "last-sync-time": "Last sync time",
- "not-available": "Not available"
+ "status": "Статус",
+ "sync": "Синхронизирован",
+ "not-sync": "Не синхронизирован",
+ "last-sync-time": "Время последней синхронизации",
+ "not-available": "Не доступен"
},
-
- "export-extensions-configuration": "Export extensions configuration",
- "import-extensions-configuration": "Import extensions configuration",
- "import-extensions": "Import extensions",
- "import-extension": "Import extension",
- "export-extension": "Export extension",
- "file": "Extensions file",
- "invalid-file-error": "Invalid extension file"
+ "export-extensions-configuration": "Экспортировать конфигурацию расширений",
+ "import-extensions-configuration": "Импортировать конфигурацию расширений",
+ "import-extensions": "Импортировать расширения",
+ "import-extension": "Импортировать расширение",
+ "export-extension": "Экспортировать расширение",
+ "file": "Файл расширений",
+ "invalid-file-error": "Не правильный формат файла"
},
"fullscreen": {
"expand": "Во весь экран",
@@ -937,20 +1093,20 @@
"tidy": "Tidy"
},
"key-val": {
- "key": "Key",
- "value": "Value",
- "remove-entry": "Remove entry",
- "add-entry": "Add entry",
- "no-data": "No entries"
+ "key": "Ключ",
+ "value": "Значение",
+ "remove-entry": "Удалить элемент",
+ "add-entry": "Добавить элемент",
+ "no-data": "Элементы отсутствуют"
},
"layout": {
- "layout": "Layout",
- "manage": "Manage layouts",
- "settings": "Layout settings",
- "color": "Color",
- "main": "Main",
- "right": "Right",
- "select": "Select target layout"
+ "layout": "Макет",
+ "manage": "Управление макетами",
+ "settings": "Настройки макета",
+ "color": "Цвет",
+ "main": "Основной",
+ "right": "Правый",
+ "select": "Выбрать макет"
},
"legend": {
"position": "Расположение легенды",
@@ -993,140 +1149,149 @@
"current-password": "Текущий пароль"
},
"relation": {
- "relations": "Relations",
- "direction": "Direction",
+ "relations": "Отношения",
+ "direction": "Направления",
"search-direction": {
- "FROM": "From",
- "TO": "To"
+ "FROM": "От",
+ "TO": "К"
},
"direction-type": {
- "FROM": "from",
- "TO": "to"
+ "FROM": "от",
+ "TO": "к"
},
- "from-relations": "Outbound relations",
- "to-relations": "Inbound relations",
- "selected-relations": "{ count, plural, 1 {1 relation} other {# relations} } selected",
- "type": "Type",
- "to-entity-type": "To entity type",
- "to-entity-name": "To entity name",
- "from-entity-type": "From entity type",
- "from-entity-name": "From entity name",
- "to-entity": "To entity",
- "from-entity": "From entity",
- "delete": "Delete relation",
- "relation-type": "Relation type",
- "relation-type-required": "Relation type is required.",
- "any-relation-type": "Any type",
- "add": "Add relation",
- "edit": "Edit relation",
- "delete-to-relation-title": "Are you sure you want to delete relation to the entity '{{entityName}}'?",
- "delete-to-relation-text": "Be careful, after the confirmation the entity '{{entityName}}' will be unrelated from the current entity.",
- "delete-to-relations-title": "Are you sure you want to delete { count, plural, 1 {1 relation} other {# relations} }?",
- "delete-to-relations-text": "Be careful, after the confirmation all selected relations will be removed and corresponding entities will be unrelated from the current entity.",
- "delete-from-relation-title": "Are you sure you want to delete relation from the entity '{{entityName}}'?",
- "delete-from-relation-text": "Be careful, after the confirmation current entity will be unrelated from the entity '{{entityName}}'.",
- "delete-from-relations-title": "Are you sure you want to delete { count, plural, 1 {1 relation} other {# relations} }?",
- "delete-from-relations-text": "Be careful, after the confirmation all selected relations will be removed and current entity will be unrelated from the corresponding entities.",
- "remove-relation-filter": "Remove relation filter",
- "add-relation-filter": "Add relation filter",
- "any-relation": "Any relation",
- "relation-filters": "Relation filters",
- "additional-info": "Additional info (JSON)",
- "invalid-additional-info": "Unable to parse additional info json."
+ "from-relations": "Исходящие отношения",
+ "to-relations": "Входящие отношения",
+ "selected-relations": "Выбрано { count, plural, 1 {1 отношение} few {# отношения} other {# отношений} }",
+ "type": "Тип",
+ "to-entity-type": "К типу объекта",
+ "to-entity-name": "К объекта",
+ "from-entity-type": "От типа объекта",
+ "from-entity-name": "От объекта",
+ "to-entity": "К объекту",
+ "from-entity": "От объекта",
+ "delete": "Удалить отношение",
+ "relation-type": "Тип отношения",
+ "relation-type-required": "Тип отношения обязателен.",
+ "any-relation-type": "Любой тип",
+ "add": "Добавить отношение",
+ "edit": "Редактировать отношение",
+ "delete-to-relation-title": "Вы точно хотите удалить отношение, идущее к объекту '{{entityName}}'?",
+ "delete-to-relation-text": "Внимание, после подтверждения объект '{{entityName}}' будет отвязан от текущего объекта.",
+ "delete-to-relations-title": "Вы точно хотите удалить { count, plural, 1 {1 отношение} few {# отношения} other {# отношений} }?",
+ "delete-to-relations-text": "Внимание, после подтверждения выбранные объекты будут отвязаны от текущего объекта.",
+ "delete-from-relation-title": "Вы точно хотите удалить отношение, идущее от объекта '{{entityName}}'?",
+ "delete-from-relation-text": "Внимание, после подтверждения текущий объект будет отвязан от объекта '{{entityName}}'.",
+ "delete-from-relations-title": "Вы точно хотите удалить { count, plural, 1 {1 отношение} few {# отношения} other {# отношений} }?",
+ "delete-from-relations-text": "Внимание, после подтверждения выбранные объекты будут отвязаны от соответствующих объектов.",
+ "remove-relation-filter": "Удалить фильтр отношений",
+ "add-relation-filter": "Добавить фильтр отношений",
+ "any-relation": "Любое отношение",
+ "relation-filters": "Фильтры отношений",
+ "additional-info": "Дополнительная информация (JSON)",
+ "invalid-additional-info": "Не удалось распознать JSON с дополнительной информацией."
},
"rulechain": {
- "rulechain": "Rule chain",
- "rulechains": "Rule chains",
- "root": "Root",
- "delete": "Delete rule chain",
- "name": "Name",
- "name-required": "Name is required.",
- "description": "Description",
- "add": "Add Rule Chain",
- "set-root": "Make rule chain root",
- "set-root-rulechain-title": "Are you sure you want to make the rule chain '{{ruleChainName}}' root?",
- "set-root-rulechain-text": "After the confirmation the rule chain will become root and will handle all incoming transport messages.",
- "delete-rulechain-title": "Are you sure you want to delete the rule chain '{{ruleChainName}}'?",
- "delete-rulechain-text": "Be careful, after the confirmation the rule chain and all related data will become unrecoverable.",
- "delete-rulechains-title": "Are you sure you want to delete { count, plural, 1 {1 rule chain} other {# rule chains} }?",
- "delete-rulechains-action-title": "Delete { count, plural, 1 {1 rule chain} other {# rule chains} }",
- "delete-rulechains-text": "Be careful, after the confirmation all selected rule chains will be removed and all related data will become unrecoverable.",
- "add-rulechain-text": "Add new rule chain",
- "no-rulechains-text": "No rule chains found",
- "rulechain-details": "Rule chain details",
- "details": "Details",
- "events": "Events",
- "system": "System",
- "import": "Import rule chain",
- "export": "Export rule chain",
- "export-failed-error": "Unable to export rule chain: {{error}}",
- "create-new-rulechain": "Create new rule chain",
- "rulechain-file": "Rule chain file",
- "invalid-rulechain-file-error": "Unable to import rule chain: Invalid rule chain data structure.",
- "copyId": "Copy rule chain Id",
- "idCopiedMessage": "Rule chain Id has been copied to clipboard",
- "select-rulechain": "Select rule chain",
- "no-rulechains-matching": "No rule chains matching '{{entity}}' were found.",
- "rulechain-required": "Rule chain is required",
- "management": "Rules management",
- "debug-mode": "Debug mode"
+ "rulechain": "Цепочка правил",
+ "rulechains": "Цепочки правил",
+ "root": "Корневая",
+ "delete": "Удалить цепочку правил",
+ "name": "Названия",
+ "name-required": "Название необходимо.",
+ "description": "Описание",
+ "add": "Добавить цепочку правил",
+ "set-root": "Сделать цепочку корневой",
+ "set-root-rulechain-title": "Вы точно хотите сделать цепочку правил '{{ruleChainName}}' корневой?",
+ "set-root-rulechain-text": "После подтверждения цепочка правил станет корневой и будет обрабатывать все входящие сообщения.",
+ "delete-rulechain-title": "Вы точно хотите удалить цепочку правил '{{ruleChainName}}'?",
+ "delete-rulechain-text": "Внимание, после подтверждения цепочка правил и все связанные с ней данные будут безвозвратно удалены.",
+ "delete-rulechains-title": "Вы точно хотите удалить { count, plural, 1 {1 цепочку правил} few {# цепочки правил} other {# цепочек правил} }?",
+ "delete-rulechains-action-title": "Удалить { count, plural, 1 {1 цепочку правил} few {# цепочки правил} other {# цепочек правил} }",
+ "delete-rulechains-text": "Внимание, после подтверждения выбранные цепочки правил и все связанные с ними данные будут безвозвратно удалены.",
+ "add-rulechain-text": "Добавить новую цепочку правил",
+ "no-rulechains-text": "Цепочки правил не найдены",
+ "rulechain-details": "Подробности о цепочке правил",
+ "details": "Подробности",
+ "events": "События",
+ "system": "Системная",
+ "import": "Импортировать цепочку правил",
+ "export": "Экспортировать цепочку правил",
+ "export-failed-error": "Не удалось экспортировать цепочку правил: {{error}}",
+ "create-new-rulechain": "Создать новую цепочку правил",
+ "rulechain-file": "Файл цепочки правил",
+ "invalid-rulechain-file-error": "Не удалось импортировать цепочку правил: неправильный формат.",
+ "copyId": "Копировать ИД цепочки правил",
+ "idCopiedMessage": "ИД цепочки правил скопирован в буфер обмена",
+ "select-rulechain": "Выбрать цепочку правил",
+ "no-rulechains-matching": "Цепочки правил, соответствующие '{{entity}}', не найдены.",
+ "rulechain-required": "Цепочка правил обязательна",
+ "management": "Управление цепочками правил",
+ "debug-mode": "Режим отладки"
},
"rulenode": {
- "details": "Details",
- "events": "Events",
- "search": "Search nodes",
- "open-node-library": "Open node library",
- "add": "Add rule node",
- "name": "Name",
- "name-required": "Name is required.",
- "type": "Type",
- "description": "Description",
- "delete": "Delete rule node",
- "select-all-objects": "Select all nodes and connections",
- "deselect-all-objects": "Deselect all nodes and connections",
- "delete-selected-objects": "Delete selected nodes and connections",
- "delete-selected": "Delete selected",
- "select-all": "Select all",
- "copy-selected": "Copy selected",
- "deselect-all": "Deselect all",
- "rulenode-details": "Rule node details",
- "debug-mode": "Debug mode",
- "configuration": "Configuration",
- "link": "Link",
- "link-details": "Rule node link details",
- "add-link": "Add link",
- "link-label": "Link label",
- "link-label-required": "Link label is required.",
- "custom-link-label": "Custom link label",
- "custom-link-label-required": "Custom link label is required.",
- "type-filter": "Filter",
- "type-filter-details": "Filter incoming messages with configured conditions",
- "type-enrichment": "Enrichment",
- "type-enrichment-details": "Add additional information into Message Metadata",
- "type-transformation": "Transformation",
- "type-transformation-details": "Change Message payload and Metadata",
- "type-action": "Action",
- "type-action-details": "Perform special action",
- "type-external": "External",
- "type-external-details": "Interacts with external system",
- "type-rule-chain": "Rule Chain",
- "type-rule-chain-details": "Forwards incoming messages to specified Rule Chain",
- "type-input": "Input",
- "type-input-details": "Logical input of Rule Chain, forwards incoming messages to next related Rule Node",
- "directive-is-not-loaded": "Defined configuration directive '{{directiveName}}' is not available.",
- "ui-resources-load-error": "Failed to load configuration ui resources.",
- "invalid-target-rulechain": "Unable to resolve target rule chain!",
- "test-script-function": "Test script function",
- "message": "Message",
- "message-type": "Message type",
- "message-type-required": "Message type is required",
- "metadata": "Metadata",
- "metadata-required": "Metadata entries can't be empty.",
- "output": "Output",
- "test": "Test",
- "help": "Help"
+ "details": "Подробности",
+ "events": "События",
+ "search": "Поиск правил",
+ "open-node-library": "Открыть библиотеку правил",
+ "add": "Добавить правило",
+ "name": "Название",
+ "name-required": "Название обязательно.",
+ "type": "Тип",
+ "description": "Описание",
+ "delete": "Удалить правило",
+ "select-all-objects": "Выделить все правила и связи",
+ "deselect-all-objects": "Отменить выделение правил и связей",
+ "delete-selected-objects": "Удалить выделенные правила и связи",
+ "delete-selected": "Удалить выделенные",
+ "select-all": "Выделить всё",
+ "copy-selected": "Копировать выделенное",
+ "deselect-all": "Отменить выделение",
+ "rulenode-details": "Подробности о правиле",
+ "debug-mode": "Режим отладки",
+ "configuration": "Настройки",
+ "link": "Связь",
+ "link-details": "Подробности о связи правила",
+ "add-link": "Добавить связь",
+ "link-label": "Метка связи",
+ "link-label-required": "Метка связи обязателен.",
+ "custom-link-label": "Пользовательская метка связи",
+ "custom-link-label-required": "Пользовательская метка связи обязателен.",
+ "link-labels": "Метки связи",
+ "link-labels-required": "Метки связи обязательны.",
+ "no-link-labels-found": "Метки связи не найдены",
+ "no-link-label-matching": "Метка '{{label}}' не найдена.",
+ "create-new-link-label": "Создать новую!",
+ "type-filter": "Фильтр",
+ "type-filter-details": "Фильтр входящих сообщений с заданными условиями",
+ "type-enrichment": "Насыщение",
+ "type-enrichment-details": "Добавить данные в метадату сообщения",
+ "type-transformation": "Преобразование",
+ "type-transformation-details": "Изменить содержимое сообщение и его метадату",
+ "type-action": "Действие",
+ "type-action-details": "Выполнить заданное действие",
+ "type-external": "Сторонние",
+ "type-external-details": "Взаимодействовать со сторонними системами",
+ "type-rule-chain": "Цепочка правил",
+ "type-rule-chain-details": "Перенаправить входящее сообщение в другую цепочку правил",
+ "type-input": "Вход",
+ "type-input-details": "Логический вход цепочки правил перенаправляет входящие сообщения в следующее правило",
+ "type-unknown": "Неизвестный",
+ "type-unknown-details": "Неопределенное правило",
+ "directive-is-not-loaded": "Указанная директива конфигурации '{{directiveName}}' не доступна.",
+ "ui-resources-load-error": "Не удалось загрузить UI ресурсы.",
+ "invalid-target-rulechain": "Не удалось определить целевую цепочку правил!",
+ "test-script-function": "Протестировать скрипт",
+ "message": "Сообщение",
+ "message-type": "Тип сообщения",
+ "select-message-type": "Выбрать тип сообщения",
+ "message-type-required": "Тип сообщения обязателен",
+ "metadata": "Метаданные",
+ "metadata-required": "Метаданные объекта не могут быть пустыми.",
+ "output": "Выход",
+ "test": "Протестировать",
+ "help": "Помощь"
},
"tenant": {
+ "tenant": "Владелец",
"tenants": "Владельцы",
"management": "Управление владельцами",
"add": "Добавить владельца",
@@ -1143,7 +1308,14 @@
"delete-tenants-text": "Внимание, после подтверждения выбранные Владельцы и все связанные с ними данные будут безвозвратно утеряны.",
"title": "Имя",
"title-required": "Имя обязательно.",
- "description": "Описание"
+ "description": "Описание",
+ "details": "Подробности",
+ "events": "События",
+ "copyId": "Копировать ИД владельца",
+ "idCopiedMessage": "ИД владельца скопирован в буфер обмена",
+ "select-tenant": "Выбрать владельца",
+ "no-tenants-matching": "Владельцы, соответствующие '{{entity}}', не найдены.",
+ "tenant-required": "Владелец обязателен"
},
"timeinterval": {
"seconds-interval": "{ seconds, plural, one {1 секунда} few {# секунды} other {# секунд} }",
@@ -1171,6 +1343,7 @@
"time-period": "Период времени"
},
"user": {
+ "user": "Пользователь",
"users": "Пользователи",
"customer-users": "Пользователи клиента",
"tenant-admins": "Администраторы владельца",
@@ -1192,11 +1365,25 @@
"resend-activation": "Повторить отправку активационного письма",
"email": "Эл. адрес",
"email-required": "Эл. адрес обязателен.",
+ "invalid-email-format": "Не правильный формат письма.",
"first-name": "Имя",
"last-name": "Фамилия",
"description": "Описание",
"default-dashboard": "Дашборд по умолчанию",
- "always-fullscreen": "Всегда во весь экран"
+ "always-fullscreen": "Всегда в полноэкранном режиме",
+ "select-user": "Выбрать пользователя",
+ "no-users-matching": "Пользователи, соответствующие '{{entity}}', не найдены.",
+ "user-required": "Пользователь обязателен",
+ "activation-method": "Метод активации",
+ "display-activation-link": "Отобразить ссылку для активации",
+ "send-activation-mail": "Отправить активационное письмо",
+ "activation-link": "Активационная ссылка для пользователя",
+ "activation-link-text": "Для активации пользователя используйте ссылку :",
+ "copy-activation-link": "Копировать активационную ссылку",
+ "activation-link-copied-message": "Ссылка для активации пользователя скопировано в буфер обмена",
+ "details": "Подробности",
+ "login-as-tenant-admin": "Войти как администратор владельца",
+ "login-as-customer-user": "Войти как пользователь клиента"
},
"value": {
"type": "Тип значения",
@@ -1210,7 +1397,8 @@
"boolean": "Логический тип",
"boolean-value": "Логическое значение",
"false": "Ложь",
- "true": "Правда"
+ "true": "Правда",
+ "long": "Целое число"
},
"widget": {
"widget-library": "Галерея виджетов",
@@ -1225,8 +1413,11 @@
"remove-widget-title": "Вы точно хотите удалить виджет '{{widgetTitle}}'?",
"remove-widget-text": "Внимание, после подтверждения виджет и все связанные с ним данные будут безвозвратно утеряны.",
"timeseries": "Выборка по времени",
+ "search-data": "Search data",
+ "no-data-found": "No data found",
"latest-values": "Последние значения",
"rpc": "Управляющий виджет",
+ "alarm": "Alarm widget",
"static": "Статический виджет",
"select-widget-type": "Выберите тип виджета",
"missing-widget-title-error": "Укажите название виджета!",
@@ -1262,16 +1453,16 @@
"export": "Экспортировать виджет"
},
"widget-action": {
- "header-button": "Widget header button",
- "open-dashboard-state": "Navigate to new dashboard state",
- "update-dashboard-state": "Update current dashboard state",
- "open-dashboard": "Navigate to other dashboard",
- "custom": "Custom action",
- "target-dashboard-state": "Target dashboard state",
- "target-dashboard-state-required": "Target dashboard state is required",
- "set-entity-from-widget": "Set entity from widget",
- "target-dashboard": "Target dashboard",
- "open-right-layout": "Open right dashboard layout (mobile view)"
+ "header-button": "Кнопка заголовка виджета",
+ "open-dashboard-state": "Перейти к новомум состоянию дашборда",
+ "update-dashboard-state": "Обновить текущее состояние дашборда",
+ "open-dashboard": "Перейти к другому дашборду",
+ "custom": "Пользовательское действие",
+ "target-dashboard-state": "Целевое состояние дашборда",
+ "target-dashboard-state-required": "Целевое состояние дашборда обязательно",
+ "set-entity-from-widget": "Установить объект из виджета",
+ "target-dashboard": "Целевой дашборд",
+ "open-right-layout": "Открыть мобильный режим дашборда"
},
"widgets-bundle": {
"current": "Текущий набор",
@@ -1312,6 +1503,8 @@
"background-color": "Цвет фона",
"text-color": "Цвет текста",
"padding": "Отступ",
+ "margin": "Margin",
+ "widget-style": "Стиль виджета",
"title-style": "Стиль названия",
"mobile-mode-settings": "Настройки мобильного режима",
"order": "Порядок",
@@ -1322,11 +1515,29 @@
"use-dashboard-timewindow": "Использовать временное окно дашборда",
"display-legend": "Показать легенду",
"datasources": "Источники данных",
+ "maximum-datasources": "Максимальной количество источников данных равно {{count}}",
"datasource-type": "Тип",
"datasource-parameters": "Параметры",
"remove-datasource": "Удалить источник данных",
"add-datasource": "Добавить источник данных",
- "target-device": "Целевое устройство"
+ "target-device": "Целевое устройство",
+ "alarm-source": "Источник оповещения",
+ "actions": "Действия",
+ "action": "Действие",
+ "add-action": "Добавить действие",
+ "search-actions": "Поиск действий",
+ "action-source": "Источник действий",
+ "action-source-required": "Источник действий обязателен.",
+ "action-name": "Название",
+ "action-name-required": "Название действия обязательно.",
+ "action-name-not-unique": "Действие с таким именем уже существует.
Название должно быть уникально в рамках одного источника действий.",
+ "action-icon": "Иконка",
+ "action-type": "Тип",
+ "action-type-required": "Тип действий обязателен.",
+ "edit-action": "Редактировать действие",
+ "delete-action": "Удалить действие",
+ "delete-action-title": "Удалить действие виджета",
+ "delete-action-text": "Вы точно хотите удалить действие виджета '{{actionName}}'?"
},
"widget-type": {
"import": "Импортировать тип виджета",
@@ -1337,32 +1548,32 @@
"invalid-widget-type-file-error": "Не удалось импортировать виджет: неизвестная схема данных типа виджета."
},
"icon": {
- "icon": "Icon",
- "select-icon": "Select icon",
- "material-icons": "Material icons",
- "show-all": "Show all icons"
+ "icon": "Иконка",
+ "select-icon": "Выбрать иконку",
+ "material-icons": "Иконки в стиле Material",
+ "show-all": "Показать все иконки"
},
"custom": {
"widget-action": {
- "action-cell-button": "Action cell button",
- "row-click": "On row click",
- "marker-click": "On marker click",
- "tooltip-tag-action": "Tooltip tag action"
+ "action-cell-button": "Кнопка действия ячейки",
+ "row-click": "Действий при щелчке на строку",
+ "marker-click": "Действия при щелчке на указателе",
+ "tooltip-tag-action": "Действие при подсказке"
}
},
"language": {
"language": "Язык",
"locales": {
+ "de_DE": "Немецкий",
"en_US": "Английский",
- "fr_FR": "Французский",
"zh_CN": "Китайский",
"ko_KR": "Корейский",
"es_ES": "Испанский",
"it_IT": "Итальянский",
"ru_RU": "Русский",
- "ja_JA": "Японский",
- "tr_TR": "Турецкий"
+ "tr_TR": "Турецкий",
+ "fr_FR": "Французский",
+ "ja_JA": "Японский"
}
-
}
-}
+}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-tr_TR.json b/ui/src/app/locale/locale.constant-tr_TR.json
index 54176d83a9..3f2e37e0f7 100644
--- a/ui/src/app/locale/locale.constant-tr_TR.json
+++ b/ui/src/app/locale/locale.constant-tr_TR.json
@@ -1175,7 +1175,7 @@
"delete-rulechains-action-title": "{ count, plural, 1 {1 kuralı} other {# kuralı} } sil",
"delete-rulechains-text": "UYARI: Onaylandıktan sonra seçili tüm kurallar ve ilişkili tüm veriler geri yüklenemez şekilde silinecektir.",
"add-rulechain-text": "Yeni kural ekle",
- "no-rulechains-text":"Hiçbir kural bulunamadı",
+ "no-rulechains-text": "Hiçbir kural bulunamadı",
"rulechain-details": "Kural detayları",
"details": "Detaylar",
"events": "Olaylar",
@@ -1531,6 +1531,7 @@
"language": {
"language": "Dil",
"locales": {
+ "de_DE": "Almanca",
"fr_FR": "Fransızca",
"zh_CN": "Çince",
"en_US": "İngilizce",
diff --git a/ui/src/app/locale/locale.constant-zh_CN.json b/ui/src/app/locale/locale.constant-zh_CN.json
index bac1706c67..bacddc4763 100644
--- a/ui/src/app/locale/locale.constant-zh_CN.json
+++ b/ui/src/app/locale/locale.constant-zh_CN.json
@@ -916,7 +916,6 @@
"last-sync-time": "最后同步时间",
"not-available": "无法使用"
},
-
"export-extensions-configuration": "导出扩展配置",
"import-extensions-configuration": "导入扩展配置",
"import-extensions": "导入扩展",
@@ -1299,7 +1298,6 @@
"saveAs": "部件另存为",
"save-widget-type-as": "部件类型另存为",
"save-widget-type-as-text": "请输入新的部件标题或选择目标部件包",
-
"toggle-fullscreen": "切换全屏",
"run": "运行部件",
"title": "部件标题",
@@ -1437,8 +1435,9 @@
"language": {
"language": "语言",
"locales": {
+ "de_DE": "德语",
"en_US": "英语",
- "fr_FR": "法国",
+ "fr_FR": "法国",
"ko_KR": "韩语",
"zh_CN": "汉语",
"ru_RU": "俄语",
@@ -1448,4 +1447,4 @@
"tr_TR": "土耳其"
}
}
-}
+}
\ No newline at end of file
diff --git a/ui/src/app/widget/lib/google-map.js b/ui/src/app/widget/lib/google-map.js
index ccf931adf7..3f7be4fdbd 100644
--- a/ui/src/app/widget/lib/google-map.js
+++ b/ui/src/app/widget/lib/google-map.js
@@ -314,6 +314,48 @@ export default class TbGoogleMap {
polyline.setMap(null);
}
+
+ createPolygon(latLangs, settings) {
+ let polygon = new google.maps.Polygon({
+ map: this.map,
+ paths: latLangs,
+ strokeColor: settings.polygonStrokeColor,
+ strokeOpacity: settings.polygonStrokeColor,
+ fillColor: settings.polygonColor,
+ fillOpacity: settings.polygonOpacity,
+ strokeWeight: settings.polygonStrokeWeight
+ });
+ return polygon;
+ }
+ /* eslint-disable no-undef */
+
+ removePolygon (polygon) {
+ polygon.setMap(null);
+ }
+
+ /* eslint-disable no-undef,no-unused-vars */
+ updatePolygonColor (polygon, settings, color) {
+ let options = {
+ paths: polygon.getPaths(),
+ map: this.map,
+ strokeColor: color,
+ fillColor: color,
+ strokeWeight: settings.polygonStrokeWeight
+ }
+
+ }
+ /* eslint-disable no-undef ,no-unused-vars*/
+
+
+ getPolygonLatLngs(polygon) {
+ return polygon.getPaths().getArray();
+ }
+
+ setPolygonLatLngs(polygon, latLngs) {
+ polygon.setPaths(latLngs);
+ }
+
+
/* eslint-disable no-undef */
fitBounds(bounds) {
if (this.dontFitMapBounds && this.defaultZoomLevel) {
diff --git a/ui/src/app/widget/lib/image-map.js b/ui/src/app/widget/lib/image-map.js
index 74f5841850..3dbf5368de 100644
--- a/ui/src/app/widget/lib/image-map.js
+++ b/ui/src/app/widget/lib/image-map.js
@@ -369,6 +369,21 @@ export default class TbImageMap {
removePolyline(/*polyline*/) {
}
+ createPolygon(/*latLangs, settings*/) {
+ }
+
+ removePolygon(/*latLangs, settings*/) {
+ }
+
+ updatePolygonColor(/*latLangs, settings*/) {
+ }
+
+ getPolygonLatLngs(/*latLangs, settings*/) {
+ }
+
+ setPolygonLatLngs(/*latLangs, settings*/) {
+ }
+
fitBounds() {
}
diff --git a/ui/src/app/widget/lib/map-widget2.js b/ui/src/app/widget/lib/map-widget2.js
index 0ed70c50cc..fed9cb5de8 100644
--- a/ui/src/app/widget/lib/map-widget2.js
+++ b/ui/src/app/widget/lib/map-widget2.js
@@ -23,1064 +23,1207 @@ import TbTencentMap from './tencent-map';
import {processPattern, arraysEqual, toLabelValueMap, fillPattern, fillPatternWithActions} from './widget-utils';
export default class TbMapWidgetV2 {
- constructor(mapProvider, drawRoutes, ctx, useDynamicLocations, $element) {
- var tbMap = this;
- this.ctx = ctx;
- this.mapProvider = mapProvider;
- if (!$element) {
- $element = ctx.$container;
- }
- this.utils = ctx.$scope.$injector.get('utils');
- this.drawRoutes = drawRoutes;
- this.markers = [];
- if (this.drawRoutes) {
- this.polylines = [];
- }
-
- this.locationSettings = {};
-
- var settings = ctx.settings;
-
- this.callbacks = {};
- this.callbacks.onLocationClick = function(){};
-
- if (settings.defaultZoomLevel) {
- if (settings.defaultZoomLevel > 0 && settings.defaultZoomLevel < 21) {
- this.defaultZoomLevel = Math.floor(settings.defaultZoomLevel);
- }
- }
-
- this.dontFitMapBounds = settings.fitMapBounds === false;
-
- if (!useDynamicLocations) {
- this.subscription = this.ctx.defaultSubscription;
- }
-
- this.configureLocationsSettings();
-
- var minZoomLevel = this.drawRoutes ? 18 : 15;
-
- var initCallback = function() {
- tbMap.update();
- tbMap.resize();
- };
-
- this.ctx.$scope.onTooltipAction = function(event, actionName, dsIndex) {
- tbMap.onTooltipAction(event, actionName, dsIndex);
- };
- this.tooltipActionsMap = {};
- var descriptors = this.ctx.actionsApi.getActionDescriptors('tooltipAction');
- descriptors.forEach(function (descriptor) {
- tbMap.tooltipActionsMap[descriptor.name] = descriptor;
- });
-
- if (mapProvider === 'google-map') {
- this.map = new TbGoogleMap($element, this.utils, initCallback, this.defaultZoomLevel, this.dontFitMapBounds, minZoomLevel, settings.gmApiKey, settings.gmDefaultMapType);
- } else if (mapProvider === 'openstreet-map') {
- this.map = new TbOpenStreetMap($element, this.utils, initCallback, this.defaultZoomLevel, this.dontFitMapBounds, minZoomLevel, settings.mapProvider);
- } else if (mapProvider === 'image-map') {
- this.map = new TbImageMap(this.ctx, $element, this.utils, initCallback,
- settings.mapImageUrl,
- settings.posFunction,
- settings.imageEntityAlias,
- settings.imageUrlAttribute);
- } else if (mapProvider === 'tencent-map') {
- this.map = new TbTencentMap($element,this.utils, initCallback, this.defaultZoomLevel, this.dontFitMapBounds, minZoomLevel, settings.tmApiKey, settings.tmDefaultMapType);
- }
- }
-
- setCallbacks(callbacks) {
- Object.assign(this.callbacks, callbacks);
- }
-
- clearLocations() {
- if (this.locations) {
- var tbMap = this;
- this.locations.forEach(function(location) {
- if (location.marker) {
- tbMap.map.removeMarker(location.marker);
- }
- if (location.polyline) {
- tbMap.map.removePolyline(location.polyline);
- }
- });
- this.locations = null;
- this.markers = [];
- if (this.drawRoutes) {
- this.polylines = [];
- }
- }
- }
-
- setSubscription(subscription) {
- this.subscription = subscription;
- this.clearLocations();
- }
-
- configureLocationsSettings() {
-
- if (this.mapProvider == 'image-map') {
- this.locationSettings.latKeyName = this.ctx.settings.xPosKeyName || 'xPos';
- this.locationSettings.lngKeyName = this.ctx.settings.yPosKeyName || 'yPos';
- this.locationSettings.markerOffsetX = angular.isDefined(this.ctx.settings.markerOffsetX) ? this.ctx.settings.markerOffsetX : 0.5;
- this.locationSettings.markerOffsetY = angular.isDefined(this.ctx.settings.markerOffsetY) ? this.ctx.settings.markerOffsetY : 1;
- } else {
- this.locationSettings.latKeyName = this.ctx.settings.latKeyName || 'latitude';
- this.locationSettings.lngKeyName = this.ctx.settings.lngKeyName || 'longitude';
- }
-
- this.locationSettings.tooltipPattern = this.ctx.settings.tooltipPattern || "${entityName}
Latitude: ${"+this.locationSettings.latKeyName+":7}
Longitude: ${"+this.locationSettings.lngKeyName+":7}";
-
- this.locationSettings.showLabel = this.ctx.settings.showLabel !== false;
- this.locationSettings.displayTooltip = this.ctx.settings.showTooltip !== false;
- this.locationSettings.autocloseTooltip = this.ctx.settings.autocloseTooltip !== false;
- this.locationSettings.labelColor = this.ctx.widgetConfig.color || '#000000',
- this.locationSettings.label = this.ctx.settings.label || "${entityName}";
- this.locationSettings.color = this.ctx.settings.color ? tinycolor(this.ctx.settings.color).toHexString() : "#FE7569";
-
- this.locationSettings.useLabelFunction = this.ctx.settings.useLabelFunction === true;
- if (angular.isDefined(this.ctx.settings.labelFunction) && this.ctx.settings.labelFunction.length > 0) {
- try {
- this.locationSettings.labelFunction = new Function('data, dsData, dsIndex', this.ctx.settings.labelFunction);
- } catch (e) {
- this.locationSettings.labelFunction = null;
- }
- }
-
- this.locationSettings.useTooltipFunction = this.ctx.settings.useTooltipFunction === true;
- if (angular.isDefined(this.ctx.settings.tooltipFunction) && this.ctx.settings.tooltipFunction.length > 0) {
- try {
- this.locationSettings.tooltipFunction = new Function('data, dsData, dsIndex', this.ctx.settings.tooltipFunction);
- } catch (e) {
- this.locationSettings.tooltipFunction = null;
- }
- }
-
- this.locationSettings.useColorFunction = this.ctx.settings.useColorFunction === true;
- if (angular.isDefined(this.ctx.settings.colorFunction) && this.ctx.settings.colorFunction.length > 0) {
- try {
- this.locationSettings.colorFunction = new Function('data, dsData, dsIndex', this.ctx.settings.colorFunction);
- } catch (e) {
- this.locationSettings.colorFunction = null;
- }
- }
-
- this.locationSettings.useMarkerImageFunction = this.ctx.settings.useMarkerImageFunction === true;
- if (angular.isDefined(this.ctx.settings.markerImageFunction) && this.ctx.settings.markerImageFunction.length > 0) {
- try {
- this.locationSettings.markerImageFunction = new Function('data, images, dsData, dsIndex', this.ctx.settings.markerImageFunction);
- } catch (e) {
- this.locationSettings.markerImageFunction = null;
- }
- }
-
- this.locationSettings.markerImages = this.ctx.settings.markerImages || [];
-
- if (!this.locationSettings.useMarkerImageFunction &&
- angular.isDefined(this.ctx.settings.markerImage) &&
- this.ctx.settings.markerImage.length > 0) {
- this.locationSettings.useMarkerImage = true;
- var url = this.ctx.settings.markerImage;
- var size = this.ctx.settings.markerImageSize || 34;
- this.locationSettings.currentImage = {
- url: url,
- size: size
- };
- }
-
- if (this.drawRoutes) {
- this.locationSettings.strokeWeight = this.ctx.settings.strokeWeight || 2;
- this.locationSettings.strokeOpacity = this.ctx.settings.strokeOpacity || 1.0;
- }
- }
-
- onTooltipAction(event, actionName, dsIndex) {
- var descriptor = this.tooltipActionsMap[actionName];
- if (descriptor) {
- var datasource = this.subscription.datasources[dsIndex];
- var entityId = {};
- entityId.id = datasource.entityId;
- entityId.entityType = datasource.entityType;
- var entityName = datasource.entityName;
- this.ctx.actionsApi.handleWidgetAction(event, descriptor, entityId, entityName);
- }
- }
-
- update() {
-
- var tbMap = this;
-
- function updateLocationLabel(location, dataMap) {
- if (location.settings.showLabel) {
- if (location.settings.useLabelFunction && location.settings.labelFunction) {
- try {
- location.settings.label = location.settings.labelFunction(dataMap.dataMap, dataMap.dsDataMap, location.dsIndex);
- } catch (e) {
- location.settings.label = null;
- }
- if (location.settings.label) {
- var datasources = tbMap.subscription.datasources;
- location.settings.label = tbMap.utils.createLabelFromDatasource(datasources[location.dsIndex], location.settings.label);
- location.settings.labelReplaceInfo = processPattern(location.settings.label, datasources, location.dsIndex);
- location.settings.labelText = location.settings.label;
- }
- }
- if (location.settings.labelReplaceInfo.variables.length) {
- location.settings.labelText = fillPattern(location.settings.label,
- location.settings.labelReplaceInfo, tbMap.subscription.data);
- }
- tbMap.map.updateMarkerLabel(location.marker, location.settings);
- }
- }
-
-
- function calculateLocationColor(location, dataMap) {
- if (location.settings.useColorFunction && location.settings.colorFunction) {
- var color;
- try {
- color = location.settings.colorFunction(dataMap.dataMap, dataMap.dsDataMap, location.dsIndex);
- } catch (e) {/**/}
- if (!color) {
- color = '#FE7569';
- }
- return tinycolor(color).toHexString();
- } else {
- return location.settings.color;
- }
- }
-
- function updateLocationColor(location, color, image) {
- if (!location.settings.calculatedColor || location.settings.calculatedColor !== color) {
- if (!location.settings.useMarkerImage && !image) {
- tbMap.map.updateMarkerColor(location.marker, color);
- }
- if (location.polyline) {
- tbMap.map.updatePolylineColor(location.polyline, location.settings, color);
- }
- location.settings.calculatedColor = color;
- }
- }
-
- function calculateLocationMarkerImage(location, dataMap) {
- if (location.settings.useMarkerImageFunction && location.settings.markerImageFunction) {
- var image = null;
- try {
- image = location.settings.markerImageFunction(dataMap.dataMap, location.settings.markerImages, dataMap.dsDataMap, location.dsIndex);
- } catch (e) {
- image = null;
- }
- return image;
- } else {
- return null;
- }
- }
-
- function updateLocationMarkerIcon(location, image) {
- if (image && (!location.settings.currentImage || !angular.equals(location.settings.currentImage, image))) {
- location.settings.currentImage = image;
- tbMap.map.updateMarkerIcon(location.marker, location.settings);
- }
- }
-
- function updateLocationStyle(location, dataMap) {
- updateLocationLabel(location, dataMap);
- var color = calculateLocationColor(location, dataMap);
- var image = calculateLocationMarkerImage(location, dataMap);
- updateLocationColor(location, color, image);
- updateLocationMarkerIcon(location, image);
- }
-
- function createOrUpdateLocationMarker(location, markerLocation, dataMap) {
- var changed = false;
- if (!location.marker) {
- var image = calculateLocationMarkerImage(location, dataMap);
- if (image && (!location.settings.currentImage || !angular.equals(location.settings.currentImage, image))) {
- location.settings.currentImage = image;
- }
- location.marker = tbMap.map.createMarker(markerLocation, location.dsIndex, location.settings,
- function (event) {
- tbMap.callbacks.onLocationClick(location);
- locationRowClick(event, location);
- }, [location.dsIndex]);
- tbMap.markers.push(location.marker);
- changed = true;
- } else {
- var prevPosition = tbMap.map.getMarkerPosition(location.marker);
- if (!prevPosition.equals(markerLocation)) {
- tbMap.map.setMarkerPosition(location.marker, markerLocation);
- changed = true;
- }
- }
- return changed;
- }
-
- function locationRowClick($event, location) {
- var descriptors = tbMap.ctx.actionsApi.getActionDescriptors('markerClick');
- if (descriptors.length) {
- var datasource = tbMap.subscription.datasources[location.dsIndex];
- var entityId = {};
- entityId.id = datasource.entityId;
- entityId.entityType = datasource.entityType;
- var entityName = datasource.entityName;
- tbMap.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName);
- }
- }
-
- function updateLocation(location, data, dataMap) {
- var locationChanged = false;
- if (location.latIndex > -1 && location.lngIndex > -1) {
- var latData = data[location.latIndex].data;
- var lngData = data[location.lngIndex].data;
- var lat, lng, latLng;
- if (latData.length > 0 && lngData.length > 0) {
- if (tbMap.drawRoutes) {
- // Create or update route
- var latLngs = [];
- for (var i = 0; i < latData.length; i++) {
- lat = latData[i][1];
- lng = lngData[i][1];
- if (angular.isDefined(lat) && lat != null && angular.isDefined(lng) && lng != null) {
- latLng = tbMap.map.createLatLng(lat, lng);
- if (i == 0 || !latLngs[latLngs.length - 1].equals(latLng)) {
- latLngs.push(latLng);
- }
- }
- }
- if (latLngs.length > 0) {
- var markerLocation = latLngs[latLngs.length - 1];
- createOrUpdateLocationMarker(location, markerLocation, dataMap);
- }
- if (!location.polyline) {
- location.polyline = tbMap.map.createPolyline(latLngs, location.settings);
- tbMap.polylines.push(location.polyline);
- locationChanged = true;
- } else {
- var prevPath = tbMap.map.getPolylineLatLngs(location.polyline);
- if (!prevPath || !arraysEqual(prevPath, latLngs)) {
- tbMap.map.setPolylineLatLngs(location.polyline, latLngs);
- locationChanged = true;
- }
- }
- } else {
- // Create or update marker
- lat = latData[latData.length - 1][1];
- lng = lngData[lngData.length - 1][1];
- if (angular.isDefined(lat) && lat != null && angular.isDefined(lng) && lng != null) {
- latLng = tbMap.map.createLatLng(lat, lng);
- if (createOrUpdateLocationMarker(location, latLng, dataMap)) {
- locationChanged = true;
- }
- }
- }
- if (location.marker) {
- updateLocationStyle(location, dataMap);
- }
- }
- }
- return locationChanged;
- }
-
- function loadLocations(data, datasources) {
- var bounds = tbMap.map.createBounds();
- tbMap.locations = [];
- var dataMap = toLabelValueMap(data, datasources);
- var currentDatasource = null;
- var currentDatasourceIndex = -1;
- var latIndex = -1;
- var lngIndex = -1;
-
- for (var i=0;i -1 && lngIndex > -1) {
- var location = {
- latIndex: latIndex,
- lngIndex: lngIndex,
- dsIndex: currentDatasourceIndex,
- settings: angular.copy(tbMap.locationSettings)
- };
- if (location.settings.showLabel) {
- location.settings.label = tbMap.utils.createLabelFromDatasource(currentDatasource, location.settings.label);
- location.settings.labelReplaceInfo = processPattern(location.settings.label, datasources, currentDatasourceIndex);
- location.settings.labelText = location.settings.label;
- }
- if (location.settings.displayTooltip) {
- location.settings.tooltipPattern = tbMap.utils.createLabelFromDatasource(currentDatasource, location.settings.tooltipPattern);
- location.settings.tooltipReplaceInfo = processPattern(location.settings.tooltipPattern, datasources, currentDatasourceIndex);
- }
-
- tbMap.locations.push(location);
- updateLocation(location, data, dataMap);
- if (location.polyline) {
- tbMap.map.extendBounds(bounds, location.polyline);
- } else if (location.marker) {
- tbMap.map.extendBoundsWithMarker(bounds, location.marker);
- }
- latIndex = -1;
- lngIndex = -1;
- }
-
- }
- tbMap.map.fitBounds(bounds);
- }
-
- function updateLocations(data, datasources) {
- var locationsChanged = false;
- var bounds = tbMap.map.createBounds();
- var dataMap = toLabelValueMap(data, datasources);
- for (var p = 0; p < tbMap.locations.length; p++) {
- var location = tbMap.locations[p];
- locationsChanged |= updateLocation(location, data, dataMap);
- if (location.polyline) {
- tbMap.map.extendBounds(bounds, location.polyline);
- } else if (location.marker) {
- tbMap.map.extendBoundsWithMarker(bounds, location.marker);
- }
- }
- if (locationsChanged) {
- tbMap.map.fitBounds(bounds);
- }
- }
-
- function createTooltipContent(tooltip, data, datasources) {
- var content;
- var settings = tooltip.locationSettings;
- if (settings.useTooltipFunction && settings.tooltipFunction) {
- var dataMap = toLabelValueMap(data, datasources);
- try {
- settings.tooltipPattern = settings.tooltipFunction(dataMap.dataMap, dataMap.dsDataMap, tooltip.dsIndex);
- } catch (e) {
- settings.tooltipPattern = null;
- }
- if (settings.tooltipPattern) {
- settings.tooltipPattern = tbMap.utils.createLabelFromDatasource(datasources[tooltip.dsIndex], settings.tooltipPattern);
- settings.tooltipReplaceInfo = processPattern(settings.tooltipPattern, datasources, tooltip.dsIndex);
- }
- }
- content = fillPattern(settings.tooltipPattern, settings.tooltipReplaceInfo, data);
- return fillPatternWithActions(content, 'onTooltipAction', tooltip.markerArgs);
- }
-
- if (this.map && this.map.inited() && this.subscription) {
- if (this.subscription.data) {
- if (!this.locations) {
- loadLocations(this.subscription.data, this.subscription.datasources);
- } else {
- updateLocations(this.subscription.data, this.subscription.datasources);
- }
- var tooltips = this.map.getTooltips();
- for (var t = 0; t < tooltips.length; t++) {
- var tooltip = tooltips[t];
- var text = createTooltipContent(tooltip, this.subscription.data, this.subscription.datasources);
- tooltip.popup.setContent(text);
- }
- }
- }
- }
-
- resize() {
- if (this.map && this.map.inited()) {
- this.map.invalidateSize();
- if (this.locations && this.locations.length > 0) {
- var bounds = this.map.createBounds();
- for (var m = 0; m < this.markers.length; m++) {
- this.map.extendBoundsWithMarker(bounds, this.markers[m]);
- }
- if (this.polylines) {
- for (var p = 0; p < this.polylines.length; p++) {
- this.map.extendBounds(bounds, this.polylines[p]);
- }
- }
- this.map.fitBounds(bounds);
- }
- }
- }
-
- static settingsSchema(mapProvider, drawRoutes) {
- var schema;
- if (mapProvider === 'google-map') {
- schema = angular.copy(googleMapSettingsSchema);
- } else if (mapProvider === 'openstreet-map') {
- schema = angular.copy(openstreetMapSettingsSchema);
- } else if (mapProvider === 'image-map') {
- return imageMapSettingsSchema;
- } else if (mapProvider === 'tencent-map') {
- schema = angular.copy(tencentMapSettingsSchema);
- }
- angular.merge(schema.schema.properties, commonMapSettingsSchema.schema.properties);
- schema.schema.required = schema.schema.required.concat(commonMapSettingsSchema.schema.required);
- schema.form = schema.form.concat(commonMapSettingsSchema.form);
- if (drawRoutes) {
- angular.merge(schema.schema.properties, routeMapSettingsSchema.schema.properties);
- schema.schema.required = schema.schema.required.concat(routeMapSettingsSchema.schema.required);
- schema.form = schema.form.concat(routeMapSettingsSchema.form);
- }
- return schema;
- }
-
- static dataKeySettingsSchema(/*mapProvider*/) {
- return {};
- }
-
- static actionSources() {
- return {
- 'markerClick': {
- name: 'widget-action.marker-click',
- multiple: false
- },
- 'tooltipAction': {
- name: 'widget-action.tooltip-tag-action',
- multiple: true
- }
- };
- }
+
+ constructor(mapProvider, drawRoutes, ctx, useDynamicLocations, $element) {
+ var tbMap = this;
+ this.ctx = ctx;
+ this.mapProvider = mapProvider;
+ if (!$element) {
+ $element = ctx.$container;
+ }
+ this.utils = ctx.$scope.$injector.get('utils');
+ this.drawRoutes = drawRoutes;
+ this.markers = [];
+ this.polygons = [];
+ if (this.drawRoutes) {
+ this.polylines = [];
+ }
+
+ this.locationSettings = {};
+
+ var settings = ctx.settings;
+
+ this.callbacks = {};
+ this.callbacks.onLocationClick = function () {
+ };
+
+ if (settings.defaultZoomLevel) {
+ if (settings.defaultZoomLevel > 0 && settings.defaultZoomLevel < 21) {
+ this.defaultZoomLevel = Math.floor(settings.defaultZoomLevel);
+ }
+ }
+
+ this.dontFitMapBounds = settings.fitMapBounds === false;
+
+ if (!useDynamicLocations) {
+ this.subscription = this.ctx.defaultSubscription;
+ }
+
+ this.configureLocationsSettings();
+
+ var minZoomLevel = this.drawRoutes ? 18 : 15;
+
+
+ var initCallback = function () {
+ tbMap.update();
+ tbMap.resize();
+ };
+
+ this.ctx.$scope.onTooltipAction = function (event, actionName, dsIndex) {
+ tbMap.onTooltipAction(event, actionName, dsIndex);
+ };
+ this.tooltipActionsMap = {};
+ var descriptors = this.ctx.actionsApi.getActionDescriptors('tooltipAction');
+ descriptors.forEach(function (descriptor) {
+ tbMap.tooltipActionsMap[descriptor.name] = descriptor;
+ });
+
+ if (mapProvider === 'google-map') {
+ this.map = new TbGoogleMap($element, this.utils, initCallback, this.defaultZoomLevel, this.dontFitMapBounds, minZoomLevel, settings.gmApiKey, settings.gmDefaultMapType);
+ } else if (mapProvider === 'openstreet-map') {
+ this.map = new TbOpenStreetMap($element, this.utils, initCallback, this.defaultZoomLevel, this.dontFitMapBounds, minZoomLevel, settings.mapProvider);
+ } else if (mapProvider === 'image-map') {
+ this.map = new TbImageMap(this.ctx, $element, this.utils, initCallback,
+ settings.mapImageUrl,
+ settings.posFunction,
+ settings.imageEntityAlias,
+ settings.imageUrlAttribute);
+ } else if (mapProvider === 'tencent-map') {
+ this.map = new TbTencentMap($element, this.utils, initCallback, this.defaultZoomLevel, this.dontFitMapBounds, minZoomLevel, settings.tmApiKey, settings.tmDefaultMapType);
+ }
+
+
+ tbMap.initBounds = true;
+ }
+
+ setCallbacks(callbacks) {
+ Object.assign(this.callbacks, callbacks);
+ }
+
+ clearLocations() {
+ if (this.locations) {
+ var tbMap = this;
+ this.locations.forEach(function (location) {
+ if (location.marker) {
+ tbMap.map.removeMarker(location.marker);
+ }
+ if (location.polyline) {
+ tbMap.map.removePolyline(location.polyline);
+ }
+ if (location.polygon) {
+ tbMap.map.removePolygon(location.polygon);
+ }
+ });
+ this.locations = null;
+ this.markers = [];
+ this.polygons = [];
+ if (this.drawRoutes) {
+ this.polylines = [];
+ }
+ }
+ }
+
+ setSubscription(subscription) {
+ this.subscription = subscription;
+ this.clearLocations();
+ }
+
+ configureLocationsSettings() {
+
+ if (this.mapProvider == 'image-map') {
+ this.locationSettings.latKeyName = this.ctx.settings.xPosKeyName || 'xPos';
+ this.locationSettings.lngKeyName = this.ctx.settings.yPosKeyName || 'yPos';
+ this.locationSettings.markerOffsetX = angular.isDefined(this.ctx.settings.markerOffsetX) ? this.ctx.settings.markerOffsetX : 0.5;
+ this.locationSettings.markerOffsetY = angular.isDefined(this.ctx.settings.markerOffsetY) ? this.ctx.settings.markerOffsetY : 1;
+ } else {
+ this.locationSettings.latKeyName = this.ctx.settings.latKeyName || 'latitude';
+ this.locationSettings.lngKeyName = this.ctx.settings.lngKeyName || 'longitude';
+ this.locationSettings.polygonKeyName = this.ctx.settings.polygonKeyName || 'coordinates';
+ }
+
+ this.locationSettings.tooltipPattern = this.ctx.settings.tooltipPattern || "${entityName}
Latitude: ${" + this.locationSettings.latKeyName + ":7}
Longitude: ${" + this.locationSettings.lngKeyName + ":7}";
+
+ this.locationSettings.showLabel = this.ctx.settings.showLabel !== false;
+ this.locationSettings.displayTooltip = this.ctx.settings.showTooltip !== false;
+ this.locationSettings.autocloseTooltip = this.ctx.settings.autocloseTooltip !== false;
+ this.locationSettings.showPolygon = this.ctx.settings.showPolygon !== false;
+ this.locationSettings.labelColor = this.ctx.widgetConfig.color || '#000000';
+ this.locationSettings.label = this.ctx.settings.label || "${entityName}";
+ this.locationSettings.color = this.ctx.settings.color ? tinycolor(this.ctx.settings.color).toHexString() : "#FE7569";
+ this.locationSettings.polygonColor = this.ctx.settings.polygonColor ? tinycolor(this.ctx.settings.polygonColor).toHexString() : "#0000ff";
+ this.locationSettings.polygonStrokeColor = this.ctx.settings.polygonStrokeColor ? tinycolor(this.ctx.settings.polygonStrokeColor).toHexString() : "#fe0001";
+ this.locationSettings.polygonOpacity = angular.isDefined(this.ctx.settings.polygonOpacity) ? this.ctx.settings.polygonOpacity : 0.5;
+ this.locationSettings.polygonStrokeOpacity = angular.isDefined(this.ctx.settings.polygonStrokeOpacity) ? this.ctx.settings.polygonStrokeOpacity : 1;
+ this.locationSettings.polygonStrokeWeight = angular.isDefined(this.ctx.settings.polygonStrokeWeight) ? this.ctx.settings.polygonStrokeWeight : 1;
+
+ this.locationSettings.useLabelFunction = this.ctx.settings.useLabelFunction === true;
+ if (angular.isDefined(this.ctx.settings.labelFunction) && this.ctx.settings.labelFunction.length > 0) {
+ try {
+ this.locationSettings.labelFunction = new Function('data, dsData, dsIndex', this.ctx.settings.labelFunction);
+ } catch (e) {
+ this.locationSettings.labelFunction = null;
+ }
+ }
+
+ this.locationSettings.useTooltipFunction = this.ctx.settings.useTooltipFunction === true;
+ if (angular.isDefined(this.ctx.settings.tooltipFunction) && this.ctx.settings.tooltipFunction.length > 0) {
+ try {
+ this.locationSettings.tooltipFunction = new Function('data, dsData, dsIndex', this.ctx.settings.tooltipFunction);
+ } catch (e) {
+ this.locationSettings.tooltipFunction = null;
+ }
+ }
+
+ this.locationSettings.useColorFunction = this.ctx.settings.useColorFunction === true;
+ if (angular.isDefined(this.ctx.settings.colorFunction) && this.ctx.settings.colorFunction.length > 0) {
+ try {
+ this.locationSettings.colorFunction = new Function('data, dsData, dsIndex', this.ctx.settings.colorFunction);
+ } catch (e) {
+ this.locationSettings.colorFunction = null;
+ }
+ }
+ this.locationSettings.usePolygonColorFunction = this.ctx.settings.usePolygonColorFunction === true;
+ if (angular.isDefined(this.ctx.settings.polygonColorFunction) && this.ctx.settings.polygonColorFunction.length > 0) {
+ try {
+ this.locationSettings.polygonColorFunction = new Function('data, dsData, dsIndex', this.ctx.settings.polygonColorFunction);
+ } catch (e) {
+ this.locationSettings.polygonColorFunction = null;
+ }
+ }
+
+ this.locationSettings.useMarkerImageFunction = this.ctx.settings.useMarkerImageFunction === true;
+ if (angular.isDefined(this.ctx.settings.markerImageFunction) && this.ctx.settings.markerImageFunction.length > 0) {
+ try {
+ this.locationSettings.markerImageFunction = new Function('data, images, dsData, dsIndex', this.ctx.settings.markerImageFunction);
+ } catch (e) {
+ this.locationSettings.markerImageFunction = null;
+ }
+ }
+
+ this.locationSettings.markerImages = this.ctx.settings.markerImages || [];
+
+ if (!this.locationSettings.useMarkerImageFunction &&
+ angular.isDefined(this.ctx.settings.markerImage) &&
+ this.ctx.settings.markerImage.length > 0) {
+ this.locationSettings.useMarkerImage = true;
+ var url = this.ctx.settings.markerImage;
+ var size = this.ctx.settings.markerImageSize || 34;
+ this.locationSettings.currentImage = {
+ url: url,
+ size: size
+ };
+ }
+
+ if (this.drawRoutes) {
+ this.locationSettings.strokeWeight = this.ctx.settings.strokeWeight || 2;
+ this.locationSettings.strokeOpacity = this.ctx.settings.strokeOpacity || 1.0;
+ }
+ }
+
+ onTooltipAction(event, actionName, dsIndex) {
+ var descriptor = this.tooltipActionsMap[actionName];
+ if (descriptor) {
+ var datasource = this.subscription.datasources[dsIndex];
+ var entityId = {};
+ entityId.id = datasource.entityId;
+ entityId.entityType = datasource.entityType;
+ var entityName = datasource.entityName;
+ this.ctx.actionsApi.handleWidgetAction(event, descriptor, entityId, entityName);
+ }
+ }
+
+ update() {
+
+ var tbMap = this;
+
+
+ function updateLocationLabel(location, dataMap) {
+ if (location.settings.showLabel) {
+ if (location.settings.useLabelFunction && location.settings.labelFunction) {
+ try {
+ location.settings.label = location.settings.labelFunction(dataMap.dataMap, dataMap.dsDataMap, location.dsIndex);
+ } catch (e) {
+ location.settings.label = null;
+ }
+ if (location.settings.label) {
+ var datasources = tbMap.subscription.datasources;
+ location.settings.label = tbMap.utils.createLabelFromDatasource(datasources[location.dsIndex], location.settings.label);
+ location.settings.labelReplaceInfo = processPattern(location.settings.label, datasources, location.dsIndex);
+ location.settings.labelText = location.settings.label;
+ }
+ }
+ if (location.settings.labelReplaceInfo.variables.length) {
+ location.settings.labelText = fillPattern(location.settings.label,
+ location.settings.labelReplaceInfo, tbMap.subscription.data);
+ }
+ tbMap.map.updateMarkerLabel(location.marker, location.settings);
+ }
+ }
+
+
+ function calculateLocationColor(location, dataMap) {
+ if (location.settings.useColorFunction && location.settings.colorFunction) {
+ var color;
+ try {
+ color = location.settings.colorFunction(dataMap.dataMap, dataMap.dsDataMap, location.dsIndex);
+ } catch (e) {/**/
+ }
+ if (!color) {
+ color = '#FE7569';
+ }
+ return tinycolor(color).toHexString();
+ } else {
+ return location.settings.color;
+ }
+ }
+
+ function calculateLocationPolygonColor(location, dataMap) {
+ if (location.settings.usePolygonColorFunction && location.settings.polygonColorFunction) {
+ var color;
+ try {
+ color = location.settings.polygonColorFunction(dataMap.dataMap, dataMap.dsDataMap, location.dsIndex);
+ } catch (e) {/**/
+ }
+ if (!color) {
+ color = '#007800';
+ }
+ return tinycolor(color).toHexString();
+ } else {
+ return location.settings.polygonColor;
+ }
+ }
+
+ function updateLocationColor(location, color, image) {
+ if (!location.settings.calculatedColor || location.settings.calculatedColor !== color) {
+ if (!location.settings.useMarkerImage && !image) {
+ tbMap.map.updateMarkerColor(location.marker, color);
+ }
+ if (location.polyline) {
+ tbMap.map.updatePolylineColor(location.polyline, location.settings, color);
+ }
+ location.settings.calculatedColor = color;
+ }
+ }
+
+ function updateLocationPolygonColor(location, color) {
+ if (!location.settings.calculatedPolygonColor || location.settings.calculatedPolygonColor !== color) {
+ location.settings.calculatedPolygonColor = color;
+ if (location.polygon) {
+ tbMap.map.updatePolygonColor(location.polygon, location.settings, color);
+ }
+
+ }
+ }
+
+ function calculateLocationMarkerImage(location, dataMap) {
+ if (location.settings.useMarkerImageFunction && location.settings.markerImageFunction) {
+ var image = null;
+ try {
+ image = location.settings.markerImageFunction(dataMap.dataMap, location.settings.markerImages, dataMap.dsDataMap, location.dsIndex);
+ } catch (e) {
+ image = null;
+ }
+ return image;
+ } else {
+ return null;
+ }
+ }
+
+ function updateLocationMarkerIcon(location, image) {
+ if (image && (!location.settings.currentImage || !angular.equals(location.settings.currentImage, image))) {
+ location.settings.currentImage = image;
+ tbMap.map.updateMarkerIcon(location.marker, location.settings);
+ }
+ }
+
+ function updateLocationStyle(location, dataMap) {
+ updateLocationLabel(location, dataMap);
+ var color = calculateLocationColor(location, dataMap);
+ var polygonColor = calculateLocationPolygonColor(location, dataMap);
+ var image = calculateLocationMarkerImage(location, dataMap);
+ updateLocationColor(location, color, image);
+ if (location.settings.usePolygonColorFunction) updateLocationPolygonColor(location, polygonColor);
+ updateLocationMarkerIcon(location, image);
+ }
+
+ function createOrUpdateLocationMarker(location, markerLocation, dataMap) {
+ var changed = false;
+ if (!location.marker) {
+ var image = calculateLocationMarkerImage(location, dataMap);
+ if (image && (!location.settings.currentImage || !angular.equals(location.settings.currentImage, image))) {
+ location.settings.currentImage = image;
+ }
+ location.marker = tbMap.map.createMarker(markerLocation, location.dsIndex, location.settings,
+ function (event) {
+ tbMap.callbacks.onLocationClick(location);
+ locationRowClick(event, location);
+ }, [location.dsIndex]);
+ tbMap.markers.push(location.marker);
+ changed = true;
+ } else {
+ var prevPosition = tbMap.map.getMarkerPosition(location.marker);
+ if (!prevPosition.equals(markerLocation)) {
+ tbMap.map.setMarkerPosition(location.marker, markerLocation);
+ changed = true;
+ }
+ }
+ return changed;
+ }
+
+ function locationRowClick($event, location) {
+ var descriptors = tbMap.ctx.actionsApi.getActionDescriptors('markerClick');
+ if (descriptors.length) {
+ var datasource = tbMap.subscription.datasources[location.dsIndex];
+ var entityId = {};
+ entityId.id = datasource.entityId;
+ entityId.entityType = datasource.entityType;
+ var entityName = datasource.entityName;
+ tbMap.ctx.actionsApi.handleWidgetAction($event, descriptors[0], entityId, entityName);
+ }
+ }
+
+ function updateLocation(location, data, dataMap) {
+ var locationChanged = false;
+ if (location.latIndex > -1 && location.lngIndex > -1) {
+ var latData = data[location.latIndex].data;
+ var lngData = data[location.lngIndex].data;
+ var lat, lng, latLng;
+ if (latData.length > 0 && lngData.length > 0) {
+ if (tbMap.drawRoutes) {
+ // Create or update route
+ var latLngs = [];
+ for (var i = 0; i < latData.length; i++) {
+ lat = latData[i][1];
+ lng = lngData[i][1];
+ if (angular.isDefined(lat) && lat != null && angular.isDefined(lng) && lng != null) {
+ latLng = tbMap.map.createLatLng(lat, lng);
+ if (i == 0 || !latLngs[latLngs.length - 1].equals(latLng)) {
+ latLngs.push(latLng);
+ }
+ }
+ }
+ if (latLngs.length > 0) {
+ var markerLocation = latLngs[latLngs.length - 1];
+ createOrUpdateLocationMarker(location, markerLocation, dataMap);
+ }
+ if (!location.polyline) {
+ location.polyline = tbMap.map.createPolyline(latLngs, location.settings);
+ tbMap.polylines.push(location.polyline);
+ locationChanged = true;
+ } else {
+ var prevPath = tbMap.map.getPolylineLatLngs(location.polyline);
+ if (!prevPath || !arraysEqual(prevPath, latLngs)) {
+ tbMap.map.setPolylineLatLngs(location.polyline, latLngs);
+ locationChanged = true;
+ }
+ }
+ } else {
+ // Create or update marker
+ lat = latData[latData.length - 1][1];
+ lng = lngData[lngData.length - 1][1];
+ if (angular.isDefined(lat) && lat != null && angular.isDefined(lng) && lng != null) {
+ latLng = tbMap.map.createLatLng(lat, lng);
+ if (createOrUpdateLocationMarker(location, latLng, dataMap)) {
+ locationChanged = true;
+ }
+ }
+
+
+ if (location.settings.showPolygon && dataMap.dsDataMap[location.dsIndex][location.settings.polygonKeyName] !== null) {
+ let polygonLatLngsRaw = angular.fromJson(dataMap.dsDataMap[location.dsIndex][location.settings.polygonKeyName]);
+ let polygonLatLngs = !polygonLatLngsRaw || mapPolygonArray(polygonLatLngsRaw);
+ if (!location.polygon && polygonLatLngs.length > 0) {
+ location.polygon = tbMap.map.createPolygon(polygonLatLngs, location.settings);
+ tbMap.polygons.push(location.polygon);
+ } else if (polygonLatLngs.length > 0) {
+ let prevPolygonArr = tbMap.map.getPolygonLatLngs(location.polygon);
+ if (!prevPolygonArr || !arraysEqual(prevPolygonArr, polygonLatLngs)) {
+ tbMap.map.setPolygonLatLngs(location.polygon, polygonLatLngs);
+ }
+ }
+ }
+ }
+ if (location.marker) {
+ updateLocationStyle(location, dataMap);
+ }
+ }
+ }
+ return locationChanged;
+ }
+
+ function loadLocations(data, datasources) {
+ var bounds = tbMap.map.createBounds();
+ tbMap.locations = [];
+ var dataMap = toLabelValueMap(data, datasources);
+ var currentDatasource = null;
+ var currentDatasourceIndex = -1;
+ var latIndex = -1;
+ var lngIndex = -1;
+
+ for (var i = 0; i < data.length; i++) {
+ var dataKeyData = data[i];
+ var dataKey = dataKeyData.dataKey;
+ if (dataKeyData.datasource != currentDatasource) {
+ currentDatasource = dataKeyData.datasource;
+ currentDatasourceIndex++;
+ latIndex = -1;
+ lngIndex = -1;
+ }
+ var nameToCheck;
+ if (dataKey.locationAttrName) {
+ nameToCheck = dataKey.locationAttrName;
+ } else {
+ nameToCheck = dataKey.label;
+ }
+ if (nameToCheck === tbMap.locationSettings.latKeyName) {
+ latIndex = i;
+ } else if (nameToCheck === tbMap.locationSettings.lngKeyName) {
+ lngIndex = i;
+ }
+
+ if (latIndex > -1 && lngIndex > -1) {
+ var location = {
+ latIndex: latIndex,
+ lngIndex: lngIndex,
+ dsIndex: currentDatasourceIndex,
+ settings: angular.copy(tbMap.locationSettings)
+ };
+ if (location.settings.showLabel) {
+ location.settings.label = tbMap.utils.createLabelFromDatasource(currentDatasource, location.settings.label);
+ location.settings.labelReplaceInfo = processPattern(location.settings.label, datasources, currentDatasourceIndex);
+ location.settings.labelText = location.settings.label;
+ }
+ if (location.settings.displayTooltip) {
+ location.settings.tooltipPattern = tbMap.utils.createLabelFromDatasource(currentDatasource, location.settings.tooltipPattern);
+ location.settings.tooltipReplaceInfo = processPattern(location.settings.tooltipPattern, datasources, currentDatasourceIndex);
+ }
+ tbMap.locations.push(location);
+ updateLocation(location, data, dataMap);
+ if (location.polyline) {
+ tbMap.map.extendBounds(bounds, location.polyline);
+ } else if (location.marker) {
+ tbMap.map.extendBoundsWithMarker(bounds, location.marker);
+ }
+ latIndex = -1;
+ lngIndex = -1;
+ }
+
+ }
+ tbMap.map.fitBounds(bounds);
+ }
+
+ function mapPolygonArray (rawArray) {
+ let latLngArray = rawArray.map(function (el) {
+ if (el.length === 2) {
+ return tbMap.map.createLatLng(el[0], el[1]);
+ } else if (el.length > 2) {
+ return mapPolygonArray(el);
+ } else {
+ return tbMap.map.createLatLng(false);
+ }
+ });
+ return latLngArray;
+ }
+
+ function updateLocations(data, datasources) {
+ var locationsChanged = false;
+ var bounds = tbMap.map.createBounds();
+ var dataMap = toLabelValueMap(data, datasources);
+ for (var p = 0; p < tbMap.locations.length; p++) {
+ var location = tbMap.locations[p];
+ locationsChanged |= updateLocation(location, data, dataMap);
+ if (location.polyline) {
+ tbMap.map.extendBounds(bounds, location.polyline);
+ } else if (location.marker) {
+ tbMap.map.extendBoundsWithMarker(bounds, location.marker);
+ }
+ }
+ if (locationsChanged && tbMap.initBounds) {
+ tbMap.initBounds = !datasources.every(
+ function (ds) {
+ return ds.dataReceived === true;
+ });
+ tbMap.map.fitBounds(bounds);
+ }
+ }
+
+ function createTooltipContent(tooltip, data, datasources) {
+ var content;
+ var settings = tooltip.locationSettings;
+ if (settings.useTooltipFunction && settings.tooltipFunction) {
+ var dataMap = toLabelValueMap(data, datasources);
+ try {
+ settings.tooltipPattern = settings.tooltipFunction(dataMap.dataMap, dataMap.dsDataMap, tooltip.dsIndex);
+ } catch (e) {
+ settings.tooltipPattern = null;
+ }
+ if (settings.tooltipPattern) {
+ settings.tooltipPattern = tbMap.utils.createLabelFromDatasource(datasources[tooltip.dsIndex], settings.tooltipPattern);
+ settings.tooltipReplaceInfo = processPattern(settings.tooltipPattern, datasources, tooltip.dsIndex);
+ }
+ }
+ content = fillPattern(settings.tooltipPattern, settings.tooltipReplaceInfo, data);
+ return fillPatternWithActions(content, 'onTooltipAction', tooltip.markerArgs);
+ }
+
+ if (this.map && this.map.inited() && this.subscription) {
+ if (this.subscription.data) {
+ if (!this.locations) {
+ loadLocations(this.subscription.data, this.subscription.datasources);
+ } else {
+ updateLocations(this.subscription.data, this.subscription.datasources);
+ }
+ var tooltips = this.map.getTooltips();
+ for (var t = 0; t < tooltips.length; t++) {
+ var tooltip = tooltips[t];
+ var text = createTooltipContent(tooltip, this.subscription.data, this.subscription.datasources);
+ tooltip.popup.setContent(text);
+ }
+ }
+ }
+
+ }
+
+ resize() {
+ if (this.map && this.map.inited()) {
+ this.map.invalidateSize();
+ if (this.locations && this.locations.length > 0) {
+ var bounds = this.map.createBounds();
+ for (var m = 0; m < this.markers.length; m++) {
+ this.map.extendBoundsWithMarker(bounds, this.markers[m]);
+ }
+ if (this.polylines) {
+ for (var p = 0; p < this.polylines.length; p++) {
+ this.map.extendBounds(bounds, this.polylines[p]);
+ }
+ }
+ this.map.fitBounds(bounds);
+ }
+ }
+ }
+
+ static settingsSchema(mapProvider, drawRoutes) {
+ var schema;
+ if (mapProvider === 'google-map') {
+ schema = angular.copy(googleMapSettingsSchema);
+ } else if (mapProvider === 'openstreet-map') {
+ schema = angular.copy(openstreetMapSettingsSchema);
+ } else if (mapProvider === 'image-map') {
+ return imageMapSettingsSchema;
+ } else if (mapProvider === 'tencent-map') {
+ schema = angular.copy(tencentMapSettingsSchema);
+ }
+ angular.merge(schema.schema.properties, commonMapSettingsSchema.schema.properties);
+ schema.schema.required = schema.schema.required.concat(commonMapSettingsSchema.schema.required);
+ schema.form = schema.form.concat(commonMapSettingsSchema.form);
+ if (drawRoutes) {
+ angular.merge(schema.schema.properties, routeMapSettingsSchema.schema.properties);
+ schema.schema.required = schema.schema.required.concat(routeMapSettingsSchema.schema.required);
+ schema.form = schema.form.concat(routeMapSettingsSchema.form);
+ }
+ return schema;
+ }
+
+ static dataKeySettingsSchema(/*mapProvider*/) {
+ return {};
+ }
+
+ static actionSources() {
+ return {
+ 'markerClick': {
+ name: 'widget-action.marker-click',
+ multiple: false
+ },
+ 'tooltipAction': {
+ name: 'widget-action.tooltip-tag-action',
+ multiple: true
+ }
+ };
+ }
}
const googleMapSettingsSchema =
- {
- "schema":{
- "title":"Google Map Configuration",
- "type":"object",
- "properties":{
- "gmApiKey":{
- "title":"Google Maps API Key",
- "type":"string"
- },
- "gmDefaultMapType":{
- "title":"Default map type",
- "type":"string",
- "default":"roadmap"
- }
- },
- "required":[
- "gmApiKey"
- ]
- },
- "form":[
- "gmApiKey",
- {
- "key":"gmDefaultMapType",
- "type":"rc-select",
- "multiple":false,
- "items":[
- {
- "value":"roadmap",
- "label":"Roadmap"
- },
- {
- "value":"satellite",
- "label":"Satellite"
- },
- {
- "value":"hybrid",
- "label":"Hybrid"
- },
- {
- "value":"terrain",
- "label":"Terrain"
- }
- ]
- }
- ]
- };
-
+ {
+ "schema": {
+ "title": "Google Map Configuration",
+ "type": "object",
+ "properties": {
+ "gmApiKey": {
+ "title": "Google Maps API Key",
+ "type": "string"
+ },
+ "gmDefaultMapType": {
+ "title": "Default map type",
+ "type": "string",
+ "default": "roadmap"
+ }
+ },
+ "required": [
+ "gmApiKey"
+ ]
+ },
+ "form": [
+ "gmApiKey",
+ {
+ "key": "gmDefaultMapType",
+ "type": "rc-select",
+ "multiple": false,
+ "items": [
+ {
+ "value": "roadmap",
+ "label": "Roadmap"
+ },
+ {
+ "value": "satellite",
+ "label": "Satellite"
+ },
+ {
+ "value": "hybrid",
+ "label": "Hybrid"
+ },
+ {
+ "value": "terrain",
+ "label": "Terrain"
+ }
+ ]
+ }
+ ]
+ };
+
const tencentMapSettingsSchema =
- {
- "schema":{
- "title":"Tencent Map Configuration",
- "type":"object",
- "properties":{
- "tmApiKey":{
- "title":"Tencent Maps API Key",
- "type":"string"
- },
- "tmDefaultMapType":{
- "title":"Default map type",
- "type":"string",
- "default":"roadmap"
- }
- },
- "required":[
- "tmApiKey"
- ]
- },
- "form":[
- "tmApiKey",
- {
- "key":"tmDefaultMapType",
- "type":"rc-select",
- "multiple":false,
- "items":[
- {
- "value":"roadmap",
- "label":"Roadmap"
- },
- {
- "value":"satellite",
- "label":"Satellite"
- },
- {
- "value":"hybrid",
- "label":"Hybrid"
- },
- ]
- }
- ]
- };
-
+ {
+ "schema": {
+ "title": "Tencent Map Configuration",
+ "type": "object",
+ "properties": {
+ "tmApiKey": {
+ "title": "Tencent Maps API Key",
+ "type": "string"
+ },
+ "tmDefaultMapType": {
+ "title": "Default map type",
+ "type": "string",
+ "default": "roadmap"
+ }
+ },
+ "required": [
+ "tmApiKey"
+ ]
+ },
+ "form": [
+ "tmApiKey",
+ {
+ "key": "tmDefaultMapType",
+ "type": "rc-select",
+ "multiple": false,
+ "items": [
+ {
+ "value": "roadmap",
+ "label": "Roadmap"
+ },
+ {
+ "value": "satellite",
+ "label": "Satellite"
+ },
+ {
+ "value": "hybrid",
+ "label": "Hybrid"
+ },
+ ]
+ }
+ ]
+ };
+
const openstreetMapSettingsSchema =
- {
- "schema":{
- "title":"Openstreet Map Configuration",
- "type":"object",
- "properties":{
- "mapProvider":{
- "title":"Map provider",
- "type":"string",
- "default":"OpenStreetMap.Mapnik"
- }
- },
- "required":[
- ]
- },
- "form":[
- {
- "key":"mapProvider",
- "type":"rc-select",
- "multiple":false,
- "items":[
- {
- "value":"OpenStreetMap.Mapnik",
- "label":"OpenStreetMap.Mapnik (Default)"
- },
- {
- "value":"OpenStreetMap.BlackAndWhite",
- "label":"OpenStreetMap.BlackAndWhite"
- },
- {
- "value":"OpenStreetMap.HOT",
- "label":"OpenStreetMap.HOT"
- },
- {
- "value":"Esri.WorldStreetMap",
- "label":"Esri.WorldStreetMap"
- },
- {
- "value":"Esri.WorldTopoMap",
- "label":"Esri.WorldTopoMap"
- },
- {
- "value":"CartoDB.Positron",
- "label":"CartoDB.Positron"
- },
- {
- "value":"CartoDB.DarkMatter",
- "label":"CartoDB.DarkMatter"
- }
- ]
- }
- ]
- };
+ {
+ "schema": {
+ "title": "Openstreet Map Configuration",
+ "type": "object",
+ "properties": {
+ "mapProvider": {
+ "title": "Map provider",
+ "type": "string",
+ "default": "OpenStreetMap.Mapnik"
+ }
+ },
+ "required": []
+ },
+ "form": [
+ {
+ "key": "mapProvider",
+ "type": "rc-select",
+ "multiple": false,
+ "items": [
+ {
+ "value": "OpenStreetMap.Mapnik",
+ "label": "OpenStreetMap.Mapnik (Default)"
+ },
+ {
+ "value": "OpenStreetMap.BlackAndWhite",
+ "label": "OpenStreetMap.BlackAndWhite"
+ },
+ {
+ "value": "OpenStreetMap.HOT",
+ "label": "OpenStreetMap.HOT"
+ },
+ {
+ "value": "Esri.WorldStreetMap",
+ "label": "Esri.WorldStreetMap"
+ },
+ {
+ "value": "Esri.WorldTopoMap",
+ "label": "Esri.WorldTopoMap"
+ },
+ {
+ "value": "CartoDB.Positron",
+ "label": "CartoDB.Positron"
+ },
+ {
+ "value": "CartoDB.DarkMatter",
+ "label": "CartoDB.DarkMatter"
+ }
+ ]
+ }
+ ]
+ };
const commonMapSettingsSchema =
- {
- "schema":{
- "title":"Map Configuration",
- "type":"object",
- "properties":{
- "defaultZoomLevel":{
- "title":"Default map zoom level (1 - 20)",
- "type":"number"
- },
- "fitMapBounds":{
- "title":"Fit map bounds to cover all markers",
- "type":"boolean",
- "default":true
- },
- "latKeyName":{
- "title":"Latitude key name",
- "type":"string",
- "default":"latitude"
- },
- "lngKeyName":{
- "title":"Longitude key name",
- "type":"string",
- "default":"longitude"
- },
- "showLabel":{
- "title":"Show label",
- "type":"boolean",
- "default":true
- },
- "label":{
- "title":"Label (pattern examples: '${entityName}', '${entityName}: (Text ${keyName} units.)' )",
- "type":"string",
- "default":"${entityName}"
- },
- "useLabelFunction": {
- "title":"Use label function",
- "type":"boolean",
- "default":false
- },
- "labelFunction":{
- "title":"Label function: f(data, dsData, dsIndex)",
- "type":"string"
- },
- "showTooltip": {
- "title": "Show tooltip",
- "type":"boolean",
- "default":true
- },
- "autocloseTooltip": {
- "title": "Auto-close tooltips",
- "type":"boolean",
- "default":true
- },
- "tooltipPattern":{
- "title":"Tooltip (for ex. 'Text ${keyName} units.' or Link text')",
- "type":"string",
- "default":"${entityName}
Latitude: ${latitude:7}
Longitude: ${longitude:7}"
- },
- "useTooltipFunction": {
- "title":"Use tooltip function",
- "type":"boolean",
- "default":false
- },
- "tooltipFunction":{
- "title":"Tooltip function: f(data, dsData, dsIndex)",
- "type":"string"
- },
- "color":{
- "title":"Color",
- "type":"string"
- },
- "useColorFunction":{
- "title":"Use color function",
- "type":"boolean",
- "default":false
- },
- "colorFunction":{
- "title":"Color function: f(data, dsData, dsIndex)",
- "type":"string"
- },
- "markerImage":{
- "title":"Custom marker image",
- "type":"string"
- },
- "markerImageSize":{
- "title":"Custom marker image size (px)",
- "type":"number",
- "default":34
- },
- "useMarkerImageFunction":{
- "title":"Use marker image function",
- "type":"boolean",
- "default":false
- },
- "markerImageFunction":{
- "title":"Marker image function: f(data, images, dsData, dsIndex)",
- "type":"string"
- },
- "markerImages":{
- "title":"Marker images",
- "type":"array",
- "items":{
- "title":"Marker image",
- "type":"string"
- }
- }
- },
- "required":[]
- },
- "form":[
- "defaultZoomLevel",
- "fitMapBounds",
- "latKeyName",
- "lngKeyName",
- "showLabel",
- "label",
- "useLabelFunction",
- {
- "key":"labelFunction",
- "type":"javascript"
- },
- "showTooltip",
- "autocloseTooltip",
- {
- "key": "tooltipPattern",
- "type": "textarea"
- },
- "useTooltipFunction",
- {
- "key":"tooltipFunction",
- "type":"javascript"
- },
- {
- "key":"color",
- "type":"color"
- },
- "useColorFunction",
- {
- "key":"colorFunction",
- "type":"javascript"
- },
- {
- "key":"markerImage",
- "type":"image"
- },
- "markerImageSize",
- "useMarkerImageFunction",
- {
- "key":"markerImageFunction",
- "type":"javascript"
- },
- {
- "key":"markerImages",
- "items":[
- {
- "key":"markerImages[]",
- "type":"image"
- }
- ]
- }
- ]
-};
+ {
+ "schema": {
+ "title": "Map Configuration",
+ "type": "object",
+ "properties": {
+ "defaultZoomLevel": {
+ "title": "Default map zoom level (1 - 20)",
+ "type": "number"
+ },
+ "fitMapBounds": {
+ "title": "Fit map bounds to cover all markers",
+ "type": "boolean",
+ "default": true
+ },
+ "latKeyName": {
+ "title": "Latitude key name",
+ "type": "string",
+ "default": "latitude"
+ },
+ "lngKeyName": {
+ "title": "Longitude key name",
+ "type": "string",
+ "default": "longitude"
+ },
+ "showLabel": {
+ "title": "Show label",
+ "type": "boolean",
+ "default": true
+ },
+ "label": {
+ "title": "Label (pattern examples: '${entityName}', '${entityName}: (Text ${keyName} units.)' )",
+ "type": "string",
+ "default": "${entityName}"
+ },
+ "useLabelFunction": {
+ "title": "Use label function",
+ "type": "boolean",
+ "default": false
+ },
+ "labelFunction": {
+ "title": "Label function: f(data, dsData, dsIndex)",
+ "type": "string"
+ },
+ "showTooltip": {
+ "title": "Show tooltip",
+ "type": "boolean",
+ "default": true
+ },
+ "autocloseTooltip": {
+ "title": "Auto-close tooltips",
+ "type": "boolean",
+ "default": true
+ },
+ "tooltipPattern": {
+ "title": "Tooltip (for ex. 'Text ${keyName} units.' or Link text')",
+ "type": "string",
+ "default": "${entityName}
Latitude: ${latitude:7}
Longitude: ${longitude:7}"
+ },
+ "useTooltipFunction": {
+ "title": "Use tooltip function",
+ "type": "boolean",
+ "default": false
+ },
+ "tooltipFunction": {
+ "title": "Tooltip function: f(data, dsData, dsIndex)",
+ "type": "string"
+ },
+ "color": {
+ "title": "Color",
+ "type": "string"
+ },
+ "useColorFunction": {
+ "title": "Use color function",
+ "type": "boolean",
+ "default": false
+ },
+ "colorFunction": {
+ "title": "Color function: f(data, dsData, dsIndex)",
+ "type": "string"
+ },
+ "showPolygon": {
+ "title": "Show polygon",
+ "type": "boolean",
+ "default": false
+ },
+ "polygonKeyName": {
+ "title": "Polygon key name",
+ "type": "string",
+ "default": "coordinates"
+ },
+ "polygonColor": {
+ "title": "Polygon color",
+ "type": "string"
+ },
+ "polygonOpacity": {
+ "title": "Polygon opacity",
+ "type": "number",
+ "default": 0.5
+ },
+ "polygonStrokeColor": {
+ "title": "Stroke color",
+ "type": "string"
+ },
+ "polygonStrokeOpacity": {
+ "title": "Stroke opacity",
+ "type": "number",
+ "default": 1
+ },
+ "polygonStrokeWeight": {
+ "title": "Stroke weight",
+ "type": "number",
+ "default": 1
+ },
+ "usePolygonColorFunction": {
+ "title": "Use polygon color function",
+ "type": "boolean",
+ "default": false
+ },
+ "polygonColorFunction": {
+ "title": "Polygon Color function: f(data, dsData, dsIndex)",
+ "type": "string"
+ },
+ "markerImage": {
+ "title": "Custom marker image",
+ "type": "string"
+ },
+ "markerImageSize": {
+ "title": "Custom marker image size (px)",
+ "type": "number",
+ "default": 34
+ },
+ "useMarkerImageFunction": {
+ "title": "Use marker image function",
+ "type": "boolean",
+ "default": false
+ },
+ "markerImageFunction": {
+ "title": "Marker image function: f(data, images, dsData, dsIndex)",
+ "type": "string"
+ },
+ "markerImages": {
+ "title": "Marker images",
+ "type": "array",
+ "items": {
+ "title": "Marker image",
+ "type": "string"
+ }
+ }
+ },
+ "required": []
+ },
+ "form": [
+ "defaultZoomLevel",
+ "fitMapBounds",
+ "latKeyName",
+ "lngKeyName",
+ "showLabel",
+ "label",
+ "useLabelFunction",
+ {
+ "key": "labelFunction",
+ "type": "javascript"
+ },
+ "showTooltip",
+ "autocloseTooltip",
+ {
+ "key": "tooltipPattern",
+ "type": "textarea"
+ },
+ "useTooltipFunction",
+ {
+ "key": "tooltipFunction",
+ "type": "javascript"
+ },
+ {
+ "key": "color",
+ "type": "color"
+ },
+ "useColorFunction",
+ {
+ "key": "colorFunction",
+ "type": "javascript"
+ }, "showPolygon", "polygonKeyName",
+ {
+ "key": "polygonColor",
+ "type": "color"
+ },
+ "polygonOpacity",
+ {
+ "key": "polygonStrokeColor",
+ "type": "color"
+ },
+ "polygonStrokeOpacity","polygonStrokeWeight","usePolygonColorFunction",
+ {
+ "key": "polygonColorFunction",
+ "type": "javascript"
+ },
+ {
+ "key": "markerImage",
+ "type": "image"
+ },
+ "markerImageSize",
+ "useMarkerImageFunction",
+ {
+ "key": "markerImageFunction",
+ "type": "javascript"
+ },
+ {
+ "key": "markerImages",
+ "items": [
+ {
+ "key": "markerImages[]",
+ "type": "image"
+ }
+ ]
+ }
+ ]
+ };
const routeMapSettingsSchema =
- {
- "schema":{
- "title":"Route Map Configuration",
- "type":"object",
- "properties":{
- "strokeWeight": {
- "title": "Stroke weight",
- "type": "number",
- "default": 2
- },
- "strokeOpacity": {
- "title": "Stroke opacity",
- "type": "number",
- "default": 1.0
- }
- },
- "required":[
- ]
- },
- "form":[
- "strokeWeight",
- "strokeOpacity"
- ]
- };
+ {
+ "schema": {
+ "title": "Route Map Configuration",
+ "type": "object",
+ "properties": {
+ "strokeWeight": {
+ "title": "Stroke weight",
+ "type": "number",
+ "default": 2
+ },
+ "strokeOpacity": {
+ "title": "Stroke opacity",
+ "type": "number",
+ "default": 1.0
+ }
+ },
+ "required": []
+ },
+ "form": [
+ "strokeWeight",
+ "strokeOpacity"
+ ]
+ };
const imageMapSettingsSchema =
-{
- "schema":{
- "title":"Image Map Configuration",
- "type":"object",
- "properties":{
- "mapImageUrl": {
- "title": "Image map background",
- "type": "string",
- "default": "data:image/svg+xml;base64,PHN2ZyBpZD0ic3ZnMiIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTAwIiB3aWR0aD0iMTAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgdmlld0JveD0iMCAwIDEwMCAxMDAiPgogPGcgaWQ9ImxheWVyMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtOTUyLjM2KSI+CiAgPHJlY3QgaWQ9InJlY3Q0Njg0IiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBoZWlnaHQ9Ijk5LjAxIiB3aWR0aD0iOTkuMDEiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiB5PSI5NTIuODYiIHg9Ii40OTUwNSIgc3Ryb2tlLXdpZHRoPSIuOTkwMTAiIGZpbGw9IiNlZWUiLz4KICA8dGV4dCBpZD0idGV4dDQ2ODYiIHN0eWxlPSJ3b3JkLXNwYWNpbmc6MHB4O2xldHRlci1zcGFjaW5nOjBweDt0ZXh0LWFuY2hvcjptaWRkbGU7dGV4dC1hbGlnbjpjZW50ZXIiIGZvbnQtd2VpZ2h0PSJib2xkIiB4bWw6c3BhY2U9InByZXNlcnZlIiBmb250LXNpemU9IjEwcHgiIGxpbmUtaGVpZ2h0PSIxMjUlIiB5PSI5NzAuNzI4MDkiIHg9IjQ5LjM5NjQ3NyIgZm9udC1mYW1pbHk9IlJvYm90byIgZmlsbD0iIzY2NjY2NiI+PHRzcGFuIGlkPSJ0c3BhbjQ2OTAiIHg9IjUwLjY0NjQ3NyIgeT0iOTcwLjcyODA5Ij5JbWFnZSBiYWNrZ3JvdW5kIDwvdHNwYW4+PHRzcGFuIGlkPSJ0c3BhbjQ2OTIiIHg9IjQ5LjM5NjQ3NyIgeT0iOTgzLjIyODA5Ij5pcyBub3QgY29uZmlndXJlZDwvdHNwYW4+PC90ZXh0PgogIDxyZWN0IGlkPSJyZWN0NDY5NCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgaGVpZ2h0PSIxOS4zNiIgd2lkdGg9IjY5LjM2IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgeT0iOTkyLjY4IiB4PSIxNS4zMiIgc3Ryb2tlLXdpZHRoPSIuNjM5ODYiIGZpbGw9Im5vbmUiLz4KIDwvZz4KPC9zdmc+Cg=="
- },
- "imageEntityAlias": {
- "title": "Image URL source entity alias",
- "type": "string",
- "default": ""
- },
- "imageUrlAttribute": {
- "title": "Image URL source entity attribute",
- "type": "string",
- "default": ""
- },
- "xPosKeyName":{
- "title":"X position key name",
- "type":"string",
- "default":"xPos"
- },
- "yPosKeyName":{
- "title":"Y position key name",
- "type":"string",
- "default":"yPos"
- },
- "showLabel":{
- "title":"Show label",
- "type":"boolean",
- "default":true
- },
- "label":{
- "title":"Label (pattern examples: '${entityName}', '${entityName}: (Text ${keyName} units.)' )",
- "type":"string",
- "default":"${entityName}"
- },
- "useLabelFunction": {
- "title":"Use label function",
- "type":"boolean",
- "default":false
- },
- "labelFunction":{
- "title":"Label function: f(data, dsData, dsIndex)",
- "type":"string"
- },
- "showTooltip": {
- "title": "Show tooltip",
- "type":"boolean",
- "default":true
- },
- "autocloseTooltip": {
- "title": "Auto-close tooltips",
- "type":"boolean",
- "default":true
- },
- "tooltipPattern":{
- "title":"Tooltip (for ex. 'Text ${keyName} units.' or Link text')",
- "type":"string",
- "default":"${entityName}
X Pos: ${xPos:2}
Y Pos: ${yPos:2}"
- },
- "useTooltipFunction": {
- "title":"Use tooltip function",
- "type":"boolean",
- "default":false
- },
- "tooltipFunction":{
- "title":"Tooltip function: f(data, dsData, dsIndex)",
- "type":"string"
- },
- "color":{
- "title":"Color",
- "type":"string"
- },
- "posFunction":{
- "title":"Position conversion function: f(origXPos, origYPos), should return x,y coordinates as double from 0 to 1 each",
- "type":"string",
- "default": "return {x: origXPos, y: origYPos};"
- },
- "markerOffsetX": {
- "title": "Marker X offset relative to position",
- "type": "number",
- "default": 0.5
- },
- "markerOffsetY": {
- "title": "Marker Y offset relative to position",
- "type": "number",
- "default": 1
- },
- "useColorFunction":{
- "title":"Use color function",
- "type":"boolean",
- "default":false
- },
- "colorFunction":{
- "title":"Color function: f(data, dsData, dsIndex)",
- "type":"string"
- },
- "markerImage":{
- "title":"Custom marker image",
- "type":"string"
- },
- "markerImageSize":{
- "title":"Custom marker image size (px)",
- "type":"number",
- "default":34
- },
- "useMarkerImageFunction":{
- "title":"Use marker image function",
- "type":"boolean",
- "default":false
- },
- "markerImageFunction":{
- "title":"Marker image function: f(data, images, dsData, dsIndex)",
- "type":"string"
- },
- "markerImages":{
- "title":"Marker images",
- "type":"array",
- "items":{
- "title":"Marker image",
- "type":"string"
- }
- }
- },
- "required":[]
- },
- "form":[
- {
- "key": "mapImageUrl",
- "type": "image"
- },
- "imageEntityAlias",
- "imageUrlAttribute",
- "xPosKeyName",
- "yPosKeyName",
- "showLabel",
- "label",
- "useLabelFunction",
- {
- "key":"labelFunction",
- "type":"javascript"
- },
- "showTooltip",
- "autocloseTooltip",
- {
- "key": "tooltipPattern",
- "type": "textarea"
- },
- "useTooltipFunction",
- {
- "key":"tooltipFunction",
- "type":"javascript"
- },
- {
- "key":"color",
- "type":"color"
- },
- {
- "key":"posFunction",
- "type":"javascript"
- },
- "markerOffsetX",
- "markerOffsetY",
- "useColorFunction",
- {
- "key":"colorFunction",
- "type":"javascript"
- },
- {
- "key":"markerImage",
- "type":"image"
- },
- "markerImageSize",
- "useMarkerImageFunction",
- {
- "key":"markerImageFunction",
- "type":"javascript"
- },
- {
- "key":"markerImages",
- "items":[
- {
- "key":"markerImages[]",
- "type":"image"
- }
- ]
- }
- ]
-};
\ No newline at end of file
+ {
+ "schema": {
+ "title": "Image Map Configuration",
+ "type": "object",
+ "properties": {
+ "mapImageUrl": {
+ "title": "Image map background",
+ "type": "string",
+ "default": "data:image/svg+xml;base64,PHN2ZyBpZD0ic3ZnMiIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTAwIiB3aWR0aD0iMTAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgdmlld0JveD0iMCAwIDEwMCAxMDAiPgogPGcgaWQ9ImxheWVyMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtOTUyLjM2KSI+CiAgPHJlY3QgaWQ9InJlY3Q0Njg0IiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBoZWlnaHQ9Ijk5LjAxIiB3aWR0aD0iOTkuMDEiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiB5PSI5NTIuODYiIHg9Ii40OTUwNSIgc3Ryb2tlLXdpZHRoPSIuOTkwMTAiIGZpbGw9IiNlZWUiLz4KICA8dGV4dCBpZD0idGV4dDQ2ODYiIHN0eWxlPSJ3b3JkLXNwYWNpbmc6MHB4O2xldHRlci1zcGFjaW5nOjBweDt0ZXh0LWFuY2hvcjptaWRkbGU7dGV4dC1hbGlnbjpjZW50ZXIiIGZvbnQtd2VpZ2h0PSJib2xkIiB4bWw6c3BhY2U9InByZXNlcnZlIiBmb250LXNpemU9IjEwcHgiIGxpbmUtaGVpZ2h0PSIxMjUlIiB5PSI5NzAuNzI4MDkiIHg9IjQ5LjM5NjQ3NyIgZm9udC1mYW1pbHk9IlJvYm90byIgZmlsbD0iIzY2NjY2NiI+PHRzcGFuIGlkPSJ0c3BhbjQ2OTAiIHg9IjUwLjY0NjQ3NyIgeT0iOTcwLjcyODA5Ij5JbWFnZSBiYWNrZ3JvdW5kIDwvdHNwYW4+PHRzcGFuIGlkPSJ0c3BhbjQ2OTIiIHg9IjQ5LjM5NjQ3NyIgeT0iOTgzLjIyODA5Ij5pcyBub3QgY29uZmlndXJlZDwvdHNwYW4+PC90ZXh0PgogIDxyZWN0IGlkPSJyZWN0NDY5NCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgaGVpZ2h0PSIxOS4zNiIgd2lkdGg9IjY5LjM2IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgeT0iOTkyLjY4IiB4PSIxNS4zMiIgc3Ryb2tlLXdpZHRoPSIuNjM5ODYiIGZpbGw9Im5vbmUiLz4KIDwvZz4KPC9zdmc+Cg=="
+ },
+ "imageEntityAlias": {
+ "title": "Image URL source entity alias",
+ "type": "string",
+ "default": ""
+ },
+ "imageUrlAttribute": {
+ "title": "Image URL source entity attribute",
+ "type": "string",
+ "default": ""
+ },
+ "xPosKeyName": {
+ "title": "X position key name",
+ "type": "string",
+ "default": "xPos"
+ },
+ "yPosKeyName": {
+ "title": "Y position key name",
+ "type": "string",
+ "default": "yPos"
+ },
+ "showLabel": {
+ "title": "Show label",
+ "type": "boolean",
+ "default": true
+ },
+ "label": {
+ "title": "Label (pattern examples: '${entityName}', '${entityName}: (Text ${keyName} units.)' )",
+ "type": "string",
+ "default": "${entityName}"
+ },
+ "useLabelFunction": {
+ "title": "Use label function",
+ "type": "boolean",
+ "default": false
+ },
+ "labelFunction": {
+ "title": "Label function: f(data, dsData, dsIndex)",
+ "type": "string"
+ },
+ "showTooltip": {
+ "title": "Show tooltip",
+ "type": "boolean",
+ "default": true
+ },
+ "autocloseTooltip": {
+ "title": "Auto-close tooltips",
+ "type": "boolean",
+ "default": true
+ },
+ "tooltipPattern": {
+ "title": "Tooltip (for ex. 'Text ${keyName} units.' or Link text')",
+ "type": "string",
+ "default": "${entityName}
X Pos: ${xPos:2}
Y Pos: ${yPos:2}"
+ },
+ "useTooltipFunction": {
+ "title": "Use tooltip function",
+ "type": "boolean",
+ "default": false
+ },
+ "tooltipFunction": {
+ "title": "Tooltip function: f(data, dsData, dsIndex)",
+ "type": "string"
+ },
+ "color": {
+ "title": "Color",
+ "type": "string"
+ },
+ "posFunction": {
+ "title": "Position conversion function: f(origXPos, origYPos), should return x,y coordinates as double from 0 to 1 each",
+ "type": "string",
+ "default": "return {x: origXPos, y: origYPos};"
+ },
+ "markerOffsetX": {
+ "title": "Marker X offset relative to position",
+ "type": "number",
+ "default": 0.5
+ },
+ "markerOffsetY": {
+ "title": "Marker Y offset relative to position",
+ "type": "number",
+ "default": 1
+ },
+ "useColorFunction": {
+ "title": "Use color function",
+ "type": "boolean",
+ "default": false
+ },
+ "colorFunction": {
+ "title": "Color function: f(data, dsData, dsIndex)",
+ "type": "string"
+ },
+ "markerImage": {
+ "title": "Custom marker image",
+ "type": "string"
+ },
+ "markerImageSize": {
+ "title": "Custom marker image size (px)",
+ "type": "number",
+ "default": 34
+ },
+ "useMarkerImageFunction": {
+ "title": "Use marker image function",
+ "type": "boolean",
+ "default": false
+ },
+ "markerImageFunction": {
+ "title": "Marker image function: f(data, images, dsData, dsIndex)",
+ "type": "string"
+ },
+ "markerImages": {
+ "title": "Marker images",
+ "type": "array",
+ "items": {
+ "title": "Marker image",
+ "type": "string"
+ }
+ }
+ },
+ "required": []
+ },
+ "form": [
+ {
+ "key": "mapImageUrl",
+ "type": "image"
+ },
+ "imageEntityAlias",
+ "imageUrlAttribute",
+ "xPosKeyName",
+ "yPosKeyName",
+ "showLabel",
+ "label",
+ "useLabelFunction",
+ {
+ "key": "labelFunction",
+ "type": "javascript"
+ },
+ "showTooltip",
+ "autocloseTooltip",
+ {
+ "key": "tooltipPattern",
+ "type": "textarea"
+ },
+ "useTooltipFunction",
+ {
+ "key": "tooltipFunction",
+ "type": "javascript"
+ },
+ {
+ "key": "color",
+ "type": "color"
+ },
+ {
+ "key": "posFunction",
+ "type": "javascript"
+ },
+ "markerOffsetX",
+ "markerOffsetY",
+ "useColorFunction",
+ {
+ "key": "colorFunction",
+ "type": "javascript"
+ },
+ {
+ "key": "markerImage",
+ "type": "image"
+ },
+ "markerImageSize",
+ "useMarkerImageFunction",
+ {
+ "key": "markerImageFunction",
+ "type": "javascript"
+ },
+ {
+ "key": "markerImages",
+ "items": [
+ {
+ "key": "markerImages[]",
+ "type": "image"
+ }
+ ]
+ }
+ ]
+ };
\ No newline at end of file
diff --git a/ui/src/app/widget/lib/openstreet-map.js b/ui/src/app/widget/lib/openstreet-map.js
index 2f9c1bc95b..25e454f37a 100644
--- a/ui/src/app/widget/lib/openstreet-map.js
+++ b/ui/src/app/widget/lib/openstreet-map.js
@@ -19,234 +19,270 @@ import 'leaflet-providers';
export default class TbOpenStreetMap {
- constructor($containerElement, utils, initCallback, defaultZoomLevel, dontFitMapBounds, minZoomLevel, mapProvider) {
-
- this.utils = utils;
- this.defaultZoomLevel = defaultZoomLevel;
- this.dontFitMapBounds = dontFitMapBounds;
- this.minZoomLevel = minZoomLevel;
- this.tooltips = [];
-
- if (!mapProvider) {
- mapProvider = "OpenStreetMap.Mapnik";
- }
-
- this.map = L.map($containerElement[0]).setView([0, 0], this.defaultZoomLevel || 8);
-
- var tileLayer = L.tileLayer.provider(mapProvider);
-
- tileLayer.addTo(this.map);
-
- if (initCallback) {
- setTimeout(initCallback, 0); //eslint-disable-line
- }
-
- }
-
- inited() {
- return angular.isDefined(this.map);
- }
-
- updateMarkerLabel(marker, settings) {
- marker.unbindTooltip();
- marker.bindTooltip(''+settings.labelText+'
',
- { className: 'tb-marker-label', permanent: true, direction: 'top', offset: marker.tooltipOffset });
- }
-
- updateMarkerColor(marker, color) {
- this.createDefaultMarkerIcon(marker, color, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- });
- }
-
- updateMarkerIcon(marker, settings) {
- this.createMarkerIcon(marker, settings, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- if (settings.showLabel) {
- marker.unbindTooltip();
- marker.tooltipOffset = [0, -iconInfo.size[1] + 10];
- marker.bindTooltip(''+settings.labelText+'
',
- { className: 'tb-marker-label', permanent: true, direction: 'top', offset: marker.tooltipOffset });
- }
- });
- }
-
- createMarkerIcon(marker, settings, onMarkerIconReady) {
- var currentImage = settings.currentImage;
- var opMap = this;
- if (currentImage && currentImage.url) {
- this.utils.loadImageAspect(currentImage.url).then(
- (aspect) => {
- if (aspect) {
- var width;
- var height;
- if (aspect > 1) {
- width = currentImage.size;
- height = currentImage.size / aspect;
- } else {
- width = currentImage.size * aspect;
- height = currentImage.size;
- }
- var icon = L.icon({
- iconUrl: currentImage.url,
- iconSize: [width, height],
- iconAnchor: [width/2, height],
- popupAnchor: [0, -height]
- });
- var iconInfo = {
- size: [width, height],
- icon: icon
- };
- onMarkerIconReady(iconInfo);
- } else {
- opMap.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
- }
- }
- );
- } else {
- this.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
- }
- }
-
- createDefaultMarkerIcon(marker, color, onMarkerIconReady) {
- var pinColor = color.substr(1);
- var icon = L.icon({
- iconUrl: 'https://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|' + pinColor,
- iconSize: [21, 34],
- iconAnchor: [10, 34],
- popupAnchor: [0, -34],
- shadowUrl: 'https://chart.apis.google.com/chart?chst=d_map_pin_shadow',
- shadowSize: [40, 37],
- shadowAnchor: [12, 35]
- });
- var iconInfo = {
- size: [21, 34],
- icon: icon
- };
- onMarkerIconReady(iconInfo);
- }
-
- createMarker(location, dsIndex, settings, onClickListener, markerArgs) {
- var marker = L.marker(location, {});
- var opMap = this;
- this.createMarkerIcon(marker, settings, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- if (settings.showLabel) {
- marker.tooltipOffset = [0, -iconInfo.size[1] + 10];
- marker.bindTooltip(''+settings.labelText+'
',
- { className: 'tb-marker-label', permanent: true, direction: 'top', offset: marker.tooltipOffset });
- }
- marker.addTo(opMap.map);
- });
-
- if (settings.displayTooltip) {
- this.createTooltip(marker, dsIndex, settings, markerArgs);
- }
-
- if (onClickListener) {
- marker.on('click', onClickListener);
- }
-
- return marker;
- }
-
- removeMarker(marker) {
- this.map.removeLayer(marker);
- }
-
- createTooltip(marker, dsIndex, settings, markerArgs) {
- var popup = L.popup();
- popup.setContent('');
- marker.bindPopup(popup, {autoClose: settings.autocloseTooltip, closeOnClick: false});
- this.tooltips.push( {
- markerArgs: markerArgs,
- popup: popup,
- locationSettings: settings,
- dsIndex: dsIndex
- });
- }
-
- updatePolylineColor(polyline, settings, color) {
- var style = {
- color: color,
- opacity: settings.strokeOpacity,
- weight: settings.strokeWeight
- };
- polyline.setStyle(style);
- }
-
- createPolyline(locations, settings) {
- var polyline = L.polyline(locations,
- {
- color: settings.color,
- opacity: settings.strokeOpacity,
- weight: settings.strokeWeight
- }
- ).addTo(this.map);
- return polyline;
- }
-
- removePolyline(polyline) {
- this.map.removeLayer(polyline);
- }
-
- fitBounds(bounds) {
- if (bounds.isValid()) {
- if (this.dontFitMapBounds && this.defaultZoomLevel) {
- this.map.setZoom(this.defaultZoomLevel, {animate: false});
- this.map.panTo(bounds.getCenter(), {animate: false});
- } else {
- var tbMap = this;
- this.map.once('zoomend', function() {
- if (!tbMap.defaultZoomLevel && tbMap.map.getZoom() > tbMap.minZoomLevel) {
- tbMap.map.setZoom(tbMap.minZoomLevel, {animate: false});
- }
- });
- this.map.fitBounds(bounds, {padding: [50, 50], animate: false});
- }
- }
- }
-
- createLatLng(lat, lng) {
- return L.latLng(lat, lng);
- }
-
- extendBoundsWithMarker(bounds, marker) {
- bounds.extend(marker.getLatLng());
- }
-
- getMarkerPosition(marker) {
- return marker.getLatLng();
- }
-
- setMarkerPosition(marker, latLng) {
- marker.setLatLng(latLng);
- }
-
- getPolylineLatLngs(polyline) {
- return polyline.getLatLngs();
- }
-
- setPolylineLatLngs(polyline, latLngs) {
- polyline.setLatLngs(latLngs);
- }
-
- createBounds() {
- return L.latLngBounds();
- }
-
- extendBounds(bounds, polyline) {
- if (polyline && polyline.getLatLngs()) {
- bounds.extend(polyline.getBounds());
- }
- }
-
- invalidateSize() {
- this.map.invalidateSize(true);
- }
-
- getTooltips() {
- return this.tooltips;
- }
+ constructor($containerElement, utils, initCallback, defaultZoomLevel, dontFitMapBounds, minZoomLevel, mapProvider) {
+
+ this.utils = utils;
+ this.defaultZoomLevel = defaultZoomLevel;
+ this.dontFitMapBounds = dontFitMapBounds;
+ this.minZoomLevel = minZoomLevel;
+ this.tooltips = [];
+
+ if (!mapProvider) {
+ mapProvider = "OpenStreetMap.Mapnik";
+ }
+
+ this.map = L.map($containerElement[0]).setView([0, 0], this.defaultZoomLevel || 8);
+
+ var tileLayer = L.tileLayer.provider(mapProvider);
+
+ tileLayer.addTo(this.map);
+
+ if (initCallback) {
+ setTimeout(initCallback, 0); //eslint-disable-line
+ }
+
+ }
+
+ inited() {
+ return angular.isDefined(this.map);
+ }
+
+ updateMarkerLabel(marker, settings) {
+ marker.unbindTooltip();
+ marker.bindTooltip('' + settings.labelText + '
',
+ {className: 'tb-marker-label', permanent: true, direction: 'top', offset: marker.tooltipOffset});
+ }
+
+ updateMarkerColor(marker, color) {
+ this.createDefaultMarkerIcon(marker, color, (iconInfo) => {
+ marker.setIcon(iconInfo.icon);
+ });
+ }
+
+ updateMarkerIcon(marker, settings) {
+ this.createMarkerIcon(marker, settings, (iconInfo) => {
+ marker.setIcon(iconInfo.icon);
+ if (settings.showLabel) {
+ marker.unbindTooltip();
+ marker.tooltipOffset = [0, -iconInfo.size[1] + 10];
+ marker.bindTooltip('' + settings.labelText + '
',
+ {className: 'tb-marker-label', permanent: true, direction: 'top', offset: marker.tooltipOffset});
+ }
+ });
+ }
+
+ createMarkerIcon(marker, settings, onMarkerIconReady) {
+ var currentImage = settings.currentImage;
+ var opMap = this;
+ if (currentImage && currentImage.url) {
+ this.utils.loadImageAspect(currentImage.url).then(
+ (aspect) => {
+ if (aspect) {
+ var width;
+ var height;
+ if (aspect > 1) {
+ width = currentImage.size;
+ height = currentImage.size / aspect;
+ } else {
+ width = currentImage.size * aspect;
+ height = currentImage.size;
+ }
+ var icon = L.icon({
+ iconUrl: currentImage.url,
+ iconSize: [width, height],
+ iconAnchor: [width / 2, height],
+ popupAnchor: [0, -height]
+ });
+ var iconInfo = {
+ size: [width, height],
+ icon: icon
+ };
+ onMarkerIconReady(iconInfo);
+ } else {
+ opMap.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
+ }
+ }
+ );
+ } else {
+ this.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
+ }
+ }
+
+ createDefaultMarkerIcon(marker, color, onMarkerIconReady) {
+ var pinColor = color.substr(1);
+ var icon = L.icon({
+ iconUrl: 'https://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|' + pinColor,
+ iconSize: [21, 34],
+ iconAnchor: [10, 34],
+ popupAnchor: [0, -34],
+ shadowUrl: 'https://chart.apis.google.com/chart?chst=d_map_pin_shadow',
+ shadowSize: [40, 37],
+ shadowAnchor: [12, 35]
+ });
+ var iconInfo = {
+ size: [21, 34],
+ icon: icon
+ };
+ onMarkerIconReady(iconInfo);
+ }
+
+ createMarker(location, dsIndex, settings, onClickListener, markerArgs) {
+ var marker = L.marker(location, {});
+ var opMap = this;
+ this.createMarkerIcon(marker, settings, (iconInfo) => {
+ marker.setIcon(iconInfo.icon);
+ if (settings.showLabel) {
+ marker.tooltipOffset = [0, -iconInfo.size[1] + 10];
+ marker.bindTooltip('' + settings.labelText + '
',
+ {className: 'tb-marker-label', permanent: true, direction: 'top', offset: marker.tooltipOffset});
+ }
+ marker.addTo(opMap.map);
+ });
+
+ if (settings.displayTooltip) {
+ this.createTooltip(marker, dsIndex, settings, markerArgs);
+ }
+
+ if (onClickListener) {
+ marker.on('click', onClickListener);
+ }
+
+ return marker;
+ }
+
+ removeMarker(marker) {
+ this.map.removeLayer(marker);
+ }
+
+ createTooltip(marker, dsIndex, settings, markerArgs) {
+ var popup = L.popup();
+ popup.setContent('');
+ marker.bindPopup(popup, {autoClose: settings.autocloseTooltip, closeOnClick: false});
+ this.tooltips.push({
+ markerArgs: markerArgs,
+ popup: popup,
+ locationSettings: settings,
+ dsIndex: dsIndex
+ });
+ }
+
+ updatePolylineColor(polyline, settings, color) {
+ var style = {
+ color: color,
+ opacity: settings.strokeOpacity,
+ weight: settings.strokeWeight
+ };
+ polyline.setStyle(style);
+ }
+
+ createPolyline(locations, settings) {
+ var polyline = L.polyline(locations,
+ {
+ color: settings.color,
+ opacity: settings.strokeOpacity,
+ weight: settings.strokeWeight
+ }
+ ).addTo(this.map);
+ return polyline;
+ }
+
+ removePolyline(polyline) {
+ this.map.removeLayer(polyline);
+ }
+
+ createPolygon(latLangs, settings) {
+ let polygon = L.polygon(latLangs, {
+ fill: true,
+ fillColor: settings.polygonColor,
+ color: settings.polygonStrokeColor,
+ weight: settings.polygonStrokeWeight,
+ fillOpacity: settings.polygonOpacity,
+ opacity: settings.polygonStrokeOpacity
+ }).addTo(this.map);
+ return polygon;
+ }
+
+ removePolygon(polygon) {
+ this.map.removeLayer(polygon);
+ }
+
+ updatePolygonColor(polygon, settings, color) {
+ let style = {
+ fill: true,
+ fillColor: color,
+ color: color,
+ weight: settings.polygonStrokeWeight,
+ fillOpacity: settings.polygonOpacity,
+ opacity: settings.polygonStrokeOpacity
+ };
+ polygon.setStyle(style);
+ }
+
+ getPolygonLatLngs(polygon) {
+ return polygon.getLatLngs();
+ }
+
+ setPolygonLatLngs(polygon, latLngs) {
+ polygon.setLatLngs(latLngs);
+ }
+
+ fitBounds(bounds) {
+ if (bounds.isValid()) {
+ if (this.dontFitMapBounds && this.defaultZoomLevel) {
+ this.map.setZoom(this.defaultZoomLevel, {animate: false});
+ this.map.panTo(bounds.getCenter(), {animate: false});
+ } else {
+ var tbMap = this;
+ this.map.once('zoomend', function () {
+ if (!tbMap.defaultZoomLevel && tbMap.map.getZoom() > tbMap.minZoomLevel) {
+ tbMap.map.setZoom(tbMap.minZoomLevel, {animate: false});
+ }
+ });
+ this.map.fitBounds(bounds, {padding: [50, 50], animate: false});
+ }
+ }
+ }
+
+ createLatLng(lat, lng) {
+ return L.latLng(lat, lng);
+ }
+
+ extendBoundsWithMarker(bounds, marker) {
+ bounds.extend(marker.getLatLng());
+ }
+
+ getMarkerPosition(marker) {
+ return marker.getLatLng();
+ }
+
+ setMarkerPosition(marker, latLng) {
+ marker.setLatLng(latLng);
+ }
+
+ getPolylineLatLngs(polyline) {
+ return polyline.getLatLngs();
+ }
+
+ setPolylineLatLngs(polyline, latLngs) {
+ polyline.setLatLngs(latLngs);
+ }
+
+ createBounds() {
+ return L.latLngBounds();
+ }
+
+ extendBounds(bounds, polyline) {
+ if (polyline && polyline.getLatLngs()) {
+ bounds.extend(polyline.getBounds());
+ }
+ }
+
+ invalidateSize() {
+ this.map.invalidateSize(true);
+ }
+
+ getTooltips() {
+ return this.tooltips;
+ }
}
diff --git a/ui/src/app/widget/lib/tencent-map.js b/ui/src/app/widget/lib/tencent-map.js
index 94fc43abd2..17a61216df 100644
--- a/ui/src/app/widget/lib/tencent-map.js
+++ b/ui/src/app/widget/lib/tencent-map.js
@@ -14,377 +14,425 @@
* limitations under the License.
*/
var tmGlobals = {
- loadingTmId: null,
- tmApiKeys: {}
+ loadingTmId: null,
+ tmApiKeys: {}
}
export default class TbTencentMap {
- constructor($containerElement,utils, initCallback, defaultZoomLevel, dontFitMapBounds, minZoomLevel, tmApiKey, tmDefaultMapType) {
- var tbMap = this;
- this.utils = utils;
- this.defaultZoomLevel = defaultZoomLevel;
- this.dontFitMapBounds = dontFitMapBounds;
- this.minZoomLevel = minZoomLevel;
- this.tooltips = [];
- this.defaultMapType = tmDefaultMapType;
-
- function clearGlobalId() {
- if (tmGlobals.loadingTmId && tmGlobals.loadingTmId === tbMap.mapId) {
- tmGlobals.loadingTmId = null;
- }
- }
-
- function displayError(message) {
- $containerElement.html( // eslint-disable-line angular/angularelement
- ""+ message + "
"
- );
- }
-
- function initTencentMap() {
- tbMap.map = new qq.maps.Map($containerElement[0], { // eslint-disable-line no-undef
- scrollwheel: true,
- mapTypeId: getTencentMapTypeId(tbMap.defaultMapType),
- zoom: tbMap.defaultZoomLevel || 8
- });
-
- if (initCallback) {
- initCallback();
- }
- }
-
- /* eslint-disable no-undef */
-
- function getTencentMapTypeId(mapType) {
- var mapTypeId =qq.maps.MapTypeId.ROADMAP;
- if (mapType) {
- if (mapType === 'hybrid') {
- mapTypeId = qq.maps.MapTypeId.HYBRID;
- } else if (mapType === 'satellite') {
- mapTypeId = qq.maps.MapTypeId.SATELLITE;
- } else if (mapType === 'terrain') {
- mapTypeId = qq.maps.MapTypeId.ROADMAP;
- }
- }
- return mapTypeId;
- }
-
- /* eslint-enable no-undef */
-
- this.mapId = '' + Math.random().toString(36).substr(2, 9);
- this.apiKey = tmApiKey || '84d6d83e0e51e481e50454ccbe8986b';
-
- window.tm_authFailure = function() { // eslint-disable-line no-undef, angular/window-service
- if (tmGlobals.loadingTmId && tmGlobals.loadingTmId === tbMap.mapId) {
- tmGlobals.loadingTmId = null;
- tmGlobals.tmApiKeys[tbMap.apiKey].error = 'Unable to authentificate for tencent Map API.Please check your API key.';
- displayError(tmGlobals.tmApiKeys[tbMap.apiKey].error);
- }
- };
-
- this.initMapFunctionName = 'initTencentMap_' + this.mapId;
-
- window[this.initMapFunctionName] = function() { // eslint-disable-line no-undef, angular/window-service
- tmGlobals.tmApiKeys[tbMap.apiKey].loaded = true;
- initTencentMap();
- for (var p = 0; p < tmGlobals.tmApiKeys[tbMap.apiKey].pendingInits.length; p++) {
- var pendingInit = tmGlobals.tmApiKeys[tbMap.apiKey].pendingInits[p];
- pendingInit();
- }
- tmGlobals.tmApiKeys[tbMap.apiKey].pendingInits = [];
- };
- if (this.apiKey && this.apiKey.length > 0) {
- if (tmGlobals.tmApiKeys[this.apiKey]) {
- if (tmGlobals.tmApiKeys[this.apiKey].error) {
- displayError(tmGlobals.tmApiKeys[this.apiKey].error);
- } else if (tmGlobals.tmApiKeys[this.apiKey].loaded) {
- initTencentMap();
- } else {
- tmGlobals.tmApiKeys[this.apiKey].pendingInits.push(initTencentMap);
- }
- } else {
- tmGlobals.tmApiKeys[this.apiKey] = {
- loaded: false,
- pendingInits: []
- };
- var tencentMapScriptRes = 'https://map.qq.com/api/js?v=2.exp&key='+this.apiKey+'&callback='+this.initMapFunctionName;
-
- tmGlobals.loadingTmId = this.mapId;
- lazyLoad.load({ type: 'js', path: tencentMapScriptRes }).then( // eslint-disable-line no-undef
- function success() {
- setTimeout(clearGlobalId, 2000); // eslint-disable-line no-undef, angular/timeout-service
- },
- function fail(e) {
- clearGlobalId();
- tmGlobals.tmApiKeys[tbMap.apiKey].error = 'tencent map api load failed!'+e;
- displayError(tmGlobals.tmApiKeys[tbMap.apiKey].error);
- }
- );
- }
- } else {
- displayError('No tencent Map Api Key provided!');
- }
- }
-
- inited() {
- return angular.isDefined(this.map);
- }
-
- createMarkerLabelStyle(settings) {
- return {
- width: "200px",
- textAlign: "center",
- color: settings.labelColor,
- background: "none",
- border: "none",
- fontSize: "12px",
- fontFamily: "\"Helvetica Neue\", Arial, Helvetica, sans-serif",
- fontWeight: "bold"
- };
- }
-
- /* eslint-disable no-undef,no-unused-vars*/
- updateMarkerLabel(marker, settings) {
- if (marker.label) {
- marker.label.setContent(settings.labelText);
- marker.label.setStyle(this.createMarkerLabelStyle(settings));
- }
- }
- /* eslint-enable no-undef,no-unused-vars */
-
- /* eslint-disable no-undef,no-unused-vars */
- updateMarkerColor(marker, color) {
- this.createDefaultMarkerIcon(marker, color, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- });
- }
- /* eslint-enable no-undef,,no-unused-vars */
-
- /* eslint-disable no-undef */
- updateMarkerIcon(marker, settings) {
- this.createMarkerIcon(marker, settings, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- if (marker.label) {
- marker.label.setOffset(new qq.maps.Size(-100, -iconInfo.size[1]-20));
- }
- });
- }
- /* eslint-disable no-undef */
-
- /* eslint-disable no-undef */
- createMarkerIcon(marker, settings, onMarkerIconReady) {
- var currentImage = settings.currentImage;
- var tMap = this;
- if (currentImage && currentImage.url) {
- this.utils.loadImageAspect(currentImage.url).then(
- (aspect) => {
- if (aspect) {
- var width;
- var height;
- if (aspect > 1) {
- width = currentImage.size;
- height = currentImage.size / aspect;
- } else {
- width = currentImage.size * aspect;
- height = currentImage.size;
- }
- var icon = new qq.maps.MarkerImage(currentImage.url,
- new qq.maps.Size(width, height),
- new qq.maps.Point(0,0),
- new qq.maps.Point(width/2, height),
- new qq.maps.Size(width, height));
- var iconInfo = {
- size: [width, height],
- icon: icon
- };
- onMarkerIconReady(iconInfo);
- } else {
- tMap.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
- }
- }
- );
- } else {
- this.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
- }
- }
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- createDefaultMarkerIcon(marker, color, onMarkerIconReady) {
- var pinColor = color.substr(1);
- var icon = new qq.maps.MarkerImage("https://chart.apis.google.com/chart?chst=d_map_pin_letter_withshadow&chld=%E2%80%A2|" + pinColor,
- new qq.maps.Size(40, 37),
- new qq.maps.Point(0,0),
- new qq.maps.Point(10, 37));
- var iconInfo = {
- size: [40, 37],
- icon: icon
- };
- onMarkerIconReady(iconInfo);
- }
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- createMarker(location, dsIndex, settings, onClickListener, markerArgs) {
- var marker = new qq.maps.Marker({
- position: location
- });
- var tMap = this;
- this.createMarkerIcon(marker, settings, (iconInfo) => {
- marker.setIcon(iconInfo.icon);
- marker.setMap(tMap.map);
- if (settings.showLabel) {
- marker.label = new qq.maps.Label({
- clickable: false,
- content: settings.labelText,
- offset: new qq.maps.Size(-100, -iconInfo.size[1]-20),
- style: tMap.createMarkerLabelStyle(settings),
- visible: true,
- position: location,
- map: tMap.map,
- zIndex: 1000
- });
- }
- });
-
- if (settings.displayTooltip) {
- this.createTooltip(marker, dsIndex, settings, markerArgs);
- }
-
- if (onClickListener) {
- qq.maps.event.addListener(marker, 'click', onClickListener);
- }
-
- return marker;
- }
-
- /* eslint-disable no-undef */
- removeMarker(marker) {
- marker.setMap(null);
- if (marker.label) {
- marker.label.setMap(null);
- }
- }
-
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- createTooltip(marker, dsIndex, settings, markerArgs) {
- var popup = new qq.maps.InfoWindow({
- map :this.map
- });
- var map = this;
- qq.maps.event.addListener(marker, 'click', function() {
- if (settings.autocloseTooltip) {
- map.tooltips.forEach((tooltip) => {
- tooltip.popup.close();
- });
- }
- popup.open();
- popup.setPosition(marker);
- });
- this.tooltips.push( {
- markerArgs: markerArgs,
- popup: popup,
- locationSettings: settings,
- dsIndex: dsIndex
- });
- }
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- updatePolylineColor(polyline, settings, color) {
- var options = {
- path: polyline.getPath(),
- strokeColor: color,
- strokeOpacity: settings.strokeOpacity,
- strokeWeight: settings.strokeWeight,
- map: this.map
- };
- polyline.setOptions(options);
- }
- /* eslint-enable no-undef */
-
- /* eslint-disable no-undef */
- createPolyline(locations, settings) {
- var polyline = new qq.maps.Polyline({
- path: locations,
- strokeColor: settings.color,
- strokeOpacity: settings.strokeOpacity,
- strokeWeight: settings.strokeWeight,
- map: this.map
- });
-
- return polyline;
- }
- /* eslint-enable no-undef */
-
- removePolyline(polyline) {
- polyline.setMap(null);
- }
-
- /* eslint-disable no-undef ,no-unused-vars*/
- fitBounds(bounds) {
- if (this.dontFitMapBounds && this.defaultZoomLevel) {
- this.map.setZoom(this.defaultZoomLevel);
- this.map.setCenter(bounds.getCenter());
- } else {
- var tbMap = this;
- qq.maps.event.addListenerOnce(this.map, 'bounds_changed', function() { // eslint-disable-line no-undef
- if (!tbMap.defaultZoomLevel && tbMap.map.getZoom() > tbMap.minZoomLevel) {
- tbMap.map.setZoom(tbMap.minZoomLevel);
- }
- });
- this.map.fitBounds(bounds);
- }
- }
- /* eslint-enable no-undef,no-unused-vars */
-
- createLatLng(lat, lng) {
- return new qq.maps.LatLng(lat, lng); // eslint-disable-line no-undef
- }
-
- extendBoundsWithMarker(bounds, marker) {
- bounds.extend(marker.getPosition());
- }
-
- getMarkerPosition(marker) {
- return marker.getPosition();
- }
-
- setMarkerPosition(marker, latLng) {
- marker.setPosition(latLng);
- if (marker.label) {
- marker.label.setPosition(latLng);
- }
- }
-
- getPolylineLatLngs(polyline) {
- return polyline.getPath().getArray();
- }
-
- setPolylineLatLngs(polyline, latLngs) {
- polyline.setPath(latLngs);
- }
-
- createBounds() {
- return new qq.maps.LatLngBounds(); // eslint-disable-line no-undef
- }
-
- extendBounds(bounds, polyline) {
- if (polyline && polyline.getPath()) {
- var locations = polyline.getPath();
- for (var i = 0; i < locations.getLength(); i++) {
- bounds.extend(locations.getAt(i));
- }
- }
- }
-
- invalidateSize() {
- qq.maps.event.trigger(this.map, "resize"); // eslint-disable-line no-undef
- }
-
- getTooltips() {
- return this.tooltips;
- }
+ constructor($containerElement, utils, initCallback, defaultZoomLevel, dontFitMapBounds, minZoomLevel, tmApiKey, tmDefaultMapType) {
+ var tbMap = this;
+ this.utils = utils;
+ this.defaultZoomLevel = defaultZoomLevel;
+ this.dontFitMapBounds = dontFitMapBounds;
+ this.minZoomLevel = minZoomLevel;
+ this.tooltips = [];
+ this.defaultMapType = tmDefaultMapType;
+
+ function clearGlobalId() {
+ if (tmGlobals.loadingTmId && tmGlobals.loadingTmId === tbMap.mapId) {
+ tmGlobals.loadingTmId = null;
+ }
+ }
+
+ function displayError(message) {
+ $containerElement.html( // eslint-disable-line angular/angularelement
+ "" + message + "
"
+ );
+ }
+
+ function initTencentMap() {
+ tbMap.map = new qq.maps.Map($containerElement[0], { // eslint-disable-line no-undef
+ scrollwheel: true,
+ mapTypeId: getTencentMapTypeId(tbMap.defaultMapType),
+ zoom: tbMap.defaultZoomLevel || 8
+ });
+
+ if (initCallback) {
+ initCallback();
+ }
+ }
+
+ /* eslint-disable no-undef */
+
+ function getTencentMapTypeId(mapType) {
+ var mapTypeId = qq.maps.MapTypeId.ROADMAP;
+ if (mapType) {
+ if (mapType === 'hybrid') {
+ mapTypeId = qq.maps.MapTypeId.HYBRID;
+ } else if (mapType === 'satellite') {
+ mapTypeId = qq.maps.MapTypeId.SATELLITE;
+ } else if (mapType === 'terrain') {
+ mapTypeId = qq.maps.MapTypeId.ROADMAP;
+ }
+ }
+ return mapTypeId;
+ }
+
+ /* eslint-enable no-undef */
+
+ this.mapId = '' + Math.random().toString(36).substr(2, 9);
+ this.apiKey = tmApiKey || '84d6d83e0e51e481e50454ccbe8986b';
+
+ window.tm_authFailure = function () { // eslint-disable-line no-undef, angular/window-service
+ if (tmGlobals.loadingTmId && tmGlobals.loadingTmId === tbMap.mapId) {
+ tmGlobals.loadingTmId = null;
+ tmGlobals.tmApiKeys[tbMap.apiKey].error = 'Unable to authentificate for tencent Map API.Please check your API key.';
+ displayError(tmGlobals.tmApiKeys[tbMap.apiKey].error);
+ }
+ };
+
+ this.initMapFunctionName = 'initTencentMap_' + this.mapId;
+
+ window[this.initMapFunctionName] = function () { // eslint-disable-line no-undef, angular/window-service
+ tmGlobals.tmApiKeys[tbMap.apiKey].loaded = true;
+ initTencentMap();
+ for (var p = 0; p < tmGlobals.tmApiKeys[tbMap.apiKey].pendingInits.length; p++) {
+ var pendingInit = tmGlobals.tmApiKeys[tbMap.apiKey].pendingInits[p];
+ pendingInit();
+ }
+ tmGlobals.tmApiKeys[tbMap.apiKey].pendingInits = [];
+ };
+ if (this.apiKey && this.apiKey.length > 0) {
+ if (tmGlobals.tmApiKeys[this.apiKey]) {
+ if (tmGlobals.tmApiKeys[this.apiKey].error) {
+ displayError(tmGlobals.tmApiKeys[this.apiKey].error);
+ } else if (tmGlobals.tmApiKeys[this.apiKey].loaded) {
+ initTencentMap();
+ } else {
+ tmGlobals.tmApiKeys[this.apiKey].pendingInits.push(initTencentMap);
+ }
+ } else {
+ tmGlobals.tmApiKeys[this.apiKey] = {
+ loaded: false,
+ pendingInits: []
+ };
+ var tencentMapScriptRes = 'https://map.qq.com/api/js?v=2.exp&key=' + this.apiKey + '&callback=' + this.initMapFunctionName;
+
+ tmGlobals.loadingTmId = this.mapId;
+ lazyLoad.load({type: 'js', path: tencentMapScriptRes}).then( // eslint-disable-line no-undef
+ function success() {
+ setTimeout(clearGlobalId, 2000); // eslint-disable-line no-undef, angular/timeout-service
+ },
+ function fail(e) {
+ clearGlobalId();
+ tmGlobals.tmApiKeys[tbMap.apiKey].error = 'tencent map api load failed!' + e;
+ displayError(tmGlobals.tmApiKeys[tbMap.apiKey].error);
+ }
+ );
+ }
+ } else {
+ displayError('No tencent Map Api Key provided!');
+ }
+ }
+
+ inited() {
+ return angular.isDefined(this.map);
+ }
+
+ createMarkerLabelStyle(settings) {
+ return {
+ width: "200px",
+ textAlign: "center",
+ color: settings.labelColor,
+ background: "none",
+ border: "none",
+ fontSize: "12px",
+ fontFamily: "\"Helvetica Neue\", Arial, Helvetica, sans-serif",
+ fontWeight: "bold"
+ };
+ }
+
+ /* eslint-disable no-undef,no-unused-vars*/
+ updateMarkerLabel(marker, settings) {
+ if (marker.label) {
+ marker.label.setContent(settings.labelText);
+ marker.label.setStyle(this.createMarkerLabelStyle(settings));
+ }
+ }
+
+ /* eslint-enable no-undef,no-unused-vars */
+
+ /* eslint-disable no-undef,no-unused-vars */
+ updateMarkerColor(marker, color) {
+ this.createDefaultMarkerIcon(marker, color, (iconInfo) => {
+ marker.setIcon(iconInfo.icon);
+ });
+ }
+
+ /* eslint-enable no-undef,,no-unused-vars */
+
+ /* eslint-disable no-undef */
+ updateMarkerIcon(marker, settings) {
+ this.createMarkerIcon(marker, settings, (iconInfo) => {
+ marker.setIcon(iconInfo.icon);
+ if (marker.label) {
+ marker.label.setOffset(new qq.maps.Size(-100, -iconInfo.size[1] - 20));
+ }
+ });
+ }
+
+ /* eslint-disable no-undef */
+
+ /* eslint-disable no-undef */
+ createMarkerIcon(marker, settings, onMarkerIconReady) {
+ var currentImage = settings.currentImage;
+ var tMap = this;
+ if (currentImage && currentImage.url) {
+ this.utils.loadImageAspect(currentImage.url).then(
+ (aspect) => {
+ if (aspect) {
+ var width;
+ var height;
+ if (aspect > 1) {
+ width = currentImage.size;
+ height = currentImage.size / aspect;
+ } else {
+ width = currentImage.size * aspect;
+ height = currentImage.size;
+ }
+ var icon = new qq.maps.MarkerImage(currentImage.url,
+ new qq.maps.Size(width, height),
+ new qq.maps.Point(0, 0),
+ new qq.maps.Point(width / 2, height),
+ new qq.maps.Size(width, height));
+ var iconInfo = {
+ size: [width, height],
+ icon: icon
+ };
+ onMarkerIconReady(iconInfo);
+ } else {
+ tMap.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
+ }
+ }
+ );
+ } else {
+ this.createDefaultMarkerIcon(marker, settings.color, onMarkerIconReady);
+ }
+ }
+
+ /* eslint-enable no-undef */
+
+ /* eslint-disable no-undef */
+ createDefaultMarkerIcon(marker, color, onMarkerIconReady) {
+ var pinColor = color.substr(1);
+ var icon = new qq.maps.MarkerImage("https://chart.apis.google.com/chart?chst=d_map_pin_letter_withshadow&chld=%E2%80%A2|" + pinColor,
+ new qq.maps.Size(40, 37),
+ new qq.maps.Point(0, 0),
+ new qq.maps.Point(10, 37));
+ var iconInfo = {
+ size: [40, 37],
+ icon: icon
+ };
+ onMarkerIconReady(iconInfo);
+ }
+
+ /* eslint-enable no-undef */
+
+ /* eslint-disable no-undef */
+ createMarker(location, dsIndex, settings, onClickListener, markerArgs) {
+ var marker = new qq.maps.Marker({
+ position: location
+ });
+ var tMap = this;
+ this.createMarkerIcon(marker, settings, (iconInfo) => {
+ marker.setIcon(iconInfo.icon);
+ marker.setMap(tMap.map);
+ if (settings.showLabel) {
+ marker.label = new qq.maps.Label({
+ clickable: false,
+ content: settings.labelText,
+ offset: new qq.maps.Size(-100, -iconInfo.size[1] - 20),
+ style: tMap.createMarkerLabelStyle(settings),
+ visible: true,
+ position: location,
+ map: tMap.map,
+ zIndex: 1000
+ });
+ }
+ });
+
+ if (settings.displayTooltip) {
+ this.createTooltip(marker, dsIndex, settings, markerArgs);
+ }
+
+ if (onClickListener) {
+ qq.maps.event.addListener(marker, 'click', onClickListener);
+ }
+
+ return marker;
+ }
+
+ /* eslint-disable no-undef */
+ removeMarker(marker) {
+ marker.setMap(null);
+ if (marker.label) {
+ marker.label.setMap(null);
+ }
+ }
+
+ /* eslint-enable no-undef */
+
+ /* eslint-disable no-undef */
+ createTooltip(marker, dsIndex, settings, markerArgs) {
+ var popup = new qq.maps.InfoWindow({
+ map: this.map
+ });
+ var map = this;
+ qq.maps.event.addListener(marker, 'click', function () {
+ if (settings.autocloseTooltip) {
+ map.tooltips.forEach((tooltip) => {
+ tooltip.popup.close();
+ });
+ }
+ popup.open();
+ popup.setPosition(marker);
+ });
+ this.tooltips.push({
+ markerArgs: markerArgs,
+ popup: popup,
+ locationSettings: settings,
+ dsIndex: dsIndex
+ });
+ }
+
+ /* eslint-enable no-undef */
+
+ /* eslint-disable no-undef */
+ updatePolylineColor(polyline, settings, color) {
+ var options = {
+ path: polyline.getPath(),
+ strokeColor: color,
+ strokeOpacity: settings.strokeOpacity,
+ strokeWeight: settings.strokeWeight,
+ map: this.map
+ };
+ polyline.setOptions(options);
+ }
+
+ /* eslint-enable no-undef */
+
+ /* eslint-disable no-undef */
+ createPolyline(locations, settings) {
+ var polyline = new qq.maps.Polyline({
+ path: locations,
+ strokeColor: settings.color,
+ strokeOpacity: settings.strokeOpacity,
+ strokeWeight: settings.strokeWeight,
+ map: this.map
+ });
+
+ return polyline;
+ }
+
+ /* eslint-enable no-undef */
+
+ removePolyline(polyline) {
+ polyline.setMap(null);
+ }
+
+ /* eslint-disable no-undef */
+ createPolygon(latLangs, settings) {
+ let polygon = new qq.maps.Polygon({
+ map: this.map,
+ path: latLangs,
+ strokeColor: settings.polygonStrokeColor,
+ fillColor: settings.polygonColor,
+ strokeWeight: settings.polygonStrokeWeight
+ });
+ return polygon;
+ }
+ /* eslint-disable no-undef */
+
+ removePolygon (polygon) {
+ polygon.setMap(null);
+ }
+
+ /* eslint-disable no-undef,no-unused-vars */
+ updatePolygonColor (polygon, settings, color) {
+ let options = {
+ path: polygon.getPath(),
+ map: this.map,
+ strokeColor: color,
+ fillColor: color,
+ strokeWeight: settings.polygonStrokeWeight
+ }
+
+ }
+ /* eslint-disable no-undef ,no-unused-vars*/
+
+
+ getPolygonLatLngs(polygon) {
+ return polygon.getPath().getArray();
+ }
+
+ setPolygonLatLngs(polygon, latLngs) {
+ polygon.setPath(latLngs);
+ }
+
+ /* eslint-disable no-undef ,no-unused-vars*/
+ fitBounds(bounds) {
+ if (this.dontFitMapBounds && this.defaultZoomLevel) {
+ this.map.setZoom(this.defaultZoomLevel);
+ this.map.setCenter(bounds.getCenter());
+ } else {
+ var tbMap = this;
+ qq.maps.event.addListenerOnce(this.map, 'bounds_changed', function () { // eslint-disable-line no-undef
+ if (!tbMap.defaultZoomLevel && tbMap.map.getZoom() > tbMap.minZoomLevel) {
+ tbMap.map.setZoom(tbMap.minZoomLevel);
+ }
+ });
+ this.map.fitBounds(bounds);
+ }
+ }
+
+ /* eslint-enable no-undef,no-unused-vars */
+
+ createLatLng(lat, lng) {
+ return new qq.maps.LatLng(lat, lng); // eslint-disable-line no-undef
+ }
+
+ extendBoundsWithMarker(bounds, marker) {
+ bounds.extend(marker.getPosition());
+ }
+
+ getMarkerPosition(marker) {
+ return marker.getPosition();
+ }
+
+ setMarkerPosition(marker, latLng) {
+ marker.setPosition(latLng);
+ if (marker.label) {
+ marker.label.setPosition(latLng);
+ }
+ }
+
+ getPolylineLatLngs(polyline) {
+ return polyline.getPath().getArray();
+ }
+
+ setPolylineLatLngs(polyline, latLngs) {
+ polyline.setPath(latLngs);
+ }
+
+ createBounds() {
+ return new qq.maps.LatLngBounds(); // eslint-disable-line no-undef
+ }
+
+ extendBounds(bounds, polyline) {
+ if (polyline && polyline.getPath()) {
+ var locations = polyline.getPath();
+ for (var i = 0; i < locations.getLength(); i++) {
+ bounds.extend(locations.getAt(i));
+ }
+ }
+ }
+
+ invalidateSize() {
+ qq.maps.event.trigger(this.map, "resize"); // eslint-disable-line no-undef
+ }
+
+ getTooltips() {
+ return this.tooltips;
+ }
}