From 174ea115f722b42f4b829ed7fb90b174bff4de1d Mon Sep 17 00:00:00 2001 From: "pinkevycdima@gmail.com" Date: Fri, 25 Mar 2022 14:30:21 +0200 Subject: [PATCH 01/37] Add condition for dbl click (zoom) --- .../home/components/widget/lib/maps/providers/image-map.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/maps/providers/image-map.ts b/ui-ngx/src/app/modules/home/components/widget/lib/maps/providers/image-map.ts index b527691ed9..eba23b09e8 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/maps/providers/image-map.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/maps/providers/image-map.ts @@ -223,6 +223,7 @@ export class ImageMap extends LeafletMap { maxZoom, scrollWheelZoom: !this.options.disableScrollZooming, center, + doubleClickZoom: !this.options.disableZoomControl, zoomControl: !this.options.disableZoomControl, zoom: 1, crs: L.CRS.Simple, From 0ec58931a7a60351717e63ce90d7647faae1a8e1 Mon Sep 17 00:00:00 2001 From: Mauro Cicolella Date: Mon, 18 Apr 2022 10:16:50 +0200 Subject: [PATCH 02/37] Update locale.constant-it_IT.json --- .../assets/locale/locale.constant-it_IT.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ui-ngx/src/assets/locale/locale.constant-it_IT.json b/ui-ngx/src/assets/locale/locale.constant-it_IT.json index 8d86e38132..52485e3722 100644 --- a/ui-ngx/src/assets/locale/locale.constant-it_IT.json +++ b/ui-ngx/src/assets/locale/locale.constant-it_IT.json @@ -123,10 +123,10 @@ "UNACK": "Non riconosciuto" }, "display-status": { - "ACTIVE_UNACK": "Active Unacknowledged", - "ACTIVE_ACK": "Active Acknowledged", - "CLEARED_UNACK": "Cleared Unacknowledged", - "CLEARED_ACK": "Cleared Acknowledged" + "ACTIVE_UNACK": "Attivo Non riconosciuto", + "ACTIVE_ACK": "Attivo Riconosciuto", + "CLEARED_UNACK": "Cancellato Non riconosciuto", + "CLEARED_ACK": "Cancellato Riconosciuto" }, "no-alarms-prompt": "Nessun allarme trovato", "created-time": "Orario di creazione", @@ -1066,9 +1066,9 @@ "modbus-register-address": "Indirizzo registro", "modbus-register-address-range": "Indirizzo registro deve essere compreso tra 0 e 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-bit-index-range": "Bit index deve essere compreso tra 0 e 15.", "modbus-register-count": "Register count", - "modbus-register-count-range": "Register count should be a positive value.", + "modbus-register-count-range": "Register count dovrebbe essereun valore positivo.", "modbus-byte-order": "Byte order", "sync": { "status": "Stato", @@ -1307,13 +1307,13 @@ "type-enrichment": "Enrichment", "type-enrichment-details": "Aggiungi informazioni addizionali nei metadati del messaggio", "type-transformation": "Trasformazione", - "type-transformation-details": "Change Message payload and Metadata", + "type-transformation-details": "Modifica payload messaggio e metadati", "type-action": "Azioni", "type-action-details": "Perform special action", "type-external": "External", "type-external-details": "Interagisci con un sistema esterno", "type-rule-chain": "Rule Chain", - "type-rule-chain-details": "Forwards incoming messages to specified Rule Chain", + "type-rule-chain-details": "Inoltra i messaggi in arrivo ad una specifica Rule Chain", "type-input": "Input", "type-input-details": "Logical input of Rule Chain, forwards incoming messages to next related Rule Node", "type-unknown": "Sconosciuto", @@ -1502,7 +1502,7 @@ "widget-action": { "header-button": "Widget header button", "open-dashboard-state": "Navigate to new dashboard state", - "update-dashboard-state": "Update current dashboard state", + "update-dashboard-state": "Aggiorna lo stato della dashboard attuale", "open-dashboard": "Navigate to other dashboard", "custom": "Custom action", "target-dashboard-state": "Target dashboard state", From 5706041f468c0c445288a34c596bbdc9d87f9c34 Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Mon, 18 Apr 2022 11:50:26 +0300 Subject: [PATCH 03/37] Changed validation logic for JSON editor --- .../src/app/shared/components/json-object-edit.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui-ngx/src/app/shared/components/json-object-edit.component.ts b/ui-ngx/src/app/shared/components/json-object-edit.component.ts index e7a1b97cad..35f9e1e623 100644 --- a/ui-ngx/src/app/shared/components/json-object-edit.component.ts +++ b/ui-ngx/src/app/shared/components/json-object-edit.component.ts @@ -22,7 +22,7 @@ import { ActionNotificationHide, ActionNotificationShow } from '@core/notificati import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; import { CancelAnimationFrame, RafService } from '@core/services/raf.service'; -import { guid, isDefinedAndNotNull, isLiteralObject, isUndefined } from '@core/utils'; +import { guid, isDefinedAndNotNull, isUndefined } from '@core/utils'; import { ResizeObserver } from '@juggle/resize-observer'; import { getAce } from '@shared/models/ace/ace.models'; @@ -259,7 +259,7 @@ export class JsonObjectEditComponent implements OnInit, ControlValueAccessor, Va if (this.contentValue && this.contentValue.length > 0) { try { data = JSON.parse(this.contentValue); - if (!isLiteralObject(data)) { + if (typeof data !== 'object') { throw new TypeError(`Value is not a valid JSON`); } this.objectValid = true; From 22a8cc624502a9d3c00fa155a05b5171e5f2b238 Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Tue, 19 Apr 2022 13:46:40 +0300 Subject: [PATCH 04/37] Refactoring --- .../src/app/shared/components/json-object-edit.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui-ngx/src/app/shared/components/json-object-edit.component.ts b/ui-ngx/src/app/shared/components/json-object-edit.component.ts index 35f9e1e623..7d829115af 100644 --- a/ui-ngx/src/app/shared/components/json-object-edit.component.ts +++ b/ui-ngx/src/app/shared/components/json-object-edit.component.ts @@ -22,7 +22,7 @@ import { ActionNotificationHide, ActionNotificationShow } from '@core/notificati import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; import { CancelAnimationFrame, RafService } from '@core/services/raf.service'; -import { guid, isDefinedAndNotNull, isUndefined } from '@core/utils'; +import {guid, isDefinedAndNotNull, isObject, isUndefined} from '@core/utils'; import { ResizeObserver } from '@juggle/resize-observer'; import { getAce } from '@shared/models/ace/ace.models'; @@ -259,7 +259,7 @@ export class JsonObjectEditComponent implements OnInit, ControlValueAccessor, Va if (this.contentValue && this.contentValue.length > 0) { try { data = JSON.parse(this.contentValue); - if (typeof data !== 'object') { + if (!isObject(data)) { throw new TypeError(`Value is not a valid JSON`); } this.objectValid = true; From 2860c914e10ba5ab4745a63d4b2b31991d1464c2 Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Tue, 19 Apr 2022 13:47:37 +0300 Subject: [PATCH 05/37] Refactoring --- ui-ngx/src/app/shared/components/json-object-edit.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/app/shared/components/json-object-edit.component.ts b/ui-ngx/src/app/shared/components/json-object-edit.component.ts index 7d829115af..919dbace34 100644 --- a/ui-ngx/src/app/shared/components/json-object-edit.component.ts +++ b/ui-ngx/src/app/shared/components/json-object-edit.component.ts @@ -22,7 +22,7 @@ import { ActionNotificationHide, ActionNotificationShow } from '@core/notificati import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; import { CancelAnimationFrame, RafService } from '@core/services/raf.service'; -import {guid, isDefinedAndNotNull, isObject, isUndefined} from '@core/utils'; +import { guid, isDefinedAndNotNull, isObject, isUndefined } from '@core/utils'; import { ResizeObserver } from '@juggle/resize-observer'; import { getAce } from '@shared/models/ace/ace.models'; From 21599386df69ca363ec9fefbd969429292edb4b3 Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Tue, 19 Apr 2022 16:21:10 +0300 Subject: [PATCH 06/37] Added icon to the JSON field + change validation logic in JSON directive --- .../components/directives/tb-json-to-string.directive.ts | 7 ++++++- ui-ngx/src/app/shared/models/constants.ts | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ui-ngx/src/app/shared/components/directives/tb-json-to-string.directive.ts b/ui-ngx/src/app/shared/components/directives/tb-json-to-string.directive.ts index ff8d2adead..dd2b79a044 100644 --- a/ui-ngx/src/app/shared/components/directives/tb-json-to-string.directive.ts +++ b/ui-ngx/src/app/shared/components/directives/tb-json-to-string.directive.ts @@ -26,6 +26,7 @@ import { Validator } from '@angular/forms'; import { ErrorStateMatcher } from '@angular/material/core'; +import {isObject} from "@core/utils"; @Directive({ selector: '[tb-json-to-string]', @@ -53,7 +54,11 @@ export class TbJsonToStringDirective implements ControlValueAccessor, Validator, @HostListener('input', ['$event.target.value']) input(newValue: any): void { try { this.data = JSON.parse(newValue); - this.parseError = false; + if (isObject(this.data)) { + this.parseError = false; + } else { + this.parseError = true; + } } catch (e) { this.parseError = true; } diff --git a/ui-ngx/src/app/shared/models/constants.ts b/ui-ngx/src/app/shared/models/constants.ts index 4bfce6414a..7eab516ef2 100644 --- a/ui-ngx/src/app/shared/models/constants.ts +++ b/ui-ngx/src/app/shared/models/constants.ts @@ -200,7 +200,7 @@ export const valueTypesMap = new Map( ValueType.JSON, { name: 'value.json', - icon: 'mdi:json' + icon: 'mdi:code-json' } ] ] From 607f3cd1969b4ac501dde9d9ce98a0bbb02dde1e Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Tue, 19 Apr 2022 16:39:56 +0300 Subject: [PATCH 07/37] Refactoring --- .../shared/components/directives/tb-json-to-string.directive.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/app/shared/components/directives/tb-json-to-string.directive.ts b/ui-ngx/src/app/shared/components/directives/tb-json-to-string.directive.ts index dd2b79a044..7ef523e7d0 100644 --- a/ui-ngx/src/app/shared/components/directives/tb-json-to-string.directive.ts +++ b/ui-ngx/src/app/shared/components/directives/tb-json-to-string.directive.ts @@ -26,7 +26,7 @@ import { Validator } from '@angular/forms'; import { ErrorStateMatcher } from '@angular/material/core'; -import {isObject} from "@core/utils"; +import { isObject } from "@core/utils"; @Directive({ selector: '[tb-json-to-string]', From 76a0636ce9f6387f2e267cb9b59d30be89d48e86 Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Wed, 20 Apr 2022 17:04:35 +0300 Subject: [PATCH 08/37] Fixed label in horizontal bar widget --- .../widget/lib/canvas-digital-gauge.ts | 18 +++++++++++------- .../components/widget/lib/digital-gauge.ts | 7 +++++-- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts b/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts index 0ec92e474c..899c0fe32b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts @@ -86,6 +86,9 @@ export interface CanvasDigitalGaugeOptions extends GenericOptions { colorTicks?: string; tickWidth?: number; + labelTimestamp?: string + unitTitle?: string; + showUnitTitle?: boolean; showTimestamp?: boolean; } @@ -362,7 +365,7 @@ export class CanvasDigitalGauge extends BaseGauge { const options = this.options as CanvasDigitalGaugeOptions; const elementClone = canvas.elementClone as HTMLCanvasElementClone; if (!elementClone.initialized) { - const context = canvas.contextClone; + let context = canvas.contextClone; // clear the cache context.clearRect(x, y, w, h); @@ -378,8 +381,9 @@ export class CanvasDigitalGauge extends BaseGauge { drawDigitalTitle(context, options); - if (!options.showTimestamp) { - drawDigitalLabel(context, options); + if (options.showUnitTitle) { + drawDigitalLabel(context, options, options.unitTitle); + context['barDimensions'].labelY += 20; } drawDigitalMinMax(context, options); @@ -406,7 +410,7 @@ export class CanvasDigitalGauge extends BaseGauge { drawDigitalValue(context, options, this.elementValueClone.renderedValue); if (options.showTimestamp) { - drawDigitalLabel(context, options); + drawDigitalLabel(context, options, options.labelTimestamp); this.elementValueClone.renderedTimestamp = this.timestamp; } @@ -751,8 +755,8 @@ function drawDigitalTitle(context: DigitalGaugeCanvasRenderingContext2D, options context.restore(); } -function drawDigitalLabel(context: DigitalGaugeCanvasRenderingContext2D, options: CanvasDigitalGaugeOptions) { - if (!options.label || options.label === '') { +function drawDigitalLabel(context: DigitalGaugeCanvasRenderingContext2D, options: CanvasDigitalGaugeOptions, text: string) { + if (!text || text === '') { return; } @@ -766,7 +770,7 @@ function drawDigitalLabel(context: DigitalGaugeCanvasRenderingContext2D, options context.textAlign = 'center'; context.font = Drawings.font(options, 'Label', fontSizeFactor); context.lineWidth = 0; - drawText(context, options, 'Label', options.label, textX, textY); + drawText(context, options, 'Label', text, textX, textY); context.restore(); } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/digital-gauge.ts b/ui-ngx/src/app/modules/home/components/widget/lib/digital-gauge.ts index 61a18bf52e..4da6e8fb98 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/digital-gauge.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/digital-gauge.ts @@ -72,6 +72,7 @@ export class TbCanvasDigitalGauge { (settings.unitTitle && settings.unitTitle.length > 0 ? settings.unitTitle : dataKey.label) : ''); + this.localSettings.showUnitTitle = settings.showUnitTitle === true; this.localSettings.showTimestamp = settings.showTimestamp === true; this.localSettings.timestampFormat = settings.timestampFormat && settings.timestampFormat.length ? settings.timestampFormat : 'yyyy-MM-dd HH:mm:ss'; @@ -188,7 +189,9 @@ export class TbCanvasDigitalGauge { roundedLineCap: this.localSettings.roundedLineCap, symbol: this.localSettings.units, - label: this.localSettings.unitTitle, + // label: this.localSettings.unitTitle, + unitTitle: this.localSettings.unitTitle, + showUnitTitle: this.localSettings.showUnitTitle, showTimestamp: this.localSettings.showTimestamp, hideValue: this.localSettings.hideValue, hideMinMax: this.localSettings.hideMinMax, @@ -407,7 +410,7 @@ export class TbCanvasDigitalGauge { if (this.localSettings.showTimestamp) { timestamp = tvPair[0]; const filter = this.ctx.$injector.get(DatePipe); - (this.gauge.options as CanvasDigitalGaugeOptions).label = + (this.gauge.options as CanvasDigitalGaugeOptions).labelTimestamp = filter.transform(timestamp, this.localSettings.timestampFormat); } const value = tvPair[1]; From 1f94e3d234c2d2ebcfdf4665e23b300621f262f2 Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Thu, 21 Apr 2022 16:45:55 +0300 Subject: [PATCH 09/37] Fix label scaling --- .../widget/lib/canvas-digital-gauge.ts | 43 ++++++++++++------- .../components/widget/lib/digital-gauge.ts | 1 - 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts b/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts index 899c0fe32b..bd37512dcc 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts @@ -47,7 +47,6 @@ export interface CanvasDigitalGaugeOptions extends GenericOptions { gaugeColor?: string; levelColors?: levelColors; symbol?: string; - label?: string; hideValue?: boolean; hideMinMax?: boolean; fontTitle?: string; @@ -148,6 +147,7 @@ interface DigitalGaugeCanvasRenderingContext2D extends CanvasRenderingContext2D } interface BarDimensions { + timeseriesLabelY?: number; baseX: number; baseY: number; width: number; @@ -365,7 +365,7 @@ export class CanvasDigitalGauge extends BaseGauge { const options = this.options as CanvasDigitalGaugeOptions; const elementClone = canvas.elementClone as HTMLCanvasElementClone; if (!elementClone.initialized) { - let context = canvas.contextClone; + const context: DigitalGaugeCanvasRenderingContext2D = canvas.contextClone; // clear the cache context.clearRect(x, y, w, h); @@ -382,8 +382,7 @@ export class CanvasDigitalGauge extends BaseGauge { drawDigitalTitle(context, options); if (options.showUnitTitle) { - drawDigitalLabel(context, options, options.unitTitle); - context['barDimensions'].labelY += 20; + drawDigitalLabel(context, options, options.unitTitle, 'labelY'); } drawDigitalMinMax(context, options); @@ -410,7 +409,7 @@ export class CanvasDigitalGauge extends BaseGauge { drawDigitalValue(context, options, this.elementValueClone.renderedValue); if (options.showTimestamp) { - drawDigitalLabel(context, options, options.labelTimestamp); + drawDigitalLabel(context, options, options.labelTimestamp, 'timeseriesLabelY'); this.elementValueClone.renderedTimestamp = this.timestamp; } @@ -568,11 +567,12 @@ function barDimensions(context: DigitalGaugeCanvasRenderingContext2D, if (options.gaugeType === 'donut') { bd.fontValueBaseline = 'middle'; - if (options.label && options.label.length > 0) { + if (options.showUnitTitle || options.showTimestamp) { const valueHeight = determineFontHeight(options, 'Value', bd.fontSizeFactor).height; const labelHeight = determineFontHeight(options, 'Label', bd.fontSizeFactor).height; const total = valueHeight + labelHeight; bd.labelY = bd.Cy + total / 2; + bd.timeseriesLabelY = determineTimeseriesLabelY(options, bd.labelY, bd.fontSizeFactor) bd.valueY = bd.Cy - total / 2 + valueHeight / 2; } else { bd.valueY = bd.Cy; @@ -581,6 +581,7 @@ function barDimensions(context: DigitalGaugeCanvasRenderingContext2D, bd.titleY = bd.Cy - bd.Ro - 12 * bd.fontSizeFactor; bd.valueY = bd.Cy; bd.labelY = bd.Cy + (8 + options.fontLabelSize) * bd.fontSizeFactor; + bd.timeseriesLabelY = determineTimeseriesLabelY(options, bd.labelY, bd.fontSizeFactor) bd.minY = bd.maxY = bd.labelY; if (options.roundedLineCap) { bd.minY += bd.strokeWidth / 2; @@ -599,8 +600,9 @@ function barDimensions(context: DigitalGaugeCanvasRenderingContext2D, bd.barTop = bd.valueY + 8 * bd.fontSizeFactor; bd.barBottom = bd.barTop + bd.strokeWidth; - if (options.hideMinMax && options.label === '') { + if (options.hideMinMax && !options.showUnitTitle && !options.showTimestamp) { bd.labelY = bd.barBottom; + bd.timeseriesLabelY = determineTimeseriesLabelY(options, bd.labelY, bd.fontSizeFactor) bd.barLeft = bd.origBaseX + options.fontMinMaxSize / 3 * bd.fontSizeFactor; bd.barRight = bd.origBaseX + w + /*bd.width*/ -options.fontMinMaxSize / 3 * bd.fontSizeFactor; } else { @@ -613,6 +615,7 @@ function barDimensions(context: DigitalGaugeCanvasRenderingContext2D, bd.barLeft = bd.minX; bd.barRight = bd.maxX; bd.labelY = bd.barBottom + (8 + options.fontLabelSize) * bd.fontSizeFactor; + bd.timeseriesLabelY = determineTimeseriesLabelY(options, bd.labelY, bd.fontSizeFactor) bd.minY = bd.maxY = bd.labelY; } } else if (options.gaugeType === 'verticalBar') { @@ -622,14 +625,14 @@ function barDimensions(context: DigitalGaugeCanvasRenderingContext2D, bd.valueY = bd.titleBottom + (options.hideValue ? 0 : options.fontValueSize * bd.fontSizeFactor); bd.barTop = bd.valueY + 8 * bd.fontSizeFactor; - bd.labelY = bd.baseY + bd.height - 16; - if (options.label === '') { - bd.barBottom = bd.labelY; + bd.labelY = bd.baseY + bd.height; + bd.timeseriesLabelY = determineTimeseriesLabelY(options, bd.labelY, bd.fontSizeFactor) + if (options.showUnitTitle || options.showTimestamp) { + bd.barBottom = bd.labelY * 1.1 - (8 + options.fontLabelSize) * bd.fontSizeFactor; } else { - bd.barBottom = bd.labelY - (8 + options.fontLabelSize) * bd.fontSizeFactor; + bd.barBottom = bd.labelY } - bd.minX = bd.maxX = - bd.baseX + bd.width / 2 + bd.strokeWidth / 2 + options.fontMinMaxSize / 3 * bd.fontSizeFactor; + bd.minX = bd.maxX = bd.baseX + bd.width / 2 + bd.strokeWidth / 2 + options.fontMinMaxSize / 3 * bd.fontSizeFactor; bd.minY = bd.barBottom; bd.maxY = bd.barTop; bd.fontMinMaxBaseline = 'middle'; @@ -661,6 +664,14 @@ function barDimensions(context: DigitalGaugeCanvasRenderingContext2D, return bd; } + +function determineTimeseriesLabelY(options: CanvasDigitalGaugeOptions, labelY: number, fontSizeFactor: number){ + if (options.showUnitTitle) { + return labelY + options.fontLabelSize * fontSizeFactor * 1.2; + } else { + return labelY; + } +} function determineFontHeight(options: CanvasDigitalGaugeOptions, target: string, baseSize: number): FontHeightInfo { const fontStyleStr = 'font-style:' + options['font' + target + 'Style'] + ';font-weight:' + options['font' + target + 'Weight'] + ';font-size:' + @@ -755,16 +766,16 @@ function drawDigitalTitle(context: DigitalGaugeCanvasRenderingContext2D, options context.restore(); } -function drawDigitalLabel(context: DigitalGaugeCanvasRenderingContext2D, options: CanvasDigitalGaugeOptions, text: string) { +function drawDigitalLabel(context: DigitalGaugeCanvasRenderingContext2D, options: CanvasDigitalGaugeOptions, text: string, nameTextY: string) { if (!text || text === '') { return; } - const {labelY, baseX, width, fontSizeFactor} = + const {baseX, width, fontSizeFactor} = context.barDimensions; const textX = Math.round(baseX + width / 2); - const textY = labelY; + const textY = context.barDimensions[nameTextY]; context.save(); context.textAlign = 'center'; diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/digital-gauge.ts b/ui-ngx/src/app/modules/home/components/widget/lib/digital-gauge.ts index 4da6e8fb98..cd0ff5d007 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/digital-gauge.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/digital-gauge.ts @@ -189,7 +189,6 @@ export class TbCanvasDigitalGauge { roundedLineCap: this.localSettings.roundedLineCap, symbol: this.localSettings.units, - // label: this.localSettings.unitTitle, unitTitle: this.localSettings.unitTitle, showUnitTitle: this.localSettings.showUnitTitle, showTimestamp: this.localSettings.showTimestamp, From e79d1735bc3a09bd398bbaf1c0be0c0c6146fac9 Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Fri, 22 Apr 2022 11:34:55 +0300 Subject: [PATCH 10/37] Refactoring --- .../modules/home/components/widget/lib/canvas-digital-gauge.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts b/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts index bd37512dcc..b89b3344c0 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts @@ -628,7 +628,7 @@ function barDimensions(context: DigitalGaugeCanvasRenderingContext2D, bd.labelY = bd.baseY + bd.height; bd.timeseriesLabelY = determineTimeseriesLabelY(options, bd.labelY, bd.fontSizeFactor) if (options.showUnitTitle || options.showTimestamp) { - bd.barBottom = bd.labelY * 1.1 - (8 + options.fontLabelSize) * bd.fontSizeFactor; + bd.barBottom = bd.labelY - options.fontLabelSize * bd.fontSizeFactor; } else { bd.barBottom = bd.labelY } From 757e4d2a4335d99fb1abdb96f890e7e20b9e162b Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Fri, 22 Apr 2022 11:43:40 +0300 Subject: [PATCH 11/37] Refactoring --- .../modules/home/components/widget/lib/canvas-digital-gauge.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts b/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts index b89b3344c0..e75a5a4c4f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts @@ -664,7 +664,6 @@ function barDimensions(context: DigitalGaugeCanvasRenderingContext2D, return bd; } - function determineTimeseriesLabelY(options: CanvasDigitalGaugeOptions, labelY: number, fontSizeFactor: number){ if (options.showUnitTitle) { return labelY + options.fontLabelSize * fontSizeFactor * 1.2; @@ -672,6 +671,7 @@ function determineTimeseriesLabelY(options: CanvasDigitalGaugeOptions, labelY: n return labelY; } } + function determineFontHeight(options: CanvasDigitalGaugeOptions, target: string, baseSize: number): FontHeightInfo { const fontStyleStr = 'font-style:' + options['font' + target + 'Style'] + ';font-weight:' + options['font' + target + 'Weight'] + ';font-size:' + From 285ec0f9055e37ef848bb1453662ef8a22141cbf Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Fri, 22 Apr 2022 13:11:50 +0300 Subject: [PATCH 12/37] Delete default label field --- .../modules/home/components/widget/lib/canvas-digital-gauge.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts b/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts index e75a5a4c4f..e550148df1 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/canvas-digital-gauge.ts @@ -102,7 +102,6 @@ const defaultDigitalGaugeOptions: CanvasDigitalGaugeOptions = { ...GenericOption levelColors: ['blue'], symbol: '', - label: '', hideValue: false, hideMinMax: false, From 7e500c5237bc979408d8831f9628993929527e92 Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Tue, 26 Apr 2022 12:48:47 +0300 Subject: [PATCH 13/37] fix trip animation map --- .../trip-animation/trip-animation.component.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/trip-animation/trip-animation.component.ts b/ui-ngx/src/app/modules/home/components/widget/trip-animation/trip-animation.component.ts index 7db38e2416..2c30bf4e05 100644 --- a/ui-ngx/src/app/modules/home/components/widget/trip-animation/trip-animation.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/trip-animation/trip-animation.component.ts @@ -136,14 +136,12 @@ export class TripAnimationComponent implements OnInit, AfterViewInit, OnDestroy item => this.clearIncorrectFirsLastDatapoint(item)).filter(arr => arr.length); this.interpolatedTimeData.length = 0; this.formattedInterpolatedTimeData.length = 0; - if (this.historicalData.length) { - const prevMinTime = this.minTime; - const prevMaxTime = this.maxTime; - this.calculateIntervals(); - const currentTime = this.calculateCurrentTime(prevMinTime, prevMaxTime); - if (currentTime !== this.currentTime) { - this.timeUpdated(currentTime); - } + const prevMinTime = this.minTime; + const prevMaxTime = this.maxTime; + this.calculateIntervals(); + const currentTime = this.calculateCurrentTime(prevMinTime, prevMaxTime); + if (currentTime !== this.currentTime) { + this.timeUpdated(currentTime); } this.mapWidget.map.map?.invalidateSize(); this.mapWidget.map.setLoading(false); From b64e3149be5dc9f2bfd35dc0c593f2de61284ae2 Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Tue, 26 Apr 2022 12:49:47 +0300 Subject: [PATCH 14/37] Refactoring --- .../components/widget/trip-animation/trip-animation.component.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/trip-animation/trip-animation.component.ts b/ui-ngx/src/app/modules/home/components/widget/trip-animation/trip-animation.component.ts index 2c30bf4e05..db1e53790d 100644 --- a/ui-ngx/src/app/modules/home/components/widget/trip-animation/trip-animation.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/trip-animation/trip-animation.component.ts @@ -48,7 +48,6 @@ import { import { FormattedData, JsonSettingsSchema, WidgetConfig } from '@shared/models/widget.models'; import moment from 'moment'; import { - deepClone, formattedDataArrayFromDatasourceData, formattedDataFormDatasourceData, isDefined, isUndefined, mergeFormattedData, From c21927665d2329e2d37e22b947f7260ee9754bfe Mon Sep 17 00:00:00 2001 From: Volodymyr Babak Date: Tue, 3 May 2022 18:43:36 +0300 Subject: [PATCH 15/37] Fixed device profile with non default transport delivery to edge --- .../java/org/thingsboard/server/edge/BaseEdgeTest.java | 8 +++++++- .../device/profile/TransportPayloadTypeConfiguration.java | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java index e815378d27..61bb53b060 100644 --- a/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/BaseEdgeTest.java @@ -58,6 +58,8 @@ import org.thingsboard.server.common.data.device.profile.AlarmRule; import org.thingsboard.server.common.data.device.profile.AllowCreateNewDevicesDeviceProfileProvisionConfiguration; import org.thingsboard.server.common.data.device.profile.DeviceProfileAlarm; import org.thingsboard.server.common.data.device.profile.DeviceProfileData; +import org.thingsboard.server.common.data.device.profile.JsonTransportPayloadConfiguration; +import org.thingsboard.server.common.data.device.profile.MqttDeviceProfileTransportConfiguration; import org.thingsboard.server.common.data.device.profile.SimpleAlarmConditionSpec; import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.EdgeEvent; @@ -199,7 +201,11 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { private void installation() throws Exception { edge = doPost("/api/edge", constructEdge("Test Edge", "test"), Edge.class); - DeviceProfile deviceProfile = this.createDeviceProfile(CUSTOM_DEVICE_PROFILE_NAME); + MqttDeviceProfileTransportConfiguration transportConfiguration = new MqttDeviceProfileTransportConfiguration(); + transportConfiguration.setTransportPayloadTypeConfiguration(new JsonTransportPayloadConfiguration()); + + DeviceProfile deviceProfile = this.createDeviceProfile(CUSTOM_DEVICE_PROFILE_NAME, transportConfiguration); + extendDeviceProfileData(deviceProfile); doPost("/api/deviceProfile", deviceProfile, DeviceProfile.class); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/device/profile/TransportPayloadTypeConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/device/profile/TransportPayloadTypeConfiguration.java index 7129ba8846..4d229a3706 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/device/profile/TransportPayloadTypeConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/device/profile/TransportPayloadTypeConfiguration.java @@ -21,6 +21,8 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import org.thingsboard.server.common.data.TransportPayloadType; +import java.io.Serializable; + @JsonIgnoreProperties(ignoreUnknown = true) @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, @@ -29,7 +31,7 @@ import org.thingsboard.server.common.data.TransportPayloadType; @JsonSubTypes({ @JsonSubTypes.Type(value = JsonTransportPayloadConfiguration.class, name = "JSON"), @JsonSubTypes.Type(value = ProtoTransportPayloadConfiguration.class, name = "PROTOBUF")}) -public interface TransportPayloadTypeConfiguration { +public interface TransportPayloadTypeConfiguration extends Serializable { @JsonIgnore TransportPayloadType getTransportPayloadType(); From 5f548f2179cfe016563bb8ce40cb68907ea0cd68 Mon Sep 17 00:00:00 2001 From: Jan Christoph Bernack Date: Wed, 4 May 2022 17:45:46 +0200 Subject: [PATCH 16/37] use coap piggybacked responses if possible --- .../transport/coap/CoapTransportResource.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java b/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java index 3e291a8177..86ac404aa2 100644 --- a/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java +++ b/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java @@ -169,7 +169,7 @@ public class CoapTransportResource extends AbstractCoapTransportResource { } private void processProvision(CoapExchange exchange) { - exchange.accept(); + deferAccept(exchange); try { UUID sessionId = UUID.randomUUID(); log.trace("[{}] Processing provision publish msg [{}]!", sessionId, exchange.advanced().getRequest()); @@ -195,7 +195,7 @@ public class CoapTransportResource extends AbstractCoapTransportResource { private void processRequest(CoapExchange exchange, SessionMsgType type) { log.trace("Processing {}", exchange.advanced().getRequest()); - exchange.accept(); + deferAccept(exchange); Exchange advanced = exchange.advanced(); Request request = advanced.getRequest(); @@ -346,6 +346,16 @@ public class CoapTransportResource extends AbstractCoapTransportResource { new CoapNoOpCallback(exchange)); } + /** + * Send an empty ACK if we are unable to send the full response within the timeout. + * If the full response is transmitted before the timeout this will not do anything. + * If this is triggered the full response will be sent in a separate CON/NON message. + * Essentially this allows the use of piggybacked responses. + */ + private void deferAccept(CoapExchange exchange) { + transportContext.getScheduler().schedule(exchange::accept, 500, TimeUnit.MILLISECONDS); + } + private UUID toSessionId(TransportProtos.SessionInfoProto sessionInfoProto) { return new UUID(sessionInfoProto.getSessionIdMSB(), sessionInfoProto.getSessionIdLSB()); } From 80b7b9cee9858f9635131d7d29555f8763051a51 Mon Sep 17 00:00:00 2001 From: Jan Christoph Bernack Date: Wed, 4 May 2022 17:54:49 +0200 Subject: [PATCH 17/37] add config parameter: transport.coap.piggyback_timeout --- application/src/main/resources/thingsboard.yml | 1 + .../org/thingsboard/server/coapserver/CoapServerContext.java | 4 ++++ .../org/thingsboard/server/coapserver/CoapServerService.java | 2 ++ .../server/coapserver/DefaultCoapServerService.java | 5 +++++ .../server/transport/coap/CoapTransportResource.java | 4 +++- transport/coap/src/main/resources/tb-coap-transport.yml | 1 + 6 files changed, 16 insertions(+), 1 deletion(-) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 0aa7b3bb66..176b89b41d 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -703,6 +703,7 @@ transport: bind_address: "${COAP_BIND_ADDRESS:0.0.0.0}" bind_port: "${COAP_BIND_PORT:5683}" timeout: "${COAP_TIMEOUT:10000}" + piggyback_timeout: "${COAP_PIGGYBACK_TIMEOUT:500}" psm_activity_timer: "${COAP_PSM_ACTIVITY_TIMER:10000}" paging_transmission_window: "${COAP_PAGING_TRANSMISSION_WINDOW:10000}" dtls: diff --git a/common/coap-server/src/main/java/org/thingsboard/server/coapserver/CoapServerContext.java b/common/coap-server/src/main/java/org/thingsboard/server/coapserver/CoapServerContext.java index dda014da4c..8b448a1bcd 100644 --- a/common/coap-server/src/main/java/org/thingsboard/server/coapserver/CoapServerContext.java +++ b/common/coap-server/src/main/java/org/thingsboard/server/coapserver/CoapServerContext.java @@ -38,6 +38,10 @@ public class CoapServerContext { @Value("${transport.coap.timeout}") private Long timeout; + @Getter + @Value("${transport.coap.piggyback_timeout}") + private Long piggybackTimeout; + @Getter @Value("${transport.coap.psm_activity_timer:10000}") private long psmActivityTimer; diff --git a/common/coap-server/src/main/java/org/thingsboard/server/coapserver/CoapServerService.java b/common/coap-server/src/main/java/org/thingsboard/server/coapserver/CoapServerService.java index 8dbbc5a620..8d38b67d9c 100644 --- a/common/coap-server/src/main/java/org/thingsboard/server/coapserver/CoapServerService.java +++ b/common/coap-server/src/main/java/org/thingsboard/server/coapserver/CoapServerService.java @@ -29,4 +29,6 @@ public interface CoapServerService { long getTimeout(); + long getPiggybackTimeout(); + } diff --git a/common/coap-server/src/main/java/org/thingsboard/server/coapserver/DefaultCoapServerService.java b/common/coap-server/src/main/java/org/thingsboard/server/coapserver/DefaultCoapServerService.java index 3aa0d0c122..b7b0bcb436 100644 --- a/common/coap-server/src/main/java/org/thingsboard/server/coapserver/DefaultCoapServerService.java +++ b/common/coap-server/src/main/java/org/thingsboard/server/coapserver/DefaultCoapServerService.java @@ -88,6 +88,11 @@ public class DefaultCoapServerService implements CoapServerService { return coapServerContext.getTimeout(); } + @Override + public long getPiggybackTimeout() { + return coapServerContext.getPiggybackTimeout(); + } + private CoapServer createCoapServer() throws UnknownHostException { Configuration networkConfig = new Configuration(); networkConfig.set(CoapConfig.BLOCKWISE_STRICT_BLOCK2_OPTION, true); diff --git a/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java b/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java index 86ac404aa2..983aec497c 100644 --- a/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java +++ b/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java @@ -69,6 +69,7 @@ public class CoapTransportResource extends AbstractCoapTransportResource { private final ConcurrentMap dtlsSessionsMap; private final long timeout; + private final long piggybackTimeout; private final CoapClientContext clients; public CoapTransportResource(CoapTransportContext ctx, CoapServerService coapServerService, String name) { @@ -77,6 +78,7 @@ public class CoapTransportResource extends AbstractCoapTransportResource { this.addObserver(new CoapResourceObserver()); this.dtlsSessionsMap = coapServerService.getDtlsSessionsMap(); this.timeout = coapServerService.getTimeout(); + this.piggybackTimeout = coapServerService.getPiggybackTimeout(); this.clients = ctx.getClientContext(); long sessionReportTimeout = ctx.getSessionReportTimeout(); ctx.getScheduler().scheduleAtFixedRate(clients::reportActivity, new Random().nextInt((int) sessionReportTimeout), sessionReportTimeout, TimeUnit.MILLISECONDS); @@ -353,7 +355,7 @@ public class CoapTransportResource extends AbstractCoapTransportResource { * Essentially this allows the use of piggybacked responses. */ private void deferAccept(CoapExchange exchange) { - transportContext.getScheduler().schedule(exchange::accept, 500, TimeUnit.MILLISECONDS); + transportContext.getScheduler().schedule(exchange::accept, piggybackTimeout, TimeUnit.MILLISECONDS); } private UUID toSessionId(TransportProtos.SessionInfoProto sessionInfoProto) { diff --git a/transport/coap/src/main/resources/tb-coap-transport.yml b/transport/coap/src/main/resources/tb-coap-transport.yml index f4717c418d..e53752abfe 100644 --- a/transport/coap/src/main/resources/tb-coap-transport.yml +++ b/transport/coap/src/main/resources/tb-coap-transport.yml @@ -89,6 +89,7 @@ transport: bind_address: "${COAP_BIND_ADDRESS:0.0.0.0}" bind_port: "${COAP_BIND_PORT:5683}" timeout: "${COAP_TIMEOUT:10000}" + piggyback_timeout: "${COAP_PIGGYBACK_TIMEOUT:500}" psm_activity_timer: "${COAP_PSM_ACTIVITY_TIMER:10000}" paging_transmission_window: "${COAP_PAGING_TRANSMISSION_WINDOW:10000}" dtls: From 8d141a7f788536f66a7d11a5cfe565e1d517ade0 Mon Sep 17 00:00:00 2001 From: fe-dev Date: Fri, 13 May 2022 15:40:29 +0300 Subject: [PATCH 18/37] UI: Add seter isDirty for rulechain page --- .../modules/home/pages/rulechain/rulechain-page.component.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.ts b/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.ts index 67b307662c..843616cce0 100644 --- a/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.ts +++ b/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.ts @@ -89,6 +89,10 @@ export class RuleChainPageComponent extends PageComponent return this.isDirtyValue || this.isImport; } + set isDirty(value: boolean) { + this.isDirtyValue = value; + } + @HostBinding('style.width') width = '100%'; @HostBinding('style.height') height = '100%'; From 6534db8ed2932931578be9cc52277657c2242f7d Mon Sep 17 00:00:00 2001 From: Jan Christoph Bernack Date: Fri, 13 May 2022 14:54:50 +0200 Subject: [PATCH 19/37] add fallback for piggybackTimeout of zero --- .../server/transport/coap/CoapTransportResource.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java b/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java index 983aec497c..0016cc05d8 100644 --- a/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java +++ b/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java @@ -355,7 +355,11 @@ public class CoapTransportResource extends AbstractCoapTransportResource { * Essentially this allows the use of piggybacked responses. */ private void deferAccept(CoapExchange exchange) { - transportContext.getScheduler().schedule(exchange::accept, piggybackTimeout, TimeUnit.MILLISECONDS); + if (piggybackTimeout > 0) { + transportContext.getScheduler().schedule(exchange::accept, piggybackTimeout, TimeUnit.MILLISECONDS); + } else { + exchange.accept(); + } } private UUID toSessionId(TransportProtos.SessionInfoProto sessionInfoProto) { From e114f4d67dc7c81e4fd15fee606da8db999540ee Mon Sep 17 00:00:00 2001 From: blackstar-baba <535650957@qq.com> Date: Mon, 23 May 2022 11:05:36 +0800 Subject: [PATCH 20/37] add chinese translations for edge --- .../assets/locale/locale.constant-zh_CN.json | 197 +++++++++++++++++- 1 file changed, 195 insertions(+), 2 deletions(-) diff --git a/ui-ngx/src/assets/locale/locale.constant-zh_CN.json b/ui-ngx/src/assets/locale/locale.constant-zh_CN.json index 11e34c9102..6d8aa21ca1 100644 --- a/ui-ngx/src/assets/locale/locale.constant-zh_CN.json +++ b/ui-ngx/src/assets/locale/locale.constant-zh_CN.json @@ -312,6 +312,11 @@ "filter-type-device-type": "设备类型", "filter-type-device-type-and-name-description": "类型为 '{{deviceType}}' 且以 '{{prefix}}' 开头的设备", "filter-type-device-type-description": "类型为 '{{deviceType}}' 的设备", + "filter-type-edge-type": "边缘类型", + "filter-type-edge-type-description": "类型为 '{{edgeType}}' 的边缘", + "filter-type-edge-type-and-name-description": "类型为 '{{edgeType}}' 且以 '{{prefix}}' 开头的边缘", + "filter-type-edge-search-query": "边缘搜索查询", + "filter-type-edge-search-query-description": "类型为 {{edgeTypes}} 且具有 {{relationType}} 关联 {{direction}} {{rootEntity}} 的边缘", "filter-type-entity-list": "实体列表", "filter-type-entity-name": "实体名称", "filter-type-entity-view-search-query": "实体视图搜索查询", @@ -409,6 +414,8 @@ "assets": "资产", "assign-asset-to-customer": "将资产分配给客户", "assign-asset-to-customer-text": "请选择要分配给客户的资产", + "assign-asset-to-edge-text": "请选择要分配给边缘的资产", + "assign-asset-to-edge-title": "将资产分配给边缘", "assign-assets": "分配资产", "assign-assets-text": "分配 { count, plural, 1 {# 个资产} other {# 个资产} } 给客户", "assign-new-asset": "分配新资产", @@ -451,6 +458,9 @@ "type": "类型", "type-required": "类型必填。", "unassign-asset": "未分配资产", + "unassign-asset-from-edge": "取消分配边缘", + "unassign-asset-from-edge-text": "确认后,所有选定的资产将被分配,边缘无法访问。", + "unassign-asset-from-edge-title": "您确定要取消对'{{assetName}}'资产的分配吗?", "unassign-asset-text": "确认后,资产将未分配,客户无法访问。", "unassign-asset-title": "您确定要取消对'{{assetName}}'资产的分配吗?", "unassign-assets": "取消分配资产", @@ -458,6 +468,9 @@ "unassign-assets-text": "确认后,所有选定的资产将被分配,客户无法访问。", "unassign-assets-title": "您确定要取消分配 { count, plural, 1 {# 个资产} other {# 个资产} }吗?", "unassign-from-customer": "取消分配客户", + "unassign-assets-from-edge": "取消分配边缘", + "unassign-assets-from-edge-text": "确认后,所有选定的资产将被分配,边缘无法访问。", + "unassign-assets-from-edge-title": "您确定要取消分配 { count, plural, 1 {1 资产} other {# 个资产} }吗?", "view-assets": "查看资产" }, "attribute": { @@ -512,6 +525,7 @@ "type-alarm-clear": "已清除", "type-assigned-from-tenant": "从租户分配", "type-assigned-to-customer": "分配给客户", + "type-assigned-to-edge": "分配给边缘", "type-assigned-to-tenant": "分配给租户", "type-attributes-deleted": "删除属性", "type-attributes-read": "读取属性", @@ -532,6 +546,7 @@ "type-timeseries-deleted": "遥测数据已删除", "type-timeseries-updated": "遥测数据已更新", "type-unassigned-from-customer": "未分配给客户", + "type-unassigned-from-edge": "未分配给边缘", "type-updated": "更新", "user": "用户" }, @@ -603,6 +618,7 @@ "description": "说明", "details": "详情", "devices": "客户设备", + "edges": "客户边缘实例", "entity-views": "客户实体视图", "events": "事件", "idCopiedMessage": "客户ID已复制到粘贴板", @@ -610,12 +626,15 @@ "manage-customer-assets": "管理客户资产", "manage-customer-dashboards": "管理客户仪表板", "manage-customer-devices": "管理客户设备", + "manage-customer-edges": "管理客户边缘", "manage-customer-users": "管理客户用户", "manage-dashboards": "管理仪表板", "manage-devices": "管理设备", + "manage-edges": "管理边缘", "manage-public-assets": "管理公共资产", "manage-public-dashboards": "管理公共仪表板", "manage-public-devices": "管理公共设备", + "manage-public-edges": "管理公共边缘", "manage-users": "管理用户", "management": "客户管理", "no-customers-matching": "没有找到匹配 '{{entity}}' 的客户。", @@ -624,6 +643,7 @@ "public-dashboards": "公共仪表板", "public-devices": "公共设备", "public-entity-views": "公共实体视图", + "public-edges": "公共边缘", "search": "查找客户", "select-customer": "选择客户", "select-default-customer": "选择默认的客户", @@ -639,6 +659,9 @@ "alias-resolution-error-title": "仪表板别名配置错误", "assign-dashboard-to-customer": "将仪表板分配给客户", "assign-dashboard-to-customer-text": "请选择要分配给客户的仪表板", + "assign-dashboard-to-edge": "将仪表板分配给边缘", + "assign-dashboard-to-edge-text": "请选择要分配给边缘的仪表板", + "assign-dashboard-to-edge-title": "将仪表板分配给边缘", "assign-dashboards": "分配仪表板", "assign-dashboards-text": "分配 { count, plural, 1 {# 个仪表板} other {# 个仪表板} } 给客户", "assign-new-dashboard": "分配新的仪表板", @@ -773,6 +796,7 @@ "title-required": "标题必填。", "toolbar-always-open": "工具栏常驻", "unassign-dashboard": "取消分配仪表板", + "unassign-dashboard-from-edge-text": "确认后,所有选定的仪表板将被取消分配,边缘将无法访问。", "unassign-dashboard-text": "确认后,面板将被取消分配,客户将无法访问。", "unassign-dashboard-title": "您确定要取消分配仪表板 '{{dashboardTitle}}'吗?", "unassign-dashboards": "取消分配仪表板", @@ -780,6 +804,8 @@ "unassign-dashboards-action-title": "取消分配此客户 { count, plural, 1 {# 个仪表板} other {# 个仪表板} }", "unassign-dashboards-text": "确认后,所有选定的仪表板将被取消分配,客户将无法访问。", "unassign-dashboards-title": "确定要取消分配仪表板 { count, plural, 1 {# 个仪表板} other {# 个仪表板} } 吗?", + "unassign-dashboards-from-edge-text": "确认后,所有选定的仪表板将被取消分配,边缘将无法访问。", + "unassign-dashboards-from-edge-title": "确定要取消分配仪表板 { count, plural, 1 {# 个仪表板} other {# 个仪表板} } 吗?", "unassign-from-customer": "取消分配客户", "unassign-from-customers": "客户未分配仪表板", "unassign-from-customers-text": "请选择从仪表板中取消分配的客户", @@ -1021,6 +1047,8 @@ "any-device": "任意设备", "assign-device-to-customer": "将设备分配给客户", "assign-device-to-customer-text": "请选择要分配给客户的设备", + "assign-device-to-edge-text":"请选择要分配给边缘的设备", + "assign-device-to-edge-title": "将设备分配给边缘", "assign-devices": "分配设备", "assign-devices-text": "将 {count,plural,1 {# 个设备} other {# 个设备} }分配给客户", "assign-new-device": "分配新设备", @@ -1106,8 +1134,13 @@ "unassign-device": "取消分配设备", "unassign-device-text": "确认后,设备将被取消分配,客户将无法访问。", "unassign-device-title": "您确定要取消分配设备 '{{deviceName}}'?", + "unassign-device-from-edge-text": "确认后,设备将被取消分配,边缘将无法访问。", + "unassign-device-from-edge-title": "您确定要取消分配设备 '{{deviceName}}'?", "unassign-devices": "取消分配设备", "unassign-devices-action-title": "取消分配此客户 {count,plural,1 {# 个设备} other {# 个设备} }", + "unassign-devices-from-edge": "取消分配边缘", + "unassign-devices-from-edge-text": "确认后,设备将被取消分配,边缘将无法访问。", + "unassign-devices-from-edge-title": "您确定要取消分配 { count, plural, 1 {1个 设备} other {# 个设备} } 吗?", "unassign-devices-text": "确认后,所有选定的设备将被取消分配,并且客户将无法访问。", "unassign-devices-title": "确定要取消分配 {count,plural,1 {# 个设备} other {# 个设备} } 吗?", "unassign-from-customer": "取消分配客户", @@ -1133,6 +1166,133 @@ "column": "列", "row": "排" }, + "edge": { + "add": "增加边缘", + "add-edge-text": "增加新的边缘", + "any-edge": "任何边缘", + "assets": "边缘资产", + "assign-edge-to-customer": "分配边缘给客户", + "assign-edge-to-customer-text": "请选择需要分配给边缘的客户", + "assign-new-edge": "分配新边缘", + "assign-to-customer": "分配给客户", + "assign-to-customer-text": "请选择需要分配给边缘的客户", + "assigned-to-customer": "分配给: {{customerTitle}}", + "assignedToCustomer": "分配给客户", + "copy-edge-key": "复制边缘键", + "copy-edge-secret": "复制边缘密钥", + "copy-id": "复制边缘编号", + "dashboard": "边缘仪表板", + "dashboards": "边缘仪表板", + "delete": "删除边缘", + "delete-edge-text": "当心, 确认后,边缘以及所有关联数据将不可恢复。", + "delete-edge-title": "您确定删除边缘 '{{edgeName}}'?", + "delete-edges-text": "当心, 确认后,选定的边缘以及所有关联数据将不可恢复。", + "delete-edges-title": "您确认删除边缘 { count, plural, 1 {1 个边缘} other {# 个边缘} }?", + "deployed": "已部署", + "description": "描述", + "details": "详情", + "devices": "边缘设备", + "downlinks": "下行", + "edge": "边缘", + "edge-assets": "边缘资产", + "edge-dashboards": "边缘仪表板", + "edge-details": "边缘详情", + "edge-devices": "边缘设备", + "edge-entity-views": "边缘实体视图", + "edge-file": "边缘文件", + "edge-instances": "边缘实例", + "edge-key": "边缘键", + "edge-key-copied-message": "边缘键已经被复制到剪切板", + "edge-public": "边缘公开", + "edge-required": "边缘必填。", + "edge-rulechains": "边缘规则链", + "edge-secret": "边缘密钥", + "edge-secret-copied-message": "边缘密钥已经被复制到剪切板", + "edge-type": "边缘类型", + "edge-type-list-empty": "没有选择边缘类型。", + "edge-type-required": "边缘类型必填。", + "edge-types": "边缘类型", + "enter-edge-type": "输入边缘类型", + "entity-id": "实体编号", + "entity-views": "边缘实体视图", + "event-action": "事件行动", + "events": "事件", + "id-copied-message": "边缘编号已经复制到剪切板", + "import": "导入边缘", + "label": "标签", + "label-max-length": "标签长度必须少于256个字符", + "load-entity-error": "加载数据失败,实体已经被删除。", + "make-private": "私有", + "make-private-edge-text": "确认后,边缘及其所有数据将被设为私有,不被其他人访问。", + "make-private-edge-title": "您确定要将边缘 '{{edgeName}}' 设为私有?", + "make-public": "公开", + "make-public-edge-text": "确认后,边缘及其所有数据将被设为公开并可被其他人访问。", + "make-public-edge-title": "您确定要将边缘 '{{edgeName}}' 设为公开吗?", + "management": "边缘管理", + "missing-related-rule-chains-text": "分配给边缘的规则链使用规则节点将消息转发给未分配给当前边缘的规则链。

缺少的规则链列表:
{{missingRuleChains}}", + "missing-related-rule-chains-title": "边缘缺少关联规则链", + "name": "名称", + "name-max-length": "名称长度必须少于256个字符", + "name-required": "名称必填。", + "name-starts-with": "边缘名称前缀", + "no-downlinks-prompt": "没有找到下行", + "no-edge-types-matching": "没有找到匹配的边缘类型 '{{entitySubtype}}'。", + "no-edges-matching": "没有找到匹配的边缘 '{{entity}}'。", + "no-edges-text": "没有找到边缘", + "pending": "待定", + "public": "公开", + "rulechain-templates": "规则链模版", + "rulechains": "规则链", + "search": "搜索边缘", + "select-edge-type": "选择边缘类型", + "selected-edges": "{ count, plural, 1 {1 个边缘} other {# 个边缘} } 被选中", + "sync": "同步边缘", + "sync-process-started-successfully": "同步处理开始成功!", + "type-max-length": "类型长度必须少于256个字符", + "unassign-edge-text": "确定后,边缘将被取消分配,并且客户将无法访问。", + "unassign-edge-title": "您确定取消分配边缘 '{{edgeName}}'?", + "unassign-edges-text": "确定后,所有选定的边缘将被取消分配,并且客户将无法访问。", + "unassign-edges-title": "您确定要取消分配 {count,plural,1 {1 个边缘} other {# 个边缘} } 吗?", + "unassign-from-customer": "取消分配客户", + "unassign-from-edge": "取消分配边缘", + "widget-datasource-error": "组件只支持边缘实体数据源" + }, + "edge-event": { + "action-type-added": "增加", + "action-type-alarm-ack": "警告确认", + "action-type-alarm-clear": "警告清除", + "action-type-assigned-to-customer": "分配给客户", + "action-type-assigned-to-edge": "分配给边缘", + "action-type-attributes-deleted": "属性删除", + "action-type-attributes-updated": "属性更新", + "action-type-credentials-request": "认证请求", + "action-type-credentials-updated": "认证更新", + "action-type-deleted": "删除", + "action-type-entity-merge-request": "实体合并请求", + "action-type-post-attributes": "推送属性", + "action-type-relation-add-or-update": "关联增加或更新", + "action-type-relation-deleted": "关联删除", + "action-type-rpc-call": "RPC调用", + "action-type-timeseries-updated": "时序更新", + "action-type-unassigned-from-customer": "取消分配客户", + "action-type-unassigned-from-edge": "取消分配边缘", + "action-type-updated": "更新", + "type-admin-settings": "管理员设置", + "type-alarm": "告警", + "type-asset": "资产", + "type-customer": "客户", + "type-dashboard": "仪表板", + "type-device": "设备", + "type-device-profile": "设备概要", + "type-edge": "边缘", + "type-entity-view": "实体视图", + "type-relation": "关联", + "type-rule-chain": "规则链", + "type-rule-chain-metadata": "规则链元数据", + "type-user": "用户", + "type-widgets-bundle": "部件包", + "type-widgets-type": "部件类型" + }, "entity-field": { "address": "地址", "address2": "地址2", @@ -1160,6 +1320,9 @@ "any-entity-view": "任何实体视图", "assign-entity-view-to-customer": "将实体视图分配给客户", "assign-entity-view-to-customer-text": "请选择要分配给客户的实体视图", + "assign-entity-view-to-edge": "将实体视图分配给边缘", + "assign-entity-view-to-edge-text": "请选择要分配给边缘的实体视图", + "assign-entity-view-to-edge-title": "将实体视图分配给边缘", "assign-entity-views": "分配实体视图", "assign-entity-views-text": "分配 { count, plural, 1 {# 个实体视图} other {# 个实体视图} } 给客户", "assign-new-entity-view": "分配新实体视图", @@ -1244,8 +1407,14 @@ "unassign-entity-view": "未分配实体视图", "unassign-entity-view-text": "确认后,实体视图将未分配,客户无法访问。", "unassign-entity-view-title": "您确定要取消对 '{{entityViewName}}'实体视图的分配吗?", + "unassign-entity-view-from-edge": "未分配实体视图", + "unassign-entity-view-from-edge-text": "确认后,实体视图将未分配,边缘无法访问。", + "unassign-entity-view-from-edge-title": "您确定要取消对 '{{entityViewName}}'实体视图的分配吗?", "unassign-entity-views": "取消分配实体视图", "unassign-entity-views-action-title": "从客户处取消分配{count,plural,1 {# 实体视图} other {# 实体视图} }", + "unassign-entity-views-from-edge-action-title": "从边缘处取消分配{count,plural,1 {# 实体视图} other {# 实体视图} }", + "unassign-entity-views-from-edge-text": "确认后,所有选定的实体视图将被分配,边缘无法访问。", + "unassign-entity-views-from-edge-title": "确定要取消分配 { count, plural, 1 {# 个实体视图} other {# 个实体视图} }吗?", "unassign-entity-views-text": "确认后,所有选定的实体视图将被分配,客户无法访问。", "unassign-entity-views-title": "确定要取消分配 { count, plural, 1 {# 个实体视图} other {# 个实体视图} }吗?", "unassign-from-customer": "取消分配客户", @@ -1361,7 +1530,11 @@ "unable-delete-entity-alias-text": "实体别名 '{{entityAlias}}' 被以下部件使用不能删除:
{{widgetsList}}", "unable-delete-entity-alias-title": "无法删除实体别名", "use-entity-name-filter": "用户筛选器", - "user-name-starts-with": "以 '{{prefix}}' 开头的用户" + "user-name-starts-with": "以 '{{prefix}}' 开头的用户", + "type-edge": "边缘", + "type-edges": "边缘", + "list-of-edges": "{ count, plural, 1 {1 个边缘} other {列表 # 个边缘} }", + "edge-name-starts-with": "以 '{{prefix}}' 开头的边缘" }, "error": { "unable-to-connect": "无法连接到服务器!请检查您的互联网连接。", @@ -1817,6 +1990,8 @@ "isgateway": "Is网关", "label": "标签", "name": "名称", + "routing-key": "边缘键", + "secret": "边缘密钥", "server-attribute": "服务器属性", "shared-attribute": "共享属性", "timeseries": "Timeseries", @@ -2087,6 +2262,9 @@ "rulechain": { "add": "添加规则链", "add-rulechain-text": "添加新的规则链", + "assign-to-edge": "分配规则链给边缘", + "assign-rulechain-to-edge-title": "分配规则链给边缘", + "assign-rulechain-to-edge-text": "请选择要分配给边缘的规则链", "copyId": "复制规则链ID", "create-new-rulechain": "创建新的规则链", "debug-mode": "调试模式", @@ -2098,12 +2276,15 @@ "delete-rulechains-title": "确实要删除{count, plural, 1 { 1 个规则链} other {# 个规则链} }吗?", "description": "说明", "details": "详情", + "edge-rulechain": "边缘规则链", + "edge-template-root": "根模版", "events": "事件", "export": "导出规则链", "export-failed-error": "无法导出规则链:{{error}}", "idCopiedMessage": "规则ID已经复制到粘贴板", "import": "导入规则链", "invalid-rulechain-file-error": "不能导入规则链:无效的规则链数据格式。", + "invalid-rulechain-type-error": "不能导入规则链:无效的规则链类型。期望类型为{{expectedRuleChainType}}。", "management": "规则集管理", "name": "名称", "name-required": "名称必填。", @@ -2119,10 +2300,22 @@ "search": "查找规则链", "select-rulechain": "选择规则链", "selected-rulechains": "已选择 { count, plural, 1 {# 个规则链} other {# 个规则链} }", + "set-auto-assign-to-edge": "创建时分配规则链给边缘", + "set-auto-assign-to-edge-text": "确认后,创建时规则链将自动分配给边缘。", + "set-auto-assign-to-edge-title": "您确定创建时将规则链'{{ruleChainName}}'自动分配给边缘吗", + "set-edge-template-root-rulechain": "设置规则链为边缘模版根", + "set-edge-template-root-rulechain-text": "确认后,规则链将将会成为边缘模版根,且它会成为新创建边缘的根规则链。", + "set-edge-template-root-rulechain-title": "您确定将规则链 '{{ruleChainName}}' 设置为边缘模版根吗?", "set-root": "设置为根规则链", "set-root-rulechain-text": "确认之后,规则链将变为根规格链,并将处理所有传入的传输消息。", "set-root-rulechain-title": "您确定要生成规则链'{{ruleChainName}}'根吗?", - "system": "系统" + "system": "系统", + "unassign-rulechain-from-edge-text": "确认后,规则链将会取消分配,边缘无法访问。", + "unassign-rulechains-from-edge-text": "确认后,选定的规则链将会取消分配,边缘无法访问。", + "unassign-rulechains-from-edge-title": "您确定要取消分配规则链 { count, plural, 1 {1 个规则链} other {# 个规则链} }?", + "unset-auto-assign-to-edge": "创建时分配规则链给边缘", + "unset-auto-assign-to-edge-text": "确认后,创建时规则链将不再自动分配给边缘。", + "unset-auto-assign-to-edge-title": "您确定取消创建时将规则链'{{ruleChainName}}'自动分配给边缘吗?" }, "rulenode": { "add": "添加规则节点", From 4301927b7f1cccd818d576c1a2c0822f5d899fda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20N=C3=BA=C3=B1ez?= Date: Thu, 2 Jun 2022 20:40:01 +0200 Subject: [PATCH 21/37] [WIP] Add spanish feature to 3.4 --- .../assets/locale/locale.constant-es_ES.json | 2094 +++++++++++++++-- 1 file changed, 1934 insertions(+), 160 deletions(-) diff --git a/ui-ngx/src/assets/locale/locale.constant-es_ES.json b/ui-ngx/src/assets/locale/locale.constant-es_ES.json index f8e16aca0e..578153c62f 100644 --- a/ui-ngx/src/assets/locale/locale.constant-es_ES.json +++ b/ui-ngx/src/assets/locale/locale.constant-es_ES.json @@ -58,7 +58,8 @@ "next-with-label": "Siguiente: {{label}}", "read-more": "Leer más", "hide": "Ocultar", - "done": "Hecho" + "done": "Terminado", + "print": "Imprimir" }, "aggregation": { "aggregation": "Agrupación", @@ -75,6 +76,7 @@ "admin": { "general": "General", "general-settings": "Configuración general", + "home-settings": "Ajustes Home", "outgoing-mail": "Servidor de correo", "outgoing-mail-settings": "Configuración del servidor de correo de salida", "system-settings": "Sistema", @@ -104,6 +106,7 @@ "proxy-port-range": "El puerto proxy debe estar en un rango de 1 a 65535.", "proxy-user": "Usuario proxy", "proxy-password": "Contraseña proxy", + "change-password": "Cambiar contraseña", "send-test-mail": "Enviar correo de prueba", "sms-provider": "Proveedor SMS", "sms-provider-settings": "Ajustes proveedor SMS", @@ -111,18 +114,21 @@ "sms-provider-type-required": "Se requiere proveedor SMS.", "sms-provider-type-aws-sns": "Amazon SNS", "sms-provider-type-twilio": "Twilio", + "sms-provider-type-smpp": "SMPP", "aws-access-key-id": "AWS Access Key ID", - "aws-access-key-id-required": "Se requiere AWS Access Key ID", + "aws-access-key-id-required": "AWS Access Key ID requerido", "aws-secret-access-key": "AWS Secret Access Key", - "aws-secret-access-key-required": "Se requere AWS Secret Access Key", + "aws-secret-access-key-required": "AWS Secret Access Key requerido", "aws-region": "Región AWS", "aws-region-required": "Se requere región AWS", "number-from": "Nº de teléfono Origen", "number-from-required": "Se requere Nº de teléfono origen.", "number-to": "Nº de teléfono de destino", "number-to-required": "Se requere Nº de teléfono de destino.", - "phone-number-hint": "Nº de teléfono en formato E.164, ex. +19995550123", - "phone-number-pattern": "Nº Inválido. Debe estar en formato E.164, ex. +19995550123.", + "phone-number-hint": "Nº de teléfono en formato E.164, ej. +19995550123", + "phone-number-hint-twilio": "Nº de teléfono en formato E.164 SID/SID de servicio de mensajería, ej. +19995550123/PNXXX/MGXXX", + "phone-number-pattern": "Nº Inválido. Debe estar en formato E.164, ej. +19995550123.", + "phone-number-pattern-twilio": "Nº Inválido. Debe estar en formato E.164 , ej. +19995550123/PNXXX/MGXXX.", "sms-message": "Mensaje SMS", "sms-message-required": "Se requeriere mensaje SMS.", "sms-message-max-length": "Los SMS no pueden ser más largos de 1600 caracteres", @@ -149,12 +155,14 @@ "password-expiration-period-days-range": "El período de caducidad de la contraseña en días no puede ser negativo", "password-reuse-frequency-days": "Frecuencia de reutilización de contraseña en días", "password-reuse-frequency-days-range": "La frecuencia de reutilización de contraseña en días no puede ser negativa", + "allow-whitespace": "Permitir espacios en blanco", "general-policy": "Política general", "max-failed-login-attempts": "Número máximo de intentos fallidos de inicio de sesión, antes de que la cuenta esté bloqueada", "minimum-max-failed-login-attempts-range": "El número máximo de intentos fallidos de inicio de sesión no puede ser negativo", "user-lockout-notification-email": "En caso de bloqueo de la cuenta del usuario, envíe una notificación por correo electrónico", "domain-name": "Nombre de dominio", "domain-name-unique": "El nombre de dominio y protocolo debe ser único.", + "domain-name-max-length": "El nombre de dominio debe ser menor que 256", "error-verification-url": "Un nombre de dominio no debe contener símbolos '/' y ':'. Ejemplo: thingsboard.io", "oauth2": { "access-token-uri": "URI Access token", @@ -171,21 +179,28 @@ "client-authentication-method": "Método de autenticación", "client-id": "ID Cliente", "client-id-required": "Se requere ID Cliente.", + "client-id-max-length": "El ID Cliente debe ser menor de 256", "client-secret": "Secreto de Cliente", "client-secret-required": "Se requiere Secreto de Cliente.", + "client-secret-max-length": "El secreto de cliente debe ser menor de 2049", "custom-setting": "Ajustes personalizados", "customer-name-pattern": "Patrón nombre de cliente", + "customer-name-pattern-max-length": "El patrón del nombre de cliente debe ser menor de 256", "default-dashboard-name": "Nombre de panel por defecto", + "default-dashboard-name-max-length": "El nombre del panel debe ser menor de 256", "delete-domain-text": "Atención, tras la confirmación el dominio y todos los datos del proveedor no estarán disponibles.", "delete-domain-title": "Eliminar los ajustes del dominio '{{domainName}}'?", "delete-registration-text": "Atención, tras la confirmación los datos del proveedor no estarán disponibles.", "delete-registration-title": "Eliminar el proveedor '{{name}}'?", "email-attribute-key": "Clave de atributos email", "email-attribute-key-required": "Se requiere clave de atributos de email.", + "email-attribute-key-max-length": "La clave de atributos de email debe ser menor de 32", "first-name-attribute-key": "Clave de atributos de nombre", + "first-name-attribute-key-max-length": "La clave de atributos de nombre debe ser menor de 32", "general": "General", "jwk-set-uri": "URI web key JSON", "last-name-attribute-key": "Clave de atributos de apellido", + "last-name-attribute-key-max-length": "La clave de atributos de apellido debe ser menor de 32", "login-button-icon": "Icono de botón login", "login-button-label": "Etiqueta de proveedor", "login-button-label-placeholder": "Login con $(Provider label)", @@ -194,6 +209,7 @@ "mapper": "Mapeador", "new-domain": "Nuevo dominio", "oauth2": "OAuth2", + "password-max-length": "La contraseña debe ser menor de 256", "redirect-uri-template": "Plantilla de redirección URI", "copy-redirect-uri": "Copiar URI de redirección", "registration-id": "ID de registro", @@ -203,21 +219,141 @@ "scope-required": "Se requiere alcance.", "tenant-name-pattern": "Patrón de nombre de propietario", "tenant-name-pattern-required": "Se requiere patrón de nombre de propietario.", + "tenant-name-pattern-max-length": "EL patrón de nombre de propietario debe ser menor de 256", "tenant-name-strategy": "Estrategia de Nombre de Propietario", "type": "Tipo de mapeador", "uri-pattern-error": "Formato de URI inválido.", "url": "URL", "url-pattern": "Formato URL inválido.", "url-required": "Se requiere URL.", + "url-max-length": "URL debe ser menor de 256", "user-info-uri": "URI Información de usuario", "user-info-uri-required": "Se requiere URI de información usuario.", + "username-max-length": "El usuario debe ser menor de 256", "user-name-attribute-name": "Clave de atributos de nombre de usuario", "user-name-attribute-name-required": "Se requiere clave de atributos de nombre de usuario", "protocol": "Protocolo", "domain-schema-http": "HTTP", "domain-schema-https": "HTTPS", "domain-schema-mixed": "HTTP+HTTPS", - "enable": "Activar ajustes OAuth2" + "enable": "Activar ajustes OAuth2", + "domains": "Dominios", + "mobile-apps": "Aplicaciones móviles", + "no-mobile-apps": "No hay aplicaciones configuradas", + "mobile-package": "Paquete de aplicación", + "mobile-package-placeholder": "Ej.: mi.ejemplo.app", + "mobile-package-hint": "Para Android: El ID único de aplicación. Para iOS: Identificador Product bundle.", + "mobile-package-unique": "El paquete de aplicación debe ser único.", + "mobile-app-secret": "Secreto de aplicación", + "invalid-mobile-app-secret": "El secreto de aplicación sólo puede contener carácteres alfanuméricos y debe tener entre 16 y 2048 carácteres de longitud.", + "copy-mobile-app-secret": "Copiar secreto de aplicación", + "add-mobile-app": "Añadir aplicación", + "delete-mobile-app": "Borrar información de aplicación", + "providers": "Proveedores", + "platform-web": "Web", + "platform-android": "Android", + "platform-ios": "iOS", + "all-platforms": "Todas las plataformas", + "allowed-platforms": "Plataformas permitidas" + }, + "smpp-provider": { + "smpp-version": "Versión SMPP", + "smpp-host": "Host SMPP", + "smpp-host-required": "Host SMPP requerido", + "smpp-port": "Puerto SMPP", + "smpp-port-required": "Puerto SMPP requerido", + "system-id": "System ID", + "system-id-required": "System ID requerido", + "password": "Contraseña", + "password-required": "Contraseña requerida", + "type-settings": "Ajustes de tipo", + "source-settings": "Ajustes de origen", + "destination-settings": "Ajustes de destino", + "additional-settings": "Ajustes adicionales", + "system-type": "Tipo de sistema", + "bind-type": "Tipo de enlace", + "service-type": "Tipo de servicio", + "source-address": "Dirección de origen", + "source-ton": "Origen TON", + "source-npi": "Origen NPI", + "destination-ton": "Destino TON (Tipo de número)", + "destination-npi": "Destino NPI (Numbering Plan Identification)", + "address-range": "Rango de dirección", + "coding-scheme": "Esquema de codificación", + "bind-type-tx": "Transmisor", + "bind-type-rx": "Receptor", + "bind-type-trx": "Transceptor", + "ton-unknown": "Desconocido", + "ton-international": "Internacional", + "ton-national": "Nacional", + "ton-network-specific": "Específico de red", + "ton-subscriber-number": "Número de suscriptor", + "ton-alphanumeric": "Alfanumérico", + "ton-abbreviated": "Abreviado", + "npi-unknown": "0 - Desconocido", + "npi-isdn": "1 - RDSI/Teléfono plan numérico (E163/E164)", + "npi-data-numbering-plan": "3 - Datos plan numérico (X.121)", + "npi-telex-numbering-plan": "4 - Telex plan numérico (F.69)", + "npi-land-mobile": "6 - Línea Móvil (E.212)", + "npi-national-numbering-plan": "8 - Nacional", + "npi-private-numbering-plan": "9 - Privado", + "npi-ermes-numbering-plan": "10 - ERMES (ETSI DE/PS 3 01-3)", + "npi-internet": "13 - Internet (IP)", + "npi-wap-client-id": "18 - WAP Client Id (to be defined by WAP Forum)", + "scheme-smsc": "0 - SMSC Default Alphabet (ASCII for short and long code and to GSM for toll-free)", + "scheme-ia5": "1 - IA5 (ASCII for short and long code, Latin 9 for toll-free (ISO-8859-9))", + "scheme-octet-unspecified-2": "2 - Octet Unspecified (8-bit binary)", + "scheme-latin-1": "3 - Latin 1 (ISO-8859-1)", + "scheme-octet-unspecified-4": "4 - Octet Unspecified (8-bit binary)", + "scheme-jis": "5 - JIS (X 0208-1990)", + "scheme-cyrillic": "6 - Cyrillic (ISO-8859-5)", + "scheme-latin-hebrew": "7 - Latin/Hebrew (ISO-8859-8)", + "scheme-ucs-utf": "8 - UCS2/UTF-16 (ISO/IEC-10646)", + "scheme-pictogram-encoding": "9 - Pictogram Encoding", + "scheme-music-codes": "10 - Music Codes (ISO-2022-JP)", + "scheme-extended-kanji-jis": "13 - Extended Kanji JIS (X 0212-1990)", + "scheme-korean-graphic-character-set": "14 - Korean Graphic Character Set (KS C 5601/KS X 1001)" + }, + "queue-select-name": "Select queue name", + "queue-name": "Name", + "queue-name-required": "Queue name is required!", + "queues": "Queues", + "queue-partitions": "Partitions", + "queue-submit-strategy": "Submit strategy", + "queue-processing-strategy": "Processing strategy", + "queue-configuration": "Queue configuration", + "2fa": { + "2fa": "Two-factor authentication", + "available-providers": "Available providers", + "issuer-name": "Issuer name", + "issuer-name-required": "Issuer name is required.", + "max-verification-failures-before-user-lockout": "Max verification failures before user lockout", + "max-verification-failures-before-user-lockout-pattern": "Max verification failures must be a positive integer.", + "number-of-checking-attempts": "Number of checking attempts", + "number-of-checking-attempts-pattern": "Number of checking attempts must be a positive integer.", + "number-of-checking-attempts-required": "Number of checking attempts is required.", + "number-of-codes": "Number of codes", + "number-of-codes-pattern": "Number of codes must be a positive integer.", + "number-of-codes-required": "Number of codes is required.", + "provider": "Provider", + "retry-verification-code-period": "Retry verification code period (sec)", + "retry-verification-code-period-pattern": "Minimal period time is 5 sec", + "retry-verification-code-period-required": "Retry verification code period is required.", + "total-allowed-time-for-verification": "Total allowed time for verification (sec)", + "total-allowed-time-for-verification-pattern": "Minimal total allowed time is 60 sec", + "total-allowed-time-for-verification-required": "Total allowed time is required.", + "use-system-two-factor-auth-settings": "Use system two factor auth settings", + "verification-code-check-rate-limit": "Verification code check rate limit", + "verification-code-lifetime": "Verification code lifetime (sec)", + "verification-code-lifetime-pattern": "Verification code lifetime must be a positive integer.", + "verification-code-lifetime-required": "Verification code lifetime is required.", + "verification-message-template": "Verification message template", + "verification-limitations": "Verification limitations", + "verification-message-template-pattern": "Verification message need to contains pattern: ${code}", + "verification-message-template-required": "Verification message template is required.", + "within-time": "Within time (sec)", + "within-time-pattern": "Time must be a positive integer.", + "within-time-required": "Time is required." } }, "alarm": { @@ -299,6 +435,7 @@ "filter-type-single-entity": "Única entidad", "filter-type-entity-list": "Lista de entidades", "filter-type-entity-name": "Nombre de entidad", + "filter-type-entity-type": "Tipo de entidad", "filter-type-state-entity": "Entidad desde estado de panel", "filter-type-state-entity-description": "Entidad tomada de los parámetros de panel", "filter-type-asset-type": "Tipo de activo", @@ -312,6 +449,7 @@ "filter-type-entity-view-type-and-name-description": "Vistas de entidad del tipo '{{entityView}}' y cuyo nombre comience por '{{prefix}}'", "filter-type-edge-type": "Tipo de borde", "filter-type-edge-type-description": "Bordes del tipo '{{edgeType}}'", + "filter-type-edge-type-and-name-description": "Vistas de entidad del tipo '{{entityViewType}}' y cuyo nombre comience por '{{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": "Búsqueda de activos", @@ -323,23 +461,21 @@ "filter-type-apiUsageState": "Uso de API", "filter-type-edge-search-query": "Consultar búsqueda de borde", "filter-type-edge-search-query-description": "Bordes con tipos {{edgeTypes}} que tienen {{relationType}} relación {{direction}} {{rootEntity}}", - "type-assigned-to-edge": "Asignado a borde", - "type-unassigned-from-edge": "Sin asignar desde bordes", - "entity-filter": "Filtro por entidad", - "resolve-multiple": "Tomar como múltiples entidades", - "filter-type": "Filtro por tipo", - "filter-type-required": "Se requiere filtro por tipo.", - "entity-filter-no-entity-matched": "No se han encontrado entidades con el filtro especificado.", - "no-entity-filter-specified": "No hay filtro de entidades especificado", - "root-state-entity": "Usar estado de panel como raíz", - "last-level-relation": "Buscar sólo la relación de último nivel", - "root-entity": "Entidad raiz", - "state-entity-parameter-name": "Nombre de parámetro de entidad de estado", - "default-state-entity": "Entidad de estado predeterminada", + "entity-filter": "Filtro de entidad", + "resolve-multiple": "Resolver como múltiples entidades", + "filter-type": "Tipo de filtro", + "filter-type-required": "Se requiere tipo de filtro.", + "entity-filter-no-entity-matched": "No se encontraron entidades que coincidan con el filtro especificado.", + "no-entity-filter-specified": "No se ha especificado filtro de entidad", + "root-state-entity": "Usar entidad de estado del panel como raíz", + "last-level-relation": "Obtener sólo el último nivel de relación", + "root-entity": "Entidad raíz", + "state-entity-parameter-name": "Parámetro de estado de entidad", + "default-state-entity": "Entidad de estado por defecto", "default-entity-parameter-name": "Por defecto", - "max-relation-level": "Máx nivel de relación", + "max-relation-level": "Máximo nivel de relación", "unlimited-level": "Nivel ilimitado", - "state-entity": "Entidad estado del panel", + "state-entity": "Entidad de estado del panel", "all-entities": "Todas las entidades", "any-relation": "cualquiera" }, @@ -349,6 +485,7 @@ "management": "Gestión de Activos", "view-assets": "Ver Activos", "add": "Añadir Activo", + "assign-to-customer": "Asignar a cliente", "assign-asset-to-customer": "Asignar Activo(s) A Cliente", "assign-asset-to-customer-text": "Selecciona los activos a asignar al cliente", @@ -371,6 +508,8 @@ "asset-types": "Tipos de activo", "name": "Nombre", "name-required": "Nombre requerido.", + "name-max-length": "El nombre debe tener menos de 256", + "label-max-length": "La etiqueta debe tener menos de 256", "description": "Descripción", "type": "Tipo", "type-required": "Tipo requerido.", @@ -380,6 +519,8 @@ "asset-details": "Detalles de activo", "assign-assets": "Asignar activos", "assign-assets-text": "Asignar { count, plural, 1 {1 activo} other {# activos} } a cliente", + "assign-asset-to-edge-title": "Asignar activo(s) al borde", + "assign-asset-to-edge-text": "Por favor, selecciona lo activos a asignar al borde", "delete-assets": "Borrar activos", "unassign-assets": "Cancelar asignación de activo", "unassign-assets-action-title": "Cancelar asignación de { count, plural, 1 {1 activo} other {# activos} } del cliente", @@ -398,25 +539,25 @@ "unassign-asset": "Cancelar asignación de activo", "unassign-assets-title": "Cancelar las asignaciones { count, plural, 1 {1 activo} other {# activos} }?", "unassign-assets-text": "Tras la confirmación todos los activos seleccionados serán desasignados y no serán accesibles por el cliente.", + "unassign-assets-from-edge": "Anular activos de borde", "copyId": "Copiar ID de activo", "idCopiedMessage": "El ID ha sido copiado al portapapeles", "select-asset": "Seleccionar activo", "no-assets-matching": "No se han encontrado activos que coincidan con '{{entity}}' .", "asset-required": "Nombre de activo requerido", "name-starts-with": "El nombre de activo comienza con", + "help-text": "Usar el símbolo '%' de acuerdo a las necesidades: '%nombre_activo_contiene%', '%nombre_activo_acaba_en', 'nombre_activo_comienza_con'.", "import": "Importar activos", "asset-file": "Archivo del activo", - "search": "Buscar activos", - "selected-assets": "{ count, plural, 1 {1 activo} other {# activos} } seleccionados", "label": "Etiqueta", + "search": "Buscar activos", "assign-asset-to-edge": "Asignar activo(s) al borde", - "assign-asset-to-edge-text":"Por favor, seleccione los activos para asignar al borde", "unassign-asset-from-edge": "Anular activo de bodre", "unassign-asset-from-edge-title": "¿Está seguro de que desea desasignar el activo '{{assetName}}'?", "unassign-asset-from-edge-text": "Después de la confirmación, el activo no será asignado y el borde no podrá acceder a él", - "unassign-assets-from-edge-action-title": "Anular asignación {count, plural, 1 {1 activo} other {# activos} } desde el borde", "unassign-assets-from-edge-title": "¿Está seguro de que desea desasignar {count, plural, 1 {1 activo} other {# activos} }?", - "unassign-assets-from-edge-text": "Después de la confirmación, todos los activos seleccionados quedarán sin asignar y el borde no podrá acceder a ellos." + "unassign-assets-from-edge-text": "Después de la confirmación, todos los activos seleccionados quedarán sin asignar y el borde no podrá acceder a ellos.", + "selected-assets": "{ count, plural, 1 {1 activo} other {# activos} } seleccionados" }, "attribute": { "attributes": "Atributos", @@ -428,6 +569,7 @@ "scope-shared": "Atributos Compartidos", "add": "Agregar atributo", "key": "Clave", + "key-max-length": "La clave debe ser menor de 256", "last-update-time": "Hora de última actualización", "key-required": "Clave del atributo requerida.", "value": "Valor", @@ -449,12 +591,16 @@ }, "api-usage": { "api-usage": "Uso de API", + "alarm": "Alarma", + "alarms-created": "Alarmas creadas", + "alarms-created-daily-activity": "Actividad diaria de Alarmas creadas", + "alarms-created-hourly-activity": "Actividad horaria de Alarmas creadas", + "alarms-created-monthly-activity": "Actividad mensual de Alarmas creadas", "data-points": "Puntos de datos", - "data-points-storage-days": "Días de grabación de puntos de datos", + "data-points-storage-days": "Días de guardado de puntos de datos", "email": "Email", "email-messages": "Mensajes de Email", "email-messages-daily-activity": "Actividad diaria de Emails", - "email-messages-hourly-activity": "Actividad horaria de Emails", "email-messages-monthly-activity": "Actividad mensual de Emails", "exceptions": "Excepciones", "executions": "Ejecuciones", @@ -466,6 +612,9 @@ "javascript-functions-monthly-activity": "Actividad mensual de funciones JavaScript", "latest-error": "Último error", "messages": "Mensajes", + "notifications": "Notificaciones", + "notifications-email-sms": "Notificaciones (Email/SMS)", + "notifications-hourly-activity": "Notificaciones actividad horaria", "permanent-failures": "${entityName} Fallos permanentes", "permanent-timeouts": "${entityName} Timeouts permanentes", "processing-failures": "${entityName} Fallos de procesamiento", @@ -483,7 +632,6 @@ "sms": "SMS", "sms-messages": "Mensajes SMS", "sms-messages-daily-activity": "Actividad diaria de mensajes SMS", - "sms-messages-hourly-activity": "Actividad horaria de mensajes SMS", "sms-messages-monthly-activity": "Actividad mensual de mensajes SMS", "successful": "${entityName} Exitoso", "telemetry": "Telemetría", @@ -519,6 +667,8 @@ "type-credentials-updated": "Credenciales actualizados", "type-assigned-to-customer": "Asignado a Cliente", "type-unassigned-from-customer": "Deasignado a Cliente", + "type-assigned-to-edge": "Asignado a Borde", + "type-unassigned-from-edge": "Deasignado de Borde", "type-activated": "Activado", "type-suspended": "Suspendido", "type-credentials-read": "Lectura de credenciales", @@ -561,7 +711,10 @@ "address2": "Dirección 2", "phone": "Teléfono", "email": "Email", - "no-address": "Sin Dirección" + "no-address": "Sin Dirección", + "state-max-length": "Longitud de provincia debe ser menor que 256", + "phone-max-length": "Teléfono debe ser menor que 256", + "city-max-length": "Ciudad debe ser menor que 256" }, "common": { "username": "Usuario", @@ -570,7 +723,9 @@ "enter-password": "Introduce la contraseña", "enter-search": "Introduce búsqueda", "created-time": "Fecha de creación", - "loading": "Cargando..." + "loading": "Cargando...", + "proceed": "Proceder", + "open-details-page": "Abrir detalles" }, "content-type": { "json": "Json", @@ -616,10 +771,10 @@ "manage-dashboards": "Gestionar paneles", "title": "Título", "title-required": "Título requerido.", + "title-max-length": "Título debe ser menor de 256", "description": "Descripción", "details": "Detalles", "events": "Eventos", - "edges": "Bordes del cliente", "copyId": "Copiar ID de cliente", "idCopiedMessage": "El ID de cliente se ha copiado al portapapeles", "select-customer": "Seleccionar Cliente", @@ -629,7 +784,9 @@ "default-customer": "Cliente por defecto", "default-customer-required": "Se requiere cliente por defecto para realizar debu a nivel de propietario", "search": "Buscar clientes", - "selected-customers": "{ count, plural, 1 {1 cliente} other {# clientes} } seleccionados" + "selected-customers": "{ count, plural, 1 {1 cliente} other {# clientes} } seleccionados", + "edges": "Instancias de borde del cliente", + "manage-edges": "Administrar Bordes" }, "datetime": { "date-from": "Fecha desde", @@ -645,6 +802,7 @@ "add": "Agregar Panel", "assign-dashboard-to-customer": "Asignar panel(es) a cliente", "assign-dashboard-to-customer-text": "Por favor, seleccione algún panel para asignar al Cliente.", + "assign-dashboard-to-edge-title": "Asignar panel(es) a Borde", "assign-to-customer-text": "Por favor, seleccione algún cliente para asignar al(los) panel(es).", "assign-to-customer": "Asignar a cliente", "unassign-from-customer": "Desasignar del cliente", @@ -655,19 +813,27 @@ "assign-to-customers": "Asignar Panel / Paneles a Clientes", "assign-to-customers-text": "Selecciona los clientes para asignar los paneles", "unassign-from-customers": "Desasignar Panel / Paneles de clientes", - "unassign-from-customers-text": "Selecciona los clientes para desasignar los paneles", + "unassign-from-customers-text": "Selecciona los clientes para desasignar los paneles", "no-dashboards-text": "Ningún panel encontrado", "no-widgets": "Ningún widget configurado", "add-widget": "Agregar nuevo widget", "title": "Título", + "image": "Imagen de panel", + "mobile-app-settings": "Ajustes de aplicación móvil", + "mobile-order": "Órden de paneles en aplicación móvil", + "mobile-hide": "Ocultar panel en aplicación móvil", + "update-image": "Actualizar imagen de panel", + "take-screenshot": "Captura de pantalla", "select-widget-title": "Seleccionar widget", + "select-widget-value": "{{title}}: seleccionar widget", "select-widget-subtitle": "Lista de tipos de widgets disponibles", "delete": "Eliminar panel", "title-required": "Título requerido.", + "title-max-length": "Título debe ser menor de 256", "description": "Descripción", "details": "Detalles", "dashboard-details": "Detalles del panel", - "add-dashboard-text": "Agregar nuevo panel", + "add-dashboard-text": "Agregar nuevo panel", "assign-dashboards": "Asignar paneles", "assign-new-dashboard": "Asignar nuevo panel", "assign-dashboards-text": "Asignar { count, plural, 1 {1 panel} other {# paneles} } al cliente", @@ -705,8 +871,12 @@ "background-image": "Imagen de fondo", "background-size-mode": "Modo tamaño de fondo", "no-image": "No se ha seleccionado ningúna imagen", + "empty-image": "Sin imagen", "drop-image": "Suelte una imagen o haga clic para seleccionar un archivo para cargar.", + "maximum-upload-file-size": "Tamaño máximo de fichero: {{ size }}", + "cannot-upload-file": "No es posible subir el fichero", "settings": "Ajustes", + "layout-settings": "Ajustes de diseño", "columns-count": "Número de columnas", "columns-count-required": "Número de columnas requerido.", "min-columns-count-message": "Solo se permite un número mínimo de 10 columnas.", @@ -729,14 +899,23 @@ "mobile-row-height-required": "Altura de fila requerida.", "min-mobile-row-height-message": "Sólo se permiten 5 píxeles como altura mínima de fila (móvil).", "max-mobile-row-height-message": "Sólo se permiten 200 píxeles como altura máxima de fila (móvil).", + "title-settings": "Ajustes de título", "display-title": "Mostrar título del panel", - "toolbar-always-open": "Mantener la barra de herramientas abierta", "title-color": "Color del título", + "toolbar-settings": "Ajustes de la barra de herramientas", + "hide-toolbar": "Ocultar barra de herramientas", + "toolbar-always-open": "Mantener la barra de herramientas abierta", "display-dashboards-selection": "Mostrar selección de paneles", "display-entities-selection": "Mostrar selección de entidades", "display-filters": "Mostrar filtros", "display-dashboard-timewindow": "Mostrar ventana de tiempo", "display-dashboard-export": "Mostrar exportar", + "display-update-dashboard-image": "Mostrar actualización de imagen", + "dashboard-logo-settings": "Ajustes del logotipo del panel", + "display-dashboard-logo": "Mostrar logotipo en pantalla completa", + "dashboard-logo-image": "Imagen logotipo", + "advanced-settings": "Ajustes avanzados", + "dashboard-css": "CSS del panel", "import": "Importar panel", "export": "Exportar panel", "export-failed-error": "Imposible exportar panel: {{error}}", @@ -783,11 +962,15 @@ "select-state": "Seleccionar estado destino (target state)", "state-controller": "Controlador de estados", "search": "Buscar paneles", - "selected-dashboards": "{ count, plural, 1 {1 panel} other {# paneles} } seleccionados", + "selected-dashboards": "{count, plural, 1 {1 panel} other {# paneles} } seleccionados", + "home-dashboard": "Panel principal", + "home-dashboard-hide-toolbar": "Ocultar barra de herramientas en panel principal", "unassign-dashboard-from-edge-text": "Después de la confirmación, el tablero no será asignado y el borde no podrá acceder a él", - "unassign-dashboards-from-edge-text": "Después de la confirmación, se anulará la asignación de todos los paneles seleccionados y no serán accesibles por de borde", + "unassign-dashboards-from-edge-title": "Estas seguro de desasignar { count, plural, 1 {1 panel} other {# paneles} }?", + "unassign-dashboards-from-edge-text": "Después de la confirmación, se anulará la asignación de todos los paneles seleccionados y no serán accesibles por de borde", "assign-dashboard-to-edge": "Asignar panel(es) al borde", - "assign-dashboard-to-edge-text": "Por favor selecciona los paneles para asignar al borde" + "assign-dashboard-to-edge-text": "Por favor selecciona los paneles para asignar al borde", + "non-existent-dashboard-state-error": "El panel con id de estado \"{{ stateId }}\" no se ha encontrado" }, "datakey": { "settings": "Ajustes", @@ -809,7 +992,20 @@ "maximum-timeseries-or-attributes": "Máximo { count, plural, 1 {1 timeseries/atributo es permitido.} other {# timeseries/atributos son permitidos} }", "alarm-fields-required": "Campos de alarma requeridos.", "function-types": "Tipos de funciones", + "function-type": "Tipos de función", "function-types-required": "Tipos de funciones requerido.", + "alarm-keys": "Claves de Alarmas", + "alarm-key": "Clave de Slarma", + "alarm-key-functions": "Funciones de claves de Alarmas", + "alarm-key-function": "Función de clave de Alarma", + "latest-keys": "Últimas claves", + "latest-key": "Última clave", + "latest-key-functions": "Funciones de últimas claves", + "latest-key-function": "Función de última clave", + "timeseries-keys": "Claves de series de tiempo", + "timeseries-key": "Clave de series de tiempo", + "timeseries-key-functions": "Funciones de series de tiempo", + "timeseries-key-function": "Función de serie de tiempo", "maximum-function-types": "Máximo { count, plural, 1 {1 tipo de función está permitida.} other {# tipos de funciones están permitidos} }", "time-description": "hora del valor actual", "value-description": "el valor actual", @@ -820,6 +1016,7 @@ "datasource": { "type": "Típo de fuente de datos", "name": "Nombre", + "label": "Etiqueta", "add-datasource-prompt": "Por favor, agrega una fuente de datos" }, "details": { @@ -835,6 +1032,7 @@ "management": "Gestión de Dispositivos", "view-devices": "Ver Dispositivos", "device-alias": "Alias de dispositivo", + "device-type-max-length": "El tipo de dispositivo debe ser menor de 256", "aliases": "Alias de dispositivos", "no-alias-matching": "'{{alias}}' no encontrado.", "no-aliases-found": "Ningún alias encontrado.", @@ -850,6 +1048,7 @@ "remove-alias": "Eliminar alias", "add-alias": "Agregar alias", "name-starts-with": "Nombre empieza con", + "help-text": "Usar '%' de acuerdo a las necesidades: '%nombre_dispositivo_contiene%', '%nombre_dispositivo_termina_en', 'nombre_dispositivo_empieza_con'.", "device-list": "Lista de dispositivos", "use-device-name-filter": "Usar filtro", "device-list-empty": "Ningún dispositivo seleccionado.", @@ -859,6 +1058,8 @@ "assign-to-customer": "Asignar a cliente", "assign-device-to-customer": "Asignar dispositivo(s) a Cliente", "assign-device-to-customer-text": "Por favor, seleccione los dispositivos que serán asignados al cliente", + "assign-device-to-edge-title": "Asignar Dispositivo(s) a Borde", + "assign-device-to-edge-text": "Selecciona los dispositivos a asignar al Borde", "make-public": "Hacer dispositivo público", "make-private": "Hacer dispositivo privado", "no-devices-text": "Ningún dispositivo encontrado", @@ -874,6 +1075,9 @@ "unassign-from-customer": "Desasignar del cliente", "unassign-devices": "Desasignar dispositivos", "unassign-devices-action-title": "Desasignar { count, plural, 1 {1 dispositivo} other {# dispositivos} } del cliente", + "unassign-device-from-edge-title": "¿Está seguro de que desea desasignar el dispositivo '{{deviceName}}'?", + "unassign-device-from-edge-text": "Después de la confirmación, el dispositivo no será asignado y el borde no podrá acceder a él", + "unassign-devices-from-edge": "Desasignar dispositivos del Borde", "assign-new-device": "Asignar nuevo dispositivo", "make-public-device-title": "¿Hacer el dispositivo '{{deviceName}}' público?", "make-public-device-text": "Tras la confirmación, el dispositivo y la información relacionada serán públicos y podrá ser accesible por otros.", @@ -891,18 +1095,51 @@ "unassign-devices-title": "¿Desasignar { count, plural, 1 {1 dispositivo} other {# dispositivos} }?", "unassign-devices-text": "Tras la confirmación, los dispositivos seleccionados serán desasignados y no podrán ser accedidos por el cliente.", "device-credentials": "Credenciales del dispositivo", - "credentials-type": "Tipo de credencial", + "loading-device-credentials": "Cargando credenciales del dispositivo...", + "credentials-type": "Tipo de credenciales", "access-token": "Tóken de acceso", - "access-token-required": "Access token requerido.", - "access-token-invalid": "Access token debe tener entre 1 a 32 caracteres.", + "access-token-required": "Tóken de acceso requerido.", + "access-token-invalid": "Tóken de acceso debe tener entre 1 a 32 caracteres.", + "certificate-pem-format": "Certificado en formato PEM", + "certificate-pem-format-required": "Certificado requerido.", + "lwm2m-security-config": { + "identity": "Identidad Cliente", + "identity-required": "Identidad Cliente requerida.", + "identity-tooltip": "La identidad PSK es un identificador PSK arbitrario hasta 128 bytes, como se describe en el estándar [RFC7925].\nEl identificador PSK DEBE ser convertido a un string y después codificado en octetos usando UTF-8.", + "client-key": "Clave Cliente", + "client-key-required": "Clave Cliente requerida.", + "client-key-tooltip-prk": "La clave RPK o id DEBE estar conforme al estándar [RFC7250] y codificada a un formato Base64!", + "client-key-tooltip-psk": "La clave PSK DEBE estar conforme al estándar [RFC4279] y en formato HexDec de: 32, 64 o 128 caracteres!", + "endpoint": "Nombre Endpoint Cliente", + "endpoint-required": "Nombre Endpoint requerido.", + "client-public-key": "Clave pública Cliente", + "client-public-key-hint": "Si la clave pública está vacía, se usará el certificado de confianza", + "client-public-key-tooltip": "La clave pública X509 debe estar codificada en formato DER X509v3 y soportar exclusivamente el algoritmo EC y codificada en formato Base64!", + "mode": "Modo de Seguridad", + "client-tab": "Configuración de Seguridad del cliente", + "client-certificate": "Certificado de Cliente", + "bootstrap-tab": "Cliente Bootstrap", + "bootstrap-server": "Servidor Bootstrap", + "lwm2m-server": "Servidor LwM2M", + "client-publicKey-or-id": "Id o clave pública de cliente", + "client-publicKey-or-id-required": "Id o clave pública requerida.", + "client-publicKey-or-id-tooltip-psk": "La clave pública PSK es un identificador PSK arbitrario hasta 128 bytes, como se describe en el estándar [RFC7925].\nEl identificador PSK DEBE ser convertido a un string y después codificado en octetos usando UTF-8.", + "client-publicKey-or-id-tooltip-rpk": "La clave pública RPK o id DEBE estar conforme al estándar [RFC7250] y codificada a un formato Base64!", + "client-publicKey-or-id-tooltip-x509": "La clave pública X509 debe estar codificada en formato DER X509v3 y soportar exclusivamente el algoritmo EC y codificada en formato Base64", + "client-secret-key": "Clave secreta de Cliente", + "client-secret-key-required": "Clave secreta requerida.", + "client-secret-key-tooltip-psk": "La clave PSK debe ser en el estándar [RFC4279] y en formato HexDec de: 32, 64 o 128 caracteres!", + "client-secret-key-tooltip-prk": "La clave RPK debe estar en formato PKCS_8 (Codificación DER, estándar [RFC5958]) y luego codificada en formato Base64!", + "client-secret-key-tooltip-x509": "La clave X509 debe estar en formato PKCS_8 (Codificación DER, estándar [RFC5958]) y luego codificada en formato Base64!" + }, "client-id": "ID Cliente", "client-id-pattern": "Contiene carácter inválido.", "user-name": "Nombre Usuario", "user-name-required": "Se requiere nombre de usuario.", "client-id-or-user-name-necessary": "El ID Cliente y/o el Nombre de usuario son necesarios", "password": "Contraseña", - "secret": "Secreta", - "secret-required": "Secreta requerida.", + "secret": "Secreto", + "secret-required": "Secreto requerido.", "device-type": "Tipo de dispositivo", "device-type-required": "Tipo de dispositivo requerido.", "select-device-type": "Seleccionar tipo de dispositivo", @@ -913,6 +1150,8 @@ "device-types": "Tipos de dispositivo", "name": "Nombre", "name-required": "El nombre es requerido.", + "name-max-length": "El nombre debe ser menor de 256", + "label-max-length": "La etiqueta debe ser menor de 256", "description": "Descripción", "label": "Etiqueta", "events": "Eventos", @@ -946,9 +1185,6 @@ "customer-to-assign-device": "Cliente al que asignar el dispositivo", "add-credentials": "Añadir credencial" }, - "assign-device-to-edge-text": "Seleccione los dispositivos para asignar al borde", - "unassign-device-from-edge-title": "¿Está seguro de que desea desasignar el dispositivo '{{deviceName}}'?", - "unassign-device-from-edge-text": "Después de la confirmación, el dispositivo no será asignado y el borde no podrá acceder a él", "unassign-devices-from-edge-title": "¿Está seguro de que desea desasignar {count, plural, 1 {1 dispositivo} other {# dispositivos} }?", "unassign-devices-from-edge-text": "Después de la confirmación, todos los dispositivos seleccionados quedarán sin asignar y el borde no podrá acceder a ellos." }, @@ -968,6 +1204,7 @@ "set-default": "Hacer perfil por defecto", "delete": "Borrar perfil de dispositivo", "copyId": "Copiar ID de perfil", + "name-max-length": "El nombre debe ser menor de 256", "new-device-profile-name": "Nombre de perfil", "new-device-profile-name-required": "Se requiere nombre de perfil.", "name": "Nombre", @@ -975,19 +1212,26 @@ "type": "Tipo de perfil", "type-required": "Se requiere tipo de perfil.", "type-default": "Por defecto", + "image": "Imagen del perfil de dispositivo", "transport-type": "Tipo de transporte", "transport-type-required": "Se requiere tipo de transporte.", "transport-type-default": "Por defecto", "transport-type-default-hint": "Soporta transportes por MQTT básico, HTTP y CoAP", "transport-type-mqtt": "MQTT", "transport-type-mqtt-hint": "Activa ajustes avanzados de transporte MQTT", + "transport-type-coap": "CoAP", + "transport-type-coap-hint": "Activa ajustes avanzados del transporte CoAP", "transport-type-lwm2m": "LWM2M", "transport-type-lwm2m-hint": "Transporte LWM2M", + "transport-type-snmp": "SNMP", + "transport-type-snmp-hint": "Configuración transporte SNMP", "description": "Descripción", "default": "Defecto", "profile-configuration": "Configuración de perfil", "transport-configuration": "Configuración de transporte", "default-rule-chain": "Cadena de reglas por defecto", + "mobile-dashboard": "Panel móvil", + "mobile-dashboard-hint": "Usado por la aplicación móvil como panel de detalle", "select-queue-hint": "Selecciona desde el desplegable o añade un nombre personalizado.", "delete-device-profile-title": "Eliminar el perfil '{{deviceProfileName}}'?", "delete-device-profile-text": "Atención, tras la confirmación el perfil y todos sus datos serán borrados e irrecuperables.", @@ -1002,18 +1246,43 @@ "mqtt-device-payload-type": "Payload de dispositivo MQTT", "mqtt-device-payload-type-json": "JSON", "mqtt-device-payload-type-proto": "Protobuf", + "mqtt-enable-compatibility-with-json-payload-format": "Activar compatibilidad con otros formatos de payload.", + "mqtt-enable-compatibility-with-json-payload-format-hint": "Si se activa, la plataforma usará un formato de payload Protobuf por defecto. Si el parseo falla, la plataforma intentará usar el formato JSON. Útil para retrocompatibilidad durante actualizaciones de firmware. Por ejemplo, si la versión inicial de firmware usa JSON y una versión posterior usa Protobuf. Durante el proceso de actualización de firmware a los dispositivos, se requiere soportar Protobuf y JSON al mismo tiempo. El modo de retrocompatibilidad introduce una pequeña degradación en el rendimiento, es recomendable desactivarlo una vez que todos los dispositivos estén actualizados.", + "mqtt-use-json-format-for-default-downlink-topics": "Usar formato JSON para los downlink", + "mqtt-use-json-format-for-default-downlink-topics-hint": "When enabled, the platform will use Json payload format to push attributes and RPC via the following topics: v1/devices/me/attributes/response/$request_id, v1/devices/me/attributes, v1/devices/me/rpc/request/$request_id, v1/devices/me/rpc/response/$request_id. This setting does not impact attribute and rpc subscriptions sent using new (v2) topics: v2/a/res/$request_id, v2/a, v2/r/req/$request_id, v2/r/res/$request_id. Where $request_id is an integer request identifier.", + "mqtt-send-ack-on-validation-exception": "Enviar PUBACK en error de validación al publicar (PUBLISH)", + "mqtt-send-ack-on-validation-exception-hint": "By default, the platform will close the MQTT session on message validation failure. When enabled, the platform will send publish acknowledgment instead of closing the session.", + "snmp-add-mapping": "Añadir mapeado SNMP", + "snmp-mapping-not-configured": "No hay mapeado OID a series de tiempo/telemetría configurado", + "snmp-timseries-or-attribute-name": "Nombre Series de tiempo/nombre atributo para mapeado", + "snmp-timseries-or-attribute-type": "Tipo Series de tiempo/nombre atributo para mapeado", + "snmp-method-pdu-type-get-request": "GetRequest", + "snmp-method-pdu-type-get-next-request": "GetNextRequest", + "snmp-oid": "OID", + "transport-device-payload-type-json": "JSON", + "transport-device-payload-type-proto": "Protobuf", "mqtt-payload-type-required": "Se requiere tipo de Payload.", + "coap-device-type": "Tipo de dispositivo CoAP", + "coap-device-payload-type": "Payload dispositivo CoAP", + "coap-device-type-required": "Se requiere tipo de dispositivo CoAP.", + "coap-device-type-default": "Por defecto", + "coap-device-type-efento": "Efento NB-IoT", "support-level-wildcards": "Se soportan los wilcards únicos [+] y multi-nivel [#].", "telemetry-topic-filter": "Filtro de topic en telemetría", "telemetry-topic-filter-required": "Se requiere filtro de topic (telemetría).", "attributes-topic-filter": "Filtro de topic en atributos", "attributes-topic-filter-required": "Se requiere filtro de topic (atributos).", - "telemetry-proto-schema": "Proto schema de telemetría", - "telemetry-proto-schema-required": "Se requiere proto schema de telemetría.", - "attributes-proto-schema": "Proto schema de atributos", - "attributes-proto-schema-required": "Se requiere proto schema de atributos.", + "telemetry-proto-schema": "Proto esquema de telemetría", + "telemetry-proto-schema-required": "Se requiere proto esquema de telemetría.", + "attributes-proto-schema": "Proto esquema de atributos", + "attributes-proto-schema-required": "Se requiere proto esquema de atributos.", + "rpc-response-proto-schema": "Proto esquema de respuesta RPC", + "rpc-response-proto-schema-required": "Se requiere proto esquema de respuesta RPC.", "rpc-response-topic-filter": "Filtro de topic de respuesta RPC", - "rpc-response-topic-filter-required": "Se requiere fitro de respuesta RPC.", + "rpc-response-topic-filter-required": "Se requiere filtro de topic respuesta RPC.", + "rpc-request-proto-schema": "Proto esquema de petición RPC", + "rpc-request-proto-schema-required": "Se requiere proto esquema de petición RPC.", + "rpc-request-proto-schema-hint": "Las peticiones RPC deben contener siempre los siguientes campos: string method = 1; int32 requestId = 2; y params = 3 para cualquier tipo de datoas.", "not-valid-pattern-topic-filter": "No es un patrón de filtro válido", "not-valid-single-character": "Uso inválido de wildcard único", "not-valid-multi-character": "Uso inválido de wildcard multi-nivel", @@ -1027,6 +1296,7 @@ "alarm-type": "Tipo de alarma", "alarm-type-required": "Se requiere tipo de alarma.", "alarm-type-unique": "El tipo de alarma, debe ser único dentro de las reglas de alarma del perfil de dispositivo.", + "alarm-type-max-length": "El tipo de alarma debe ser menor de 256", "create-alarm-pattern": "Crear alarma {{alarmType}}", "create-alarm-rules": "Crear reglas de alarma", "no-create-alarm-rules": "No hay condiciones de creación de alarma configuradas", @@ -1046,14 +1316,20 @@ "condition-duration-time-unit-required": "Se requiere una unidad de tiempo.", "advanced-settings": "Ajustes avanzados", "alarm-rule-details": "Detalles", + "alarm-rule-details-hint": "Ayuda: usa ${nombredeClave} para sustituir los valores de atributos o telemetrías usadas en la condición de la regla de alarma.", "add-alarm-rule-details": "Añadir detalles", + "alarm-rule-mobile-dashboard": "Panel Móvil", + "alarm-rule-mobile-dashboard-hint": "Usado por la aplicación móvil como panel de detalle de alarmas", + "alarm-rule-no-mobile-dashboard": "No hay panel seleccionado", "propagate-alarm": "Propagar alarma", "alarm-rule-relation-types-list": "Tipos de relación para propagar", "alarm-rule-relation-types-list-hint": "Si no está seleccionado 'propagar relaciones', las alarmas serán propagadas sin filtrar por relación.", + "propagate-alarm-to-owner": "Propagar alarma al propietario de la entidad (Cliente o Administrador)", + "propagate-alarm-to-tenant": "Propagar alarma a Administrador", "alarm-details": "Detalles de alarma", "alarm-rule-condition": "Condiciones de regla de alarma", "enter-alarm-rule-condition-prompt": "Por favor, añade una condición de alarma", - "edit-alarm-rule-condition": "Editar condición de alarma", + "edit-alarm-rule-condition": "Editar condición de alarma", "device-provisioning": "Aprovisionamiento de dispositivos", "provision-strategy": "Estrategia de aprovisionamiento", "provision-strategy-required": "Se requiere estrategia de aprovisionamiento.", @@ -1073,6 +1349,7 @@ "condition-type-simple": "Simple", "condition-type-duration": "Duración", "condition-during": "Durante {{during}}", + "condition-during-dynamic": "Durante \"{{ attribute }}\" ({{during}})", "condition-type-repeating": "Repetitiva", "condition-type-required": "Se requiere tipo de condición.", "condition-repeating-value": "Nº de eventos", @@ -1080,12 +1357,13 @@ "condition-repeating-value-pattern": "Nº de eventos debe ser un número entero.", "condition-repeating-value-required": "Se requiere Nº de eventos.", "condition-repeat-times": "Repetición { count, plural, 1 {1 vez} other {# veces} }", + "condition-repeat-times-dynamic": "Repetición \"{ atributo }\" ({ count, plural, 1 {1 vez} other {# veces} })", "schedule-type": "Tipo de horario", "schedule-type-required": "Tipo de horario requerido.", "schedule": "Horario", "edit-schedule": "Editar horario de alarma", "schedule-any-time": "Siempre activo", - "schedule-specific-time": "Activo en una hora específica", + "schedule-specific-time": "Activo en una hora específica", "schedule-custom": "Personalizado", "schedule-day": { "monday": "Lunes", @@ -1098,9 +1376,205 @@ }, "schedule-days": "Días", "schedule-time": "Hora", - "schedule-time-from": "De", + "schedule-time-from": "Desde", "schedule-time-to": "Hasta", - "schedule-days-of-week-required": "Debe ser seleccionado por lo menos un día de la semana." + "schedule-days-of-week-required": "Seleccionar por lo menos un día de la semana.", + "create-device-profile": "Crear un nuevo perfil de dispositivo", + "import": "Importar perfil de dispositivo", + "export": "Exportar perfil de dispositivo", + "export-failed-error": "No ha sido posible exportar el perfil de dispositivo: {{error}}", + "device-profile-file": "Archivo de perfil de dispositivo", + "invalid-device-profile-file-error": "No ha sido posible importar perfil de dispositivo: Estructura de datos inválida.", + "power-saving-mode": "Modo de ahorro de energía (PSM)", + "power-saving-mode-type": { + "default": "Usar el del perfil del dispositivo", + "psm": "Power Saving Mode (PSM)", + "drx": "Discontinuous Reception (DRX)", + "edrx": "Extended Discontinuous Reception (eDRX)" + }, + "edrx-cycle": "Ciclo eDRX", + "edrx-cycle-required": "Se requiere ciclo eDRX.", + "edrx-cycle-pattern": "El ciclo eDRX debe ser un número entero positivo.", + "edrx-cycle-min": "El mínimo de ciclo eDRX es de {{ min }} segundos.", + "paging-transmission-window": "Ventana de transmisión (Paging Transmission Window)", + "paging-transmission-window-required": "Se requiere ventana de transmisión (Paging transmission window).", + "paging-transmission-window-pattern": "Ventana de transmision debe ser un número entero positivo.", + "paging-transmission-window-min": "El mínimo de ventana de transmisión es de {{ min }} segundos.", + "psm-activity-timer": "Tiempo Actividad PSM (PSM Activity Timer)", + "psm-activity-timer-required": "Se requiere el tiempo de actividad PSM.", + "psm-activity-timer-pattern": "Tiempo de actividad PSM debe ser un número entero positivo.", + "psm-activity-timer-min": "El tiempo de actividad PSM mínimo es de {{ min }} segundos.", + "lwm2m": { + "object-list": "Lista de objetos", + "object-list-empty": "No hay objetos seleccionados.", + "no-objects-found": "No se encontraron objetos.", + "no-objects-matching": "No hay objetos que coincidan con '{{object}}'.", + "model-tab": "Modelo LWM2M", + "add-new-instances": "Añadir nueva instancia", + "instances-list": "Lista de Instancias", + "instances-list-required": "Se requiere lista de instancias.", + "instance-id-pattern": "El id de instancia debe ser un número entero positivo.", + "instance-id-max": "El id máximo de instancia es {{max}}.", + "instance": "Instancia", + "resource-label": "#ID Nombre Recurso", + "observe-label": "Observar", + "attribute-label": "Atributo", + "telemetry-label": "Telemetría", + "edit-observe-select": "Para editar observar, selecciona telemetría o atributo", + "edit-attributes-select": "Para editar atributo, selecciona telemetría o atributo", + "no-attributes-set": "No hay atributos ajustados", + "key-name": "Nombre de clave", + "key-name-required": "Se requiere nombre de clave", + "attribute-name": "Nombre Atributo", + "attribute-name-required": "Se requiere nombre de atributo.", + "attribute-value": "Valor de atributo", + "attribute-value-required": "Se requiere valor de atributo.", + "attribute-value-pattern": "El valor del atributo debe ser un número entero positivo.", + "edit-attributes": "Edita atributos: {{ name }}", + "view-attributes": "Ver atributos: {{ name }}", + "add-attribute": "Añadir atributo", + "edit-attribute": "Editar atributo", + "view-attribute": "Ver atributos", + "remove-attribute": "Borrar atributos", + "delete-server-text": "Atención, tras la confirmación la configuración del servidor se borrará y será irrecuperable.", + "delete-server-title": "Estas seguro de borrar el servidor?", + "mode": "Configuración de seguridad", + "bootstrap-tab": "Bootstrap", + "bootstrap-server-legend": "Servidor Bootstrap (ShortId...)", + "lwm2m-server-legend": "Servidor LwM2M (ShortId...)", + "server": "Servidor", + "short-id": "Short server ID", + "short-id-tooltip": "Id corto del servidor. Usado como enlace para asociar las instancias de objetos del servidor.\nEste identificador sirve para identificar únicamente cada servidor LwM2M configurado para el cliente LwM2M.\nLos recursos DEBEN ser ajustados cuando el servidor Bootstrap tenga un valor de 'false'.\nLos valores ID:0 and ID:65535 NO DEBEN ser usados para identificar al servidor LwM2M.", + "short-id-required": "Se requiere Short server ID.", + "short-id-range": "Short server ID debe estar en un rango de 1 a 65534.", + "short-id-pattern": "Short server ID debe ser un número entero positivo.", + "lifetime": "Ciclo de vida registro de cliente (Registration Lifetime)", + "lifetime-required": "Se requiere ciclo de vida.", + "lifetime-pattern": "Ciclo de vida debe ser un número entero positivo.", + "default-min-period": "Periodo mínimo entre notificaciones (s)", + "default-min-period-tooltip": "Valor predeterminado que el cliente LwM2M debe usar para el período mínimo de una Observación en ausencia de éste parámetro incluido en una observación.", + "default-min-period-required": "Período mímino requerido.", + "default-min-period-pattern": "El período mínimo debe ser un número entero positivo.", + "notification-storing": "Grabado de notificaciones cuando esté desactivado u offline", + "binding": "Binding", + "binding-type": { + "u": "U: El cliente es alcanzable por UDP en cualquier momento.", + "m": "M: El cliente es alcanzable por MQTT en cualquier momento.", + "h": "H: El cliente es alcanzable por HTTP en cualquier momento.", + "t": "T: El cliente es alcanzable por TCP en cualquier momento.", + "s": "S: El cliente es alcanzable por SMS en cualquier momento.", + "n": "N: El cliente DEBE enviar las respuestas a las peticiones sobre el modo Non-IP (soportado desde la versión LWM2M 1.1).", + "uq": "UQ: Conexión UDP en modo de cola (no soportado desde la versión LWM2M 1.1)", + "uqs": "UQS: Conexiones UDP y SMS activas, UDP en modo cola, SMS en modo estándar (no soportado desde la versión LWM2M 1.1)", + "tq": "TQ: Conexión TCP en modo de cola (no soportado desde la versión LWM2M 1.1)", + "tqs": "TQS: Conexiones TCP y SMS activas, TCP en modo cola, SMS en modo estándar (no soportado desde la versión LWM2M 1.1)", + "sq": "SQ: Conexión SMS en modo de cola (no soportado desde la versión LWM2M 1.1)" + }, + "binding-tooltip": "This is the list in the\"binding\" resource of the LwM2M server object - /1/x/7.\nIndicates the supported binding modes in the LwM2M Client.\nThis value SHOULD be the same as the value in the “Supported Binding and Modes” resource in the Device Object (/3/0/16).\nWhile multiple transports are supported, only one transport binding can be used during the entire Transport Session.\nAs an example, when UDP and SMS are both supported, the LwM2M Client and the LwM2M Server can choose to communicate either over UDP or SMS during the entire Transport Session.", + "bootstrap-server": "Servidor Bootstrap", + "lwm2m-server": "Servidor LwM2M", + "include-bootstrap-server": "Incluir actualizaciónes del servidor Bootstrap", + "bootstrap-update-title": "Ya has configurado un servidor Bootstrap. Estás seguro de que quieres excluir las actualizaciones?", + "bootstrap-update-text": "Atención, tras la confirmación la configuración del servidor Bootstrap será irrecuperable.", + "server-host": "Host", + "server-host-required": "Se requiere Host.", + "server-port": "Puerto", + "server-port-required": "Se requiere Puerto.", + "server-port-pattern": "El puerto debe ser un número entero positivo.", + "server-port-range": "El puerto debe comprender en el rango 1 a 65535.", + "server-public-key": "Clave Pública del Servidor", + "server-public-key-required": "Se requiere la Clave Pública del servidor.", + "client-hold-off-time": "Tiempo de espera (Hold Off Time)", + "client-hold-off-time-required": "Se requiere tiempo de espera.", + "client-hold-off-time-pattern": "El tiempo de espera debe ser un número entero positivo.", + "client-hold-off-time-tooltip": "El tiempo de espera se usa sólamente con un servidor Bootstrap", + "account-after-timeout": "Cuenta tras el tiempo de espera", + "account-after-timeout-required": "Se requiere Cuenta tras el tiempo de espera.", + "account-after-timeout-pattern": "Cuenta tras el tiempo de espera debe ser un número entero positivo.", + "account-after-timeout-tooltip": "Bootstrap-Server Account after the timeout value given by this resource.", + "server-type": "Tipo de servidor", + "add-new-server-title": "Añadir nueva configuración", + "add-server-config": "Añadir configuración de servidor", + "add-lwm2m-server-config": "Añadir Servidor LwM2M", + "no-config-servers": "No hay servidores configurados", + "others-tab": "Otros ajustes", + "client-strategy": "Estrategia del cliente en la conexión", + "client-strategy-label": "Estrategia", + "client-strategy-only-observe": "Realizar un request para observar al cliente tras la conexión inicial", + "client-strategy-read-all": "Leer todos los recursos y realizar un request para observar al cliente tras el registro", + "fw-update": "Actualización de Firmware", + "fw-update-strategy": "Estrategia de actualización de Firmware", + "fw-update-strategy-data": "Enviar actualización de firmware como un fichero binario usando el Objeto 19 y el Recurso 0 (Data)", + "fw-update-strategy-package": "Enviar actualización de firmware como un fichero binario usando el Objeto 5 y el Recurso 0 (Package)", + "fw-update-strategy-package-uri": "Auto-generar una URL CoAP única para la descarga del paquete y enviarla usando el Objeto 5 y el Recurso 1 (Package URI)", + "sw-update": "Actualización de Software", + "sw-update-strategy": "Estrategia de Actualización de Software", + "sw-update-strategy-package": "Enviar como un fichero binario usando el Objeto 9 y el Recurso 2 (Package)", + "sw-update-strategy-package-uri": "Auto-generar una URL CoAP única para la descarga del paquete y enviarla usando el Objeto 9 y el Recurso 3 (Package URI)", + "fw-update-resource": "Recurso CoAP Actualización de Firmware", + "fw-update-resource-required": "Se requiere el Recurso CoAP Actualización de Firmware.", + "sw-update-resource": "Recurso CoAP Actualización de Software", + "sw-update-resource-required": "Se requiere el Recurso CoAP Actualización de Software.", + "config-json-tab": "Configuracion Json Perfil de dispositivo", + "attributes-name": { + "min-period": "Período mínimo", + "max-period": "Período máximo", + "greater-than": "Mayor que", + "less-than": "Menor que", + "step": "Paso", + "min-evaluation-period": "Período mínimo de evaluación", + "max-evaluation-period": "Período máximo de evaluación" + }, + "composite-operations-support": "Soporta operaciones Lectura/Escritura/Observación Compuestas" + }, + "snmp": { + "add-communication-config": "Añadir configuración de comunicaciones", + "add-mapping": "Añadir mapeado", + "authentication-passphrase": "Frase de contraseña", + "authentication-passphrase-required": "Se requiere frase de contraseña.", + "authentication-protocol": "Protocolo de autenticación", + "authentication-protocol-required": "Se requiere Protocolo de autenticación.", + "communication-configs": "Configuracion de comunicaciones", + "community": "Community", + "community-required": "Se requiere Community.", + "context-name": "Nombre de contexto", + "data-key": "Clave de datos", + "data-key-required": "Se requiere clave de datos.", + "data-type": "Tipo de datos", + "data-type-required": "Se requiere tipo de datos.", + "engine-id": "Engine ID", + "host": "Host", + "host-required": "Se requiere Host.", + "oid": "OID", + "oid-pattern": "Formato OID inválido.", + "oid-required": "Se requiere OID.", + "please-add-communication-config": "Por favor, añadir configuración de comunicación", + "please-add-mapping-config": "Por favor, añadir configuración de mapeado", + "port": "Puerto", + "port-format": "Formato de puerto inválido.", + "port-required": "Se requiere puerto.", + "privacy-passphrase": "Frase de clave de privacidad", + "privacy-passphrase-required": "Se requiere Frase de clave de privacidad.", + "privacy-protocol": "Protocolo privacidad", + "privacy-protocol-required": "Se requiere Protocolo privacidad.", + "protocol-version": "Versión protocolo", + "protocol-version-required": "Se requiere versión protocolo.", + "querying-frequency": "Frecuencia de peticiones, ms", + "querying-frequency-invalid-format": "Frecuencia de peticiones debe ser un número entero positivo.", + "querying-frequency-required": "Se requiere frecuencia de peticiones.", + "retries": "Reintentos", + "retries-invalid-format": "Reintentos debe ser un número entero positivo.", + "retries-required": "Se requiere reintentos.", + "scope": "Alcance", + "scope-required": "Se requiere alcance.", + "security-name": "Nombre seguridad", + "security-name-required": "Se requiere Nombre seguridad.", + "timeout-ms": "Timeout, ms", + "timeout-ms-invalid-format": "Timeout debe ser un número entero positivo.", + "timeout-ms-required": "Se requiere timeout.", + "user-name": "Usuario", + "user-name-required": "Se requiere usuario." + } }, "dialog": { "close": "Cerrar diálogo" @@ -1113,6 +1587,9 @@ "edge": "Borde", "edge-instances": "Instancias de Borde", "edge-file": "Archivo de borde", + "name-max-length": "El nombre debe ser menor de 256", + "label-max-length": "La etiqueta debe ser menor de 256", + "type-max-length": "El tipo debe ser menor de 256", "management": "Gestión de bordes", "no-edges-matching": "No se encontraron bordes que coincidan con '{{entity}}'", "add": "Agregar borde", @@ -1125,7 +1602,7 @@ "delete-edges-title": "¿Está seguro de que desea edge {count, plural, 1 {1 borde} other {# bordes} }?", "delete-edges-text": "Tenga cuidado, después de la confirmación se eliminarán todos los bordes seleccionados y todos los datos relacionados se volverán irrecuperables", "name": "Nombre", - "name-starts-with": "Edge name starts with", + "name-starts-with": "Nombre de Borde comienza con", "name-required": "Se requiere nombre", "description": "Descripción", "details": "Detalles", @@ -1133,8 +1610,8 @@ "copy-id": "Copiar ID de borde", "id-copied-message": "El ID de borde se ha copiado al portapapeles", "sync": "Sinc Edge", - "edge-required": "Edge required", - "edge-type": "Type de la bordure", + "edge-required": "Borde Requerido", + "edge-type": "Tipo de Borde", "edge-type-required": "El tipo de borde es requerido.", "event-action": "Información de la entidad", "entity-id": "ID de entidad", @@ -1155,7 +1632,7 @@ "make-public-edge-title": "¿Estás seguro de que quieres hacer público el edge '{{edgeName}}'?", "make-public-edge-text": "Después de la confirmación, el borde y todos sus datos serán públicos y accesibles para otros", "make-private": "Hacer que edge sea privado", - "public": "Public", + "public": "Público", "make-private-edge-title": "¿Está seguro de que desea que el borde '{{edgeName}}' sea privado?", "make-private-edge-text": "Después de la confirmación, el borde y todos sus datos se harán privados y otros no podrán acceder a ellos", "import": "Importar borde", @@ -1198,40 +1675,40 @@ "widget-datasource-error": "Este widget solo admite la fuente de datos de la entidad EDGE" }, "edge-event": { - "type-dashboard": "Dashboard", - "type-asset": "Asset", - "type-device": "Device", - "type-device-profile": "Device Profile", - "type-entity-view": "Entity View", - "type-alarm": "Alarm", - "type-rule-chain": "Rule Chain", - "type-rule-chain-metadata": "Rule Chain Metadata", - "type-edge": "Edge", - "type-user": "User", - "type-customer": "Customer", - "type-relation": "Relation", - "type-widgets-bundle": "Widgets Bundle", - "type-widgets-type": "Widgets Type", - "type-admin-settings": "Admin Settings", - "action-type-added": "Added", - "action-type-deleted": "Deleted", - "action-type-updated": "Updated", - "action-type-post-attributes": "Post Attributes", - "action-type-attributes-updated": "Attributes Updated", - "action-type-attributes-deleted": "Attributes Deleted", - "action-type-timeseries-updated": "Timeseries Updated", - "action-type-credentials-updated": "Credentials Updated", - "action-type-assigned-to-customer": "Assigned to Customer", - "action-type-unassigned-from-customer": "Unassigned from Customer", - "action-type-relation-add-or-update": "Relation Add or Update", - "action-type-relation-deleted": "Relation Deleted", - "action-type-rpc-call": "RPC Call", - "action-type-alarm-ack": "Alarm Ack", - "action-type-alarm-clear": "Alarm Clear", - "action-type-assigned-to-edge": "Assigned to Edge", - "action-type-unassigned-from-edge": "Unassigned from Edge", - "action-type-credentials-request": "Credentials Request", - "action-type-entity-merge-request": "Entity Merge Request" + "type-dashboard": "Panel", + "type-asset": "Activo", + "type-device": "Dispositivo", + "type-device-profile": "Perfil de dispositivo", + "type-entity-view": "Vista de entidad", + "type-alarm": "Alarma", + "type-rule-chain": "Cadena de reglas", + "type-rule-chain-metadata": "Metadatos de Cadena de Reglas", + "type-edge": "Borde", + "type-user": "Usuario", + "type-customer": "Cliente", + "type-relation": "Relación", + "type-widgets-bundle": "Paquete de Widgets", + "type-widgets-type": "Tipos de Widgets", + "type-admin-settings": "Ajustes de Administración", + "action-type-added": "Añadido", + "action-type-deleted": "Borrado", + "action-type-updated": "Actualizado", + "action-type-post-attributes": "Envío de Atributos", + "action-type-attributes-updated": "Atributos Actualizados", + "action-type-attributes-deleted": "Atributos Borrados", + "action-type-timeseries-updated": "Series de tiempo Actualizadas", + "action-type-credentials-updated": "Credenciales Actualizadas", + "action-type-assigned-to-customer": "Asignado a Cliente", + "action-type-unassigned-from-customer": "Desasignado de Cliente", + "action-type-relation-add-or-update": "Añadir o Actualizar relación", + "action-type-relation-deleted": "Relación borrada", + "action-type-rpc-call": "Llamada RPC", + "action-type-alarm-ack": "ACK Alarma", + "action-type-alarm-clear": "Borrado de Alarma", + "action-type-assigned-to-edge": "Asignado a Borde", + "action-type-unassigned-from-edge": "Desasignado de Borde", + "action-type-credentials-request": "Obtención de Credenciales", + "action-type-entity-merge-request": "Unión de entidades" }, "error": { "unable-to-connect": "Imposible conectar con el servidor! Por favor, revise su conexión a internet.", @@ -1241,6 +1718,7 @@ "entity": { "entity": "Entidad", "entities": "Entidades", + "entities-count": "Nº de entidades", "aliases": "Alias de entidad", "entity-alias": "Alias de entidad", "unable-delete-entity-alias-title": "No ha sido posible eliminar el alias de entidad", @@ -1261,6 +1739,7 @@ "no-entities-matching": "No se han encontrado entidades que coincidan con '{{entity}}' .", "no-entity-types-matching": "No se han encontrado tipos de entidad que coincidan con '{{entityType}}' .", "name-starts-with": "Nombre empieza con", + "help-text": "Usar el símbolo '%' de acuerdo a las necesidades: '%entity_name_contains%', '%entity_name_ends', 'entity_starts_with'.", "use-entity-name-filter": "Usar filtro", "entity-list-empty": "No hay entidades seleccionadas.", "entity-type-list-empty": "No hay tipos de entidad seleccionados.", @@ -1350,7 +1829,9 @@ "type-edge": "Borde", "type-edges": "Bordes", "list-of-edges": "{count, plural, 1 {Un borde} other {Lista de # bordes} }", - "edge-name-starts-with": "Bordes cuyos nombres comienzan con '{{prefijo}}'" + "edge-name-starts-with": "Bordes cuyos nombres comienzan con '{{prefijo}}'", + "type-tb-resource": "Recurso", + "type-ota-package": "Paquete OTA" }, "entity-field": { "created-time": "Hora de creación", @@ -1392,6 +1873,7 @@ "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", + "help-text": "Usar el símbolo '%' de acuerdo a las necesidades: '%entity-view_name_contains%', '%entity-view_name_ends', 'entity-view_starts_with'.", "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.", @@ -1402,6 +1884,7 @@ "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", + "assign-entity-view-to-edge-title": "Asignar vista(s) de entidad a Borde", "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", @@ -1435,6 +1918,8 @@ "created-time": "Fecha de creación", "name": "Nombre", "name-required": "Nombre Requerido.", + "name-max-length": "Nombre debe ser menor de 256", + "type-max-length": "Tipo de vista de entidad debe ser menor de 256", "description": "Descripción", "events": "Eventos", "details": "Detalles", @@ -1464,12 +1949,12 @@ "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 temporales", "timeseries-data-hint": "Configure las claves de los datos de las series temporales 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.", + "search": "Buscar vistas de entidad", + "selected-entity-views": "{ count, plural, 1 {1 vista de entidad} other {# vistas de entidad} } seleccionadas", "make-public-entity-view-title": "¿Está seguro de que desea que la vista de entidad '{{entityViewName}}' sea pública?", "make-public-entity-view-text": "Tras la confirmación, la vista de la entidad y todos sus datos se harán públicos y accesibles para otros.", "make-private-entity-view-title": "¿Está seguro de que desea que la vista de entidad '{{entityViewName}}' sea privada?", "make-private-entity-view-text": "Tras la confirmación, la vista de la entidad y todos sus datos se harán privados y no serán accesibles para otros.", - "search": "Buscar vistas de entidad", - "selected-entity-views": "{ count, plural, 1 {1 vista de entidad} other {# vistas de entidad} } seleccionadas", "assign-entity-view-to-edge": "Asignar vista (s) de entidad a borde", "assign-entity-view-to-edge-text": "Seleccione las vistas de entidad para asignar al borde", "unassign-entity-view-from-edge-title": "¿Está seguro de que desea anular la asignación de la vista de entidad '{{entityViewName}}'?", @@ -1481,14 +1966,15 @@ }, "event": { "event-type": "Tipo de evento", + "events-filter": "Filtro de Eventos", + "clean-events": "Borrar Eventos", "type-error": "Error", "type-lc-event": "Ciclo de vida del evento", "type-stats": "Estadísticas", "type-debug-rule-node": "Debug", "type-debug-rule-chain": "Debug", "no-events-prompt": "Ningún evento encontrado.", - "error": "Error", - "type-edge-event": "Downlink", + "error": "Error", "alarm": "Alarma", "event-time": "Hora del evento", "server": "Servidor", @@ -1506,9 +1992,17 @@ "success": "Éxito", "failed": "Fallo", "messages-processed": "Mensajes procesados", + "min-messages-processed": "Mínimo de mensajes procesados", "errors-occurred": "Ocurrieron errores", + "min-errors-occurred": "Minimum errors occurred", + "min-value": "El valor mínimo es 0.", "all-events": "Todos", - "entity-type": "Tipo de entidad" + "has-error": "Tiene error", + "entity-id": "Id de Entidad", + "entity-type": "Tipo de entidad", + "clear-filter": "Limpiar Filtro", + "clear-request-title": "Borrar todos los eventos", + "clear-request-text": "Estás seguro de borrar todos los eventos?" }, "extension": { "extensions": "Extensiones", @@ -1668,25 +2162,25 @@ "invalid-file-error": "Fichero de extensiones inválido" }, "filter": { - "add": "Añadir filtro", - "edit": "Editar filtro", - "name": "Nombre de filtro", - "name-required": "Se requiere nombre de filtro.", - "duplicate-filter": "Ya existe un filtro con el mismo nombre.", - "filters": "Filtros", - "unable-delete-filter-title": "Error borrando filtro", - "unable-delete-filter-text": "El filtro '{{filter}}' no puede ser borrado debido a que está siendo usado actualmente por los siguientes widgets:
{{widgetsList}}", - "duplicate-filter-error": "Se ha encontrado un filtro duplicado '{{filter}}'.
Los filtros deben ser únicos en el panel.", - "missing-key-filters-error": "No se encontró la clave de filtros para el filtro '{{filter}}'.", - "filter": "Filtro", - "editable": "Editable", - "no-filters-found": "No se encontraron filtros.", - "no-filter-text": "No se ha especificado filtro", - "add-filter-prompt": "Por favos, añadir filtro", - "no-filter-matching": "'{{filter}}' no encontrado.", - "create-new-filter": "Crear un filtro nuevo!", - "filter-required": "Se requiere filtro.", - "operation": { + "add": "Añadir filtro", + "edit": "Editar filtro", + "name": "Nombre de filtro", + "name-required": "Se requiere nombre de filtro.", + "duplicate-filter": "Ya existe un filtro con el mismo nombre.", + "filters": "Filtros", + "unable-delete-filter-title": "Error borrando filtro", + "unable-delete-filter-text": "El filtro '{{filter}}' no puede ser borrado debido a que está siendo usado actualmente por los siguientes widgets:
{{widgetsList}}", + "duplicate-filter-error": "Se ha encontrado un filtro duplicado '{{filter}}'.
Los filtros deben ser únicos en el panel.", + "missing-key-filters-error": "No se encontró la clave de filtros para el filtro '{{filter}}'.", + "filter": "Filtro", + "editable": "Editable", + "no-filters-found": "No se encontraron filtros.", + "no-filter-text": "No se ha especificado filtro", + "add-filter-prompt": "Por favos, añadir filtro", + "no-filter-matching": "'{{filter}}' no encontrado.", + "create-new-filter": "Crear un filtro nuevo!", + "filter-required": "Se requiere filtro.", + "operation": { "operation": "Operación", "equal": "igual", "not-equal": "no igual", @@ -1699,7 +2193,9 @@ "greater-or-equal": "mayor o igual", "less-or-equal": "menor o igual", "and": "y", - "or": "o" + "or": "o", + "in": "en", + "not-in": "no en" }, "ignore-case": "Ignorar mayús/minus", "value": "Valor", @@ -1725,7 +2221,8 @@ "key-type": "Tipo de clave", "attribute": "Atributo", "timeseries": "Timeseries", - "entity-field": "Campo de entidad" + "entity-field": "Campo de entidad", + "constant": "Constante" }, "value-type": { "value-type": "Tipo de valor", @@ -1752,7 +2249,9 @@ "no-dynamic-value": "Sin valor dinámico", "source-attribute": "Atributo de origen", "switch-to-dynamic-value": "Cambiar a valor dinámico", - "switch-to-default-value": "Cambiar a valor por defecto" + "switch-to-default-value": "Cambiar a valor por defecto", + "inherit-owner": "Heredar de propietario", + "source-attribute-not-set": "Si los atributos de origen no están seleccionados" }, "fullscreen": { "expand": "Expandir a Pantalla Completa", @@ -1851,7 +2350,8 @@ "scroll-to-top": "Ir hacia arriba" }, "help": { - "goto-help-page": "Ir a la página de ayuda" + "goto-help-page": "Ir a la página de ayuda", + "show-help": "Mostrar ayuda" }, "home": { "home": "Principal", @@ -1861,17 +2361,31 @@ "avatar": "Avatar", "open-user-menu": "Abrir menú de usuario" }, + "file-input": { + "browse-file": "Navegar fichero", + "browse-files": "Navegar ficheros" + }, + "image-input": { + "drop-image-or": "Arrastrar y soltar una imagen o", + "drop-images-or": "Arrastrar y soltar imagenes o", + "no-images": "No hay imágenes seleccionadas", + "images": "imágenes" + }, "import": { "no-file": "Ningún archivo seleccionado", "drop-file": "Suelte un archivo JSON o haga clic para seleccionar un archivo para cargar.", + "drop-json-file-or": "Suele un archivo JSON o", "drop-file-csv": "Suelte un archivo CSV o haga clic para seleccionar un archivo para cargar.", + "drop-file-csv-or": "Suelte un archivo CSV o", "column-value": "Valor", "column-title": "Título", "column-example": "Datos de ejemplo", "column-key": "Clave de atributo/telemetría", + "credentials": "Credenciales", "csv-delimiter": "Delimitador CSV", "csv-first-line-header": "La primera línea contiene nombres de columna.", "csv-update-data": "Actualizar atributos/telemetría", + "details": "Detalles", "import-csv-number-columns-error": "Un archivo debe contener al menos dos columnas", "import-csv-invalid-format-error": "Formato de archivo inválido. Línea: '{{line}}'", "column-type": { @@ -1885,9 +2399,30 @@ "timeseries": "Series de tiempo", "entity-field": "Campo de entidad", "access-token": "Token de acceso", + "x509": "X.509", + "mqtt": { + "client-id": "Client ID MQTT", + "user-name": "Usuario MQTT", + "password": "Contraseña MQTT" + }, + "lwm2m": { + "client-endpoint": "Nombre endpoint cliente LwM2M", + "security-config-mode": "Configuración de seguridad LwM2M", + "client-identity": "Identidad cliente LwM2M", + "client-key": "Clave cliente LwM2M", + "client-cert": "Clave pública cliente LwM2M", + "bootstrap-server-security-mode": "Modo seguridad servidor Bootstrap LwM2M", + "bootstrap-server-secret-key": "Clave secreta servidor Bootstrap LwM2M", + "bootstrap-server-public-key-id": "Clave pública o id servidor Bootstrap LwM2M", + "lwm2m-server-security-mode": "Modo seguridad servidor LwM2M", + "lwm2m-server-secret-key": "Clave secreta servidor LwM2M", + "lwm2m-server-public-key-id": "Clave pública servidor LwM2M" + }, "isgateway": "Es Gateway", "activity-time-from-gateway-device": "Fecha de actividad desde el dispositivo gateway", - "description": "Descripción" + "description": "Descripción", + "routing-key": "Clave Edge", + "secret": "Secreto Edge" }, "stepper-text": { "select-file": "Seleccione un archivo", @@ -1896,7 +2431,7 @@ "creat-entities": "Creando nuevas entidades" }, "message": { - "create-entities": "Se crearon{{count}} nuevas entidades correctamente.", + "create-entities": "Se crearon {{count}} nuevas entidades correctamente.", "update-entities": "{{count}} entidades se actualizaron correctamente.", "error-entities": "Se produjo un error al crear {{count}} entidades." } @@ -1940,6 +2475,8 @@ "avg": "promedio", "total": "total", "comparison-time-ago": { + "previousInterval": "(intervalo anterior)", + "customInterval": "(intervalo personalizado)", "days": "(hace un día)", "weeks": "(hace una semana)", "months": "(hace un mes)", @@ -1951,6 +2488,7 @@ "request-password-reset": "Solicitar restablecer contraseña", "reset-password": "Restablecer contraseña", "create-password": "Crear contraseña", + "two-factor-authentication": "Two factor authentication", "passwords-mismatch-error": "¡Las contraseñas introducidas deben ser iguales!", "password-again": "Repita la contraseña de nuevo", "sign-in": "Por favor, inicie sesión", @@ -1963,9 +2501,93 @@ "new-password-again": "Repita la nueva contraseña", "password-link-sent-message": "Se ha enviado el enlace de restablecimiento de contraseña con éxito!", "email": "Email", - "login-with": "Iniciar sesión con {{name}}", + "login-with": "Login con {{name}}", "or": "o", - "error": "Error de login" + "error": "Error de Login", + "verify-your-identity": "Verify your identity", + "select-way-to-verify": "Select a way to verify", + "resend-code": "Resend code", + "resend-code-wait": "Resend code in { time, plural, 1 {1 second} other {# seconds} }", + "try-another-way": "Try another way", + "totp-auth-description": "Please enter the security code from your authenticator app.", + "totp-auth-placeholder": "Code", + "sms-auth-description": "A security code has been sent to your phone at {{contact}}.", + "sms-auth-placeholder": "SMS code", + "email-auth-description": "A security code has been sent to your email address at {{contact}}.", + "email-auth-placeholder": "Email code", + "backup-code-auth-description": "Please enter one of your backup codes.", + "backup-code-auth-placeholder": "Backup code" + }, + "markdown": { + "edit": "Editar", + "preview": "Previsualizar", + "copy-code": "Click para copiar", + "copied": "Copiado!" + }, + "ota-update": { + "add": "Añadir paquete", + "assign-firmware": "Firmware asignado", + "assign-firmware-required": "Firmware asignado requerido", + "assign-software": "Software asignado", + "assign-software-required": "Software asignado requerido", + "auto-generate-checksum": "Auto-generar checksum", + "checksum": "Checksum", + "checksum-hint": "Si el checksum está vacío, se generará automáticamente", + "checksum-algorithm": "Algoritmo checksum", + "checksum-copied-message": "El checksum del paquete se ha copiado al portapapeles", + "change-firmware": "El cambio del firmware provocará la actualización de { count, plural, 1 {1 dispositivo} other {# dispositivos} }.", + "change-software": "El cambio del software provocará la actualización de { count, plural, 1 {1 dispositivo} other {# dispositivos} }.", + "chose-compatible-device-profile": "El paquete subido, sólamente estará disponible para los dispositivos con el perfil seleccionado.", + "chose-firmware-distributed-device": "Elige el firmware que se distribuirá a los dispositivos", + "chose-software-distributed-device": "Elige el software que se distribuirá a los dispositivos", + "content-type": "Tipo de contenido", + "copy-checksum": "Copiar checksum", + "copy-direct-url": "Copiar URL directa", + "copyId": "Copiar Id de paquete", + "copied": "Copiado!", + "delete": "Borrar paquete", + "delete-ota-update-text": "Atención, tras la confirmación la actualización OTA será irrecuperable.", + "delete-ota-update-title": "Estás seguro de borrar la actualización OTA '{{title}}'?", + "delete-ota-updates-text": "Atención, tras la confirmación todas las actualizaciones OTA seleccionadas se borrarán.", + "delete-ota-updates-title": "Estás seguro de borrar { count, plural, 1 {1 Actualización OTA} other {# Actualizaciones OTA} }?", + "description": "Descripción", + "direct-url": "URL Directa", + "direct-url-copied-message": "La URL directa del paquete se ha copiado al portapapeles", + "direct-url-required": "URL Directa requerida", + "download": "Descargar paquete", + "drop-file": "Arrastra un fichero o haz click para seleccionar un fichero a subir.", + "drop-package-file-or": "Arrastrar y soltar un fichero o", + "file-name": "Nombre del fichero", + "file-size": "Tamaño del fichero", + "file-size-bytes": "Tamaño del fichero en bytes", + "idCopiedMessage": "El Id del paquete se ha copiado al portapapeles", + "no-firmware-matching": "No se ha encontrado ningún paquete de firmware OTA compatible que coincidan con '{{entity}}'.", + "no-firmware-text": "No hay aprovisionado ningún paquete de firmware OTA.", + "no-packages-text": "No se han encontrado paquetes", + "no-software-matching": "No se ha encontrado ningún paquete de software OTA compatible que coincidan con '{{entity}}'.", + "no-software-text": "No hay aprovisionado ningún paquete de software OTA.", + "ota-update": "Actualización OTA", + "ota-update-details": "Detalles de actualización OTA", + "ota-updates": "Actualizaciones OTA", + "package-type": "Tipo de paquete", + "packages-repository": "Repositorio de paquetes", + "search": "Buscar paquetes", + "selected-package": "{ count, plural, 1 {1 paquete} other {# paquetes} } selected", + "title": "Título", + "title-required": "Título requerido.", + "title-max-length": "El título debe ser menor de 256", + "types": { + "firmware": "Firmware", + "software": "Software" + }, + "upload-binary-file": "Subir fichero binario", + "use-external-url": "Usar una URL externa", + "version": "Versión", + "version-required": "Versión requerida.", + "version-tag": "Tag de Versión", + "version-tag-hint": "El tag de versión debe coincidir con la versión reportada por el dispositivo.", + "version-max-length": "Versión debe ser menor que 256", + "warning-after-save-no-edit": "Una vez que el paquete se haya subido, no se podrá modificar el título, versión, perfil de dispositivo y tipo de paquete." }, "position": { "top": "Superior", @@ -1977,7 +2599,68 @@ "profile": "Perfil", "last-login-time": "Último acceso", "change-password": "Cambiar contraseña", - "current-password": "Contraseña actual" + "current-password": "Contraseña actual", + "copy-jwt-token": "Copiar JWT", + "valid-till": "Válido hasta {{expirationData}}", + "tokenCopiedSuccessMessage": "JWT copiado al portapapeles", + "tokenCopiedWarnMessage": "JWT caducado, por favor actualiza la página." + }, + "security": { + "security": "Security", + "2fa": { + "2fa": "Two-factor authentication", + "2fa-description": "Two-factor authentication protects your account from unauthorized access. All you have to do is enter a security code when you log in.", + "authenticate-with": "You can authenticate with:", + "disable-2fa-provider-text": "Disabling {{name}} will make your account less secure", + "disable-2fa-provider-title": "Are you sure you want to disable {{name}}?", + "get-new-code": "Get new code", + "main-2fa-method": "Use as main two-factor authentication method", + "dialog": { + "activation-step-description-email": "The next time you login in, you will be prompted to enter the security code that will be sent to your email address.", + "activation-step-description-sms": "The next time you login in, you will be prompted to enter the security code that will be sent to the phone number.", + "activation-step-description-totp": "The next time you login in, you will need to provide a two-factor authentication code.", + "activation-step-label": "Activation", + "backup-code-description": "Print out the codes so you have them handy when you need to use them to log in to your account. You can use each backup code once.", + "backup-code-warn": "Once you leave this page, these codes cannot be shown again. Store them safely using the options below.", + "download-txt": "Download (txt)", + "email-step-description": "Enter an email to use as your authenticator.", + "email-step-label": "Email", + "enable-email-title": "Enable email authenticator", + "enable-sms-title": "Enable SMS authenticator", + "enable-totp-title": "Enable authenticator app", + "enter-verification-code": "Enter the 6-digit code here", + "get-backup-code-title": "Get backup code", + "next": "Next", + "scan-qr-code": "Scan this QR code with your verification app", + "send-code": "Send code", + "sms-step-description": "Enter a phone number to use as your authenticator.", + "sms-step-label": "Phone Number", + "success": "Success!", + "totp-step-description-install": "You can install apps like Google Authenticator, Authy, or Duo.", + "totp-step-description-open": "Open the authenticator app on your mobile phone.", + "totp-step-label": "Get app", + "verification-code": "6-digit code", + "verification-code-invalid": "Invalid verification code format", + "verification-code-incorrect": "Verification code is incorrect", + "verification-code-many-request": "Too many requests check verification code", + "verification-step-description": "Enter a 6-digit code we just sent to {{address}}", + "verification-step-label": "Verification" + }, + "provider": { + "email": "Email", + "email-description": "Use a security code sent to your email address to authenticate.", + "email-hint": "Authentication codes are sent via email to {{ info }}", + "sms": "SMS", + "sms-description": "Use your phone to authenticate. We'll send you a security code via SMS message when you log in.", + "sms-hint": "Authentication codes are sent by text message to {{ info }}", + "totp": "Authenticator app", + "totp-description": "Use apps like Google Authenticator, Authy, or Duo on your phone to authenticate. It will generate a security code for logging in.", + "totp-hint": "Authenticator app is set up for your account", + "backup_code": "Backup code", + "backup-code-description": "These printable one-time passcodes allow you to sign in when away from your phone, like when you’re traveling.", + "backup-code-hint": "{{ info }} single-use codes are active at this time" + } + } }, "relation": { "relations": "Relaciones", @@ -2003,6 +2686,7 @@ "delete": "Borrar relación", "relation-type": "Tipo de relación", "relation-type-required": "Tipo de relación requerido.", + "relation-type-max-length": "Tipo de relación debe ser menor de 256", "any-relation-type": "Cualquier tipo", "add": "Añadir relación", "edit": "Editar relación", @@ -2022,6 +2706,35 @@ "invalid-additional-info": "Error al analizar el fichero JSON de información adicional.", "no-relations-text": "No se encontraron relaciones" }, + "resource": { + "add": "Añadir Recurso", + "copyId": "Copiar Id de recurso", + "delete": "Borrar recurso", + "delete-resource-text": "Atención, tras la confirmación el recurso será irrecuperable.", + "delete-resource-title": "Estás seguro de borrar el recurso '{{resourceTitle}}'?", + "delete-resources-action-title": "Borrar { count, plural, 1 {1 recurso} other {# recursos} }", + "delete-resources-text": "Los recursos serán borrados, incluso si están siendo usados en los perfiles de dispositivo.", + "delete-resources-title": "Estás seguro de borrar { count, plural, 1 {1 recurso} other {# recursos} }?", + "download": "Descargar recurso", + "drop-file": "Arrastra un fichero o haz click para seleccionar un fichero a subir.", + "drop-resource-file-or": "Arrastrar y soltar un fichero o", + "empty": "El recurso está vacío", + "file-name": "Nombre de fichero", + "idCopiedMessage": "El Id de recurso ha sido copiado al portapapeles", + "no-resource-matching": "No se han encontrado recursos que coincidan con '{{widgetsBundle}}'.", + "no-resource-text": "No se encontraron recursos", + "open-widgets-bundle": "Abrir paquete de widgets", + "resource": "Recurso", + "resource-library-details": "Detalles de recurso", + "resource-type": "Tipo de recurso", + "resources-library": "Librería de recursos", + "search": "Buscar recursos", + "selected-resources": "{ count, plural, 1 {1 recurso} other {# recursos} } seleccionados", + "system": "Sistema", + "title": "Título", + "title-required": "Título requerido.", + "title-max-length": "El título debe ser menor de 256" + }, "rulechain": { "rulechain": "Cadena de Regla", "rulechains": "Cadenas de Reglas", @@ -2029,6 +2742,7 @@ "delete": "Borrar cadena de reglas", "name": "Nombre", "name-required": "Nombre requerido.", + "name-max-length": "Nombre debe ser menor de 256", "description": "Descripción", "add": "Añadir Cadena", "set-root": "Hacer la cadena de reglas Raíz", @@ -2061,14 +2775,12 @@ "search": "Buscar cadenas de reglas", "selected-rulechains": "{ count, plural, 1 {1 cadena de reglas} other {# cadenas de reglas} } seleccionadas", "open-rulechain": "Abrir cadena de reglas", - "assign-rulechains": "Asignar cadenas de reglas", "assign-new-rulechain": "Asignar nueva cadena de reglas", - "delete-rulechains": "Eliminar cadenas de reglas", - "unassign-rulechain": "Anular asignación de cadena de reglas", - "unassign-rulechains": "Anular asignación de cadenas de reglas", - "unassign-rulechain-title": "¿Está seguro de que desea desasignar la cadena de reglas '{{ruleChainName}}'?", + "edge-template-root": "Raíz de plantilla", + "assign-to-edge": "Asignar a Edge", + "edge-rulechain": "Cadena de reglas de borde", "unassign-rulechain-from-edge-text": "Después de la confirmación, la cadena de reglas quedará sin asignar y el borde no podrá acceder a ella", - "unassign-rulechains-from-edge-action-title": "Anular asignación {count, plural, 1 {1 cadena de reglas} other {# cadenas de reglas} } des bordes", + "unassign-rulechains-from-edge-title": "Estás seguro de desasignar { count, plural, 1 {1 cadena de reglas} other {# cadenas de reglas} }?", "unassign-rulechains-from-edge-text": "Después de la confirmación, todas las cadenas de reglas seleccionadas quedarán sin asignar y el borde no podrá acceder a ellas", "assign-rulechain-to-edge-title": "Asignar cadena (s) de reglas a borde", "assign-rulechain-to-edge-text": "Seleccione las cadenas de reglas para asignar al borde", @@ -2082,9 +2794,8 @@ "unset-auto-assign-to-edge": "Desmarcar asignar cadena de reglas a los bordes en la creación", "unset-auto-assign-to-edge-title": "¿Está seguro de que desea anular la asignación de la cadena de reglas de borde '{{ruleChainName}}' a los bordes en la creación?", "unset-auto-assign-to-edge-text": "Después de la confirmación, la cadena de reglas de borde ya no se asignará automáticamente a los bordes en la creación.", - "edge-template-root": "Raíz de plantilla", - "assign-to-edge": "Asignar a Edge", - "edge-rulechain": "Cadena de regla de borde" + "unassign-rulechain-title": "¿Está seguro de que desea desasignar la cadena de reglas '{{ruleChainName}}'?", + "unassign-rulechains": "Anular asignación de cadenas de reglas" }, "rulenode": { "details": "Detalles", @@ -2094,6 +2805,7 @@ "add": "Añadir nodo de reglas", "name": "Nombre", "name-required": "El nombre es requerido.", + "name-max-length": "Nombre debe ser menor de 256", "type": "Tipo", "description": "Descripción", "delete": "Eliminar nodo de reglas", @@ -2101,6 +2813,7 @@ "deselect-all-objects": "Deshacer selección de todos los nodos y conexiones", "delete-selected-objects": "Eliminar nodos y conexiones seleccionados", "delete-selected": "Eliminar seleccionado", + "create-nested-rulechain": "Crear cadena de reglas anidada", "select-all": "Seleccionar todos", "copy-selected": "Copiar seleccionado", "deselect-all": "Deshacer selección de todos", @@ -2131,6 +2844,8 @@ "type-external-details": "Interactuar con sistemas externos", "type-rule-chain": "Cadena de reglas", "type-rule-chain-details": "Reenvíar los mensajes entrantes a la cadena de reglas especificada", + "type-flow": "Flujo", + "type-flow-details": "Organiza el flujo de mensajes", "type-input": "Entrada", "type-input-details": "Entrada lógica de la Cadena de Reglas, reenvíar los mensajes entrantes al siguiente nodo de regla relacionado.", "type-unknown": "Desconocido", @@ -2154,12 +2869,89 @@ "timezone": "Zona Horaria", "select-timezone": "Seleccionar zona horaria", "no-timezones-matching": "No hay zonas horarias que coincidan con '{{timezone}}'.", - "timezone-required": "Se requiere zona horaria." + "timezone-required": "Se requiere zona horaria.", + "browser-time": "Hora del navegador" }, "queue": { - "select_name": "Selecciona el nombre de la cola", - "name": "Nombre Cola", - "name_required": "Necesario especificar el nombre de cola" + "queue-name": "Queue", + "no-queues-matching": "No se encontraron colas que coincidan con '{{queue}}'.", + "select_name": "Selecciona el nombre de la cola", + "name": "Nombre Cola", + "name_required": "Necesario especificar el nombre de cola", + "name-unique": "Queue name is not unique!", + "queue-required": "Queue is required!", + "topic-required": "Queue topic is required!", + "poll-interval-required": "Poll interval is required!", + "poll-interval-min-value": "Poll interval value can't be less then 1", + "partitions-required": "Partitions is required!", + "partitions-min-value": "Partitions value can't be less then 1", + "pack-processing-timeout-required": "Processing timeout is required", + "pack-processing-timeout-min-value": "Processing timeout value can't be less then 1", + "batch-size-required": "Batch size is required!", + "batch-size-min-value": "Batch size value can't be less then 1", + "retries-required": "Retries is required!", + "retries-min-value": "Retries value can't be negative", + "failure-percentage-required": "Failure percentage is required!", + "failure-percentage-min-value": "Failure percentage value can't be less then 0", + "failure-percentage-max-value": "Failure percentage value can't be more then 100", + "pause-between-retries-required": "Pause between retries is required!", + "pause-between-retries-min-value": "Pause between retries value can't be less then 1", + "max-pause-between-retries-required": "Max pause between retries is required!", + "max-pause-between-retries-min-value": "Max pause between retries value can't be less then 1", + "submit-strategy-type-required": "Submit strategy type is required!", + "processing-strategy-type-required": "Processing strategy type is required!", + "queues": "Queues", + "selected-queues": "{ count, plural, 1 {1 queue} other {# queues} } selected", + "delete-queue-title": "Are you sure you want to delete the queue '{{queueName}}'?", + "delete-queues-title": "Are you sure you want to delete { count, plural, 1 {1 queue} other {# queues} }?", + "delete-queue-text": "Be careful, after the confirmation the queue and all related data will become unrecoverable.", + "delete-queues-text": "After the confirmation all selected queues will be deleted and won't be accessible.", + "search": "Search queue", + "add" : "Add queue", + "details": "Queue details", + "topic": "Topic", + "submit-strategy": "Submit Strategy", + "processing-strategy": "Processing Strategy", + "poll-interval": "Poll interval", + "partitions": "Partitions", + "consumer-per-partition": "Consumer per partition", + "consumer-per-partition-hint": "Enable separate consumer(s) per each partition", + "processing-timeout": "Processing timeout, ms", + "batch-size": "Batch size", + "retries": "Retries (0 - unlimited)", + "failure-percentage": "Failure Percentage", + "pause-between-retries": "Pause between retries", + "max-pause-between-retries": "Maximal pause between retries", + "delete": "Delete queue", + "copyId": "Copy queue Id", + "idCopiedMessage": "Queue Id has been copied to clipboard", + "description": "Description", + "description-hint": "This text will be displayed in the Queue description instead of the selected strategy", + "alt-description": "Submit Strategy: {{submitStrategy}}, Processing Strategy: {{processingStrategy}}", + "strategies": { + "sequential-by-originator-label": "Sequential by originator", + "sequential-by-originator-hint": "New message for e.g. device A is not submitted until previous message for device A is acknowledged", + "sequential-by-tenant-label": "Sequential by tenant", + "sequential-by-tenant-hint": "New message for e.g tenant A is not submitted until previous message for tenant A is acknowledged", + "sequential-label": "Sequential", + "sequential-hint": "New message is not submitted until previous message is acknowledged", + "burst-label": "Burst", + "burst-hint": "All messages are submitted to the rule chains in the order they arrive", + "batch-label": "Batch", + "batch-hint": "New batch is not submitted until previous batch is acknowledged", + "skip-all-failures-label": "Skip all failures", + "skip-all-failures-hint": "Ignore all failures", + "skip-all-failures-and-timeouts-label": "Skip all failures and timeouts", + "skip-all-failures-and-timeouts-hint": "Ignore all failures and timeouts", + "retry-all-label": "Retry all", + "retry-all-hint": "Retry all messages from processing pack", + "retry-failed-label": "Retry failed", + "retry-failed-hint": "Retry all failed messages from processing pack", + "retry-timeout-label": "Retry timeout", + "retry-timeout-hint": "Retry all timed-out messages from processing pack", + "retry-failed-and-timeout-label": "Retry failed and timeout", + "retry-failed-and-timeout-hint": "Retry all failed and timed-out messages from processing pack" + } }, "tenant": { "tenant": "Propietario", @@ -2172,6 +2964,7 @@ "add-tenant-text": "Agregar nuevo propietario", "no-tenants-text": "Ningún propietario encontrado", "tenant-details": "Detalles del propietario", + "title-max-length": "Título debe ser menor de 256", "delete-tenant-title": "¿Quieres eliminar el propietario '{{tenantTitle}}'?", "delete-tenant-text": "Atención, tras la confirmación el propietario será eliminado y la información relacionada será irrecuperable.", "delete-tenants-title": "¿Quieres eliminar { count, plural, 1 {1 propietario} other {# propietarios} }?", @@ -2201,6 +2994,7 @@ "edit": "Editar perfil de propietario", "tenant-profile-details": "Detalles perfil de propietario", "no-tenant-profiles-text": "No se encontraron perfiles de propietario", + "name-max-length": "El nombre debe ser menor de 256", "search": "Buscar perfiles de propietario", "selected-tenant-profiles": "{ count, plural, 1 {1 perfil de propietario} other {# perfiles de propietario} } seleccionados", "no-tenant-profiles-matching": "No se han encontrado perfiles de propietario que coincidan con '{{entity}}'.", @@ -2223,6 +3017,12 @@ "set-default-tenant-profile-text": "Tras la confirmación, el perfil propietario será marcado por defecto y será usado por los nuevos perfiles propietarios que no tengan perfil específico.", "no-tenant-profiles-found": "No se encontraron perfiles de propietario.", "create-new-tenant-profile": "Crear un nuevo perfil!", + "create-tenant-profile": "Crear un nuevo perfil de propietario", + "import": "Importar perfil de propietario", + "export": "Exportar perfil de propietario", + "export-failed-error": "No se ha podido exportar el perfil de propietario: {{error}}", + "tenant-profile-file": "Archivo de perfil de propietario", + "invalid-tenant-profile-file-error": "No se ha podido importar el perfil de propietario: Estructura de datos inválida.", "maximum-devices": "Nº Máximo de dispositivos (0 - sin límite)", "maximum-devices-required": "Nº Máximo de dispositivos requerido.", "maximum-devices-range": "Nº Máximo de dispositivos no puede ser negativo", @@ -2241,6 +3041,12 @@ "maximum-rule-chains": "Nº Máximo de cadenas de reglas (0 - sin límite)", "maximum-rule-chains-required": "Nº Máximo de cadenas de reglas requerido.", "maximum-rule-chains-range": "Nº Máximo de cadenas de reglas no puede ser negativo", + "maximum-resources-sum-data-size": "Tamaño máximo de ficheros de recursos en bytes (0 - sin límite)", + "maximum-resources-sum-data-size-required": "Tamaño máximo de ficheros de recursos requerido.", + "maximum-resources-sum-data-size-range": "Tamaño máximo de ficheros de recursos no puede ser negativo", + "maximum-ota-packages-sum-data-size": "Tamaño máximo de paquetes OTA en bytes (0 - sin límite)", + "maximum-ota-package-sum-data-size-required": "Tamaño máximo de paquetes OTA requerido.", + "maximum-ota-package-sum-data-size-range": "Tamaño máximo de paquetes OTA no puede ser negativo", "transport-tenant-msg-rate-limit": "Tasa de mensajes de transporte por propietario.", "transport-tenant-telemetry-msg-rate-limit": "Tasa de mensajes de telemetría por propietario.", "transport-tenant-telemetry-data-points-rate-limit": "Tasa de datapoints por propietario.", @@ -2265,6 +3071,12 @@ "default-storage-ttl-days": "Días por defecto grabado TTL (0 - sin límite)", "default-storage-ttl-days-required": "Días por defecto TTL requerido.", "default-storage-ttl-days-range": "Días por defecto TTL no puede ser negativo", + "alarms-ttl-days": "Días de TTL alarmas (0 - sin límite)", + "alarms-ttl-days-required": "Días de TTL alarmas requerido", + "alarms-ttl-days-days-range": "Días de TTL alarmas no puede ser negativo", + "rpc-ttl-days": "Días TTL RPC (0 - sin límite)", + "rpc-ttl-days-required": "Días TTL RPC requerido", + "rpc-ttl-days-days-range": "Días TTL RPC no puede ser negativo", "max-rule-node-executions-per-message": "Nº Máximo de ejecuciones (cadena de reglas) por mensaje (0 - sin límite)", "max-rule-node-executions-per-message-required": "Nº Máximo de ejecuciones por mensaje requerido.", "max-rule-node-executions-per-message-range": "Nº Máximo de ejecuciones por mensaje no puede ser negativo", @@ -2273,20 +3085,47 @@ "max-emails-range": "Nº Máximo de emails no puede ser negativo", "max-sms": "Nº Máximo de mensajes SMS (0 - sin límite)", "max-sms-required": "Nº Máximo de mensajes SMS requerido.", - "max-sms-range": "Nº Máximo de mensajes SMS no puede ser negativo" + "max-sms-range": "Nº Máximo de mensajes SMS no puede ser negativo", + "max-created-alarms": "Nº Máximo de alarmas creadas (0 - sin límite)", + "max-created-alarms-required": "Nº Máximo de alarmas creadas requerido.", + "max-created-alarms-range": "Nº Máximo de alarmas creadas no puede ser negativo", + "no-queue": "No Queue configured", + "add-queue": "Add Queue", + "queues-with-count": "Queues ({{count}})" }, "timeinterval": { - "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", - "seconds": "Segundos", - "advanced": "Avanzado" + "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", + "seconds": "Segundos", + "advanced": "Avanzado", + "predefined": { + "yesterday": "Ayer", + "day-before-yesterday": "Anteayer", + "this-day-last-week": "Hoy hace una semana", + "previous-week": "Semana anterior (Dom - Sáb)", + "previous-week-iso": "Semana anterior (Lun - Dom)", + "previous-month": "Mes anterior", + "previous-year": "Año anterior", + "current-hour": "Hora actual", + "current-day": "Día actual", + "current-day-so-far": "Día actual hasta ahora", + "current-week": "Semana actual (Dom - Sáb)", + "current-week-iso": "Semana actual (Lun - Dom)", + "current-week-so-far": "Semana actual hasta hoy (Dom - Sáb)", + "current-week-iso-so-far": "Semana actual hasta hoy (Lun - Dom)", + "current-month": "Mes actual", + "current-month-so-far": "Mes actual hasta hoy", + "current-year": "Año actual", + "current-year-so-far": "Año actual hasta ahora" + } }, "timeunit": { + "milliseconds": "Milisegundos", "seconds": "Segundos", "minutes": "Minutos", "hours": "Horas", @@ -2305,7 +3144,8 @@ "date-range": "Rango de fechas", "last": "Últimos(s)", "time-period": "Período de tiempo", - "hide": "Ocultar" + "hide": "Ocultar", + "interval": "Intervalo" }, "user": { "user": "Usuario", @@ -2354,7 +3194,9 @@ "disable-account": "Deshabilitar cuenta de usuario", "enable-account": "Habilitar cuenta de usuario", "enable-account-message": "¡La cuenta de usuario se ha habilitado correctamente!", - "disable-account-message": "¡La cuenta de usuario se deshabilitó correctamente!" + "disable-account-message": "¡La cuenta de usuario se deshabilitó correctamente!", + "copyId": "Copiar Id de usuario", + "idCopiedMessage": "El Id de usuario se ha copiado al portapapeles" }, "value": { "type": "Tipo de valor", @@ -2381,6 +3223,7 @@ "widget": { "widget-library": "Bibloteca de Widgets", "widget-bundle": "Paquetes de Widgets", + "all-bundles": "Todos los paquetes", "select-widgets-bundle": "Seleccionar paquete de widgets", "management": "Gestión de Widgets", "editor": "Editor de widgets", @@ -2420,6 +3263,13 @@ "css": "CSS", "settings-schema": "Esquema de configuración", "datakey-settings-schema": "Esquema de configuración de clave de datos", + "latest-datakey-settings-schema": "Esquema de últimos valores", + "widget-settings": "Ajustes de widget", + "description": "Descripción", + "image-preview": "Imagen previsualización", + "settings-form-selector": "Selector formulario de ajustes", + "data-key-settings-form-selector": "Selector formulario de ajustes claves de datos", + "latest-data-key-settings-form-selector": "Selector formulario de últimos valores", "javascript": "Javascript", "js": "JS", "remove-widget-type-title": "¿Eliminar el tipo del widget '{{widgetName}}'?", @@ -2433,7 +3283,10 @@ "export": "Exportar widget", "no-data": "No hay datos para mostrar en widget", "data-overflow": "El widget muestra {{count}} de {{total}} entidades", - "alarm-data-overflow": "El widget muestra alarmas para {{allowedEntities}} entidades (máximo permitido) de {{totalEntities}} entidades" + "alarm-data-overflow": "El widget muestra alarmas para {{allowedEntities}} entidades (máximo permitido) de {{totalEntities}} entidades", + "search": "Buscar widget", + "filter": "Filtro tipo de widget", + "loading-widgets": "Cargando widgets..." }, "widget-action": { "header-button": "Botón de encabezado widget", @@ -2442,18 +3295,52 @@ "open-dashboard": "Navegar hacia otro panel", "custom": "Acción personalizada", "custom-pretty": "Acción personalizada (con plantilla HTML)", + "mobile-action": "Acción en dispositivo móvil", "target-dashboard-state": "Estado de panel de destino", "target-dashboard-state-required": "Se requiere estado de panel de destino", "set-entity-from-widget": "Establecer entidad desde widget", "target-dashboard": "Panel de destino", "open-right-layout": "Abrir diseño de panel (derecho)(vista móvil)", + "state-display-type": "Opciones de display de panel", + "open-normal": "Normal", "open-in-separate-dialog": "Abrir en un diálogo separado", + "open-in-popover": "Abrir en popover", "dialog-title": "Título del diálogo", "dialog-hide-dashboard-toolbar": "Ocultar barra de herramientas en el diálogo", "dialog-width": "Ancho de diálogo en porcentaje relativo al ancho del viewport", "dialog-height": "Alto de diálogo en porcentaje relativo al alto del viewport", "dialog-size-range-error": "El tamaño del diálogo debe ser entre un rango de 1 a 100", - "open-new-browser-tab": "Abrir en una nueva pestaña" + "popover-preferred-placement": "Ubicación preferida popover", + "popover-placement-top": "Superior", + "popover-placement-topLeft": "Superior izquierda", + "popover-placement-topRight": "Superior derecha", + "popover-placement-right": "Derecha", + "popover-placement-rightTop": "Derecha superior", + "popover-placement-rightBottom": "Derecha inferior", + "popover-placement-bottom": "Inferior", + "popover-placement-bottomLeft": "Inferior izquierda", + "popover-placement-bottomRight": "Inferior derecha", + "popover-placement-left": "Izquierda", + "popover-placement-leftTop": "Izquierda superior", + "popover-placement-leftBottom": "Izquierda inferior", + "popover-hide-on-click-outside": "Ocultar en click fuera del popover", + "popover-hide-dashboard-toolbar": "Ocultar caja de herramientas en popover", + "popover-width": "Ancho de popover en unidades de navegador (ej. 100px, 25vw)", + "popover-height": "Altura de popover en unidades de navegador (ej. 100px, 25vh)", + "popover-style": "Estilo de popover", + "open-new-browser-tab": "Abrir en una nueva pestaña", + "mobile": { + "action-type": "Tipo de acción móvil", + "action-type-required": "Tipo de acción móvil requerida", + "take-picture-from-gallery": "Tomar foto de galería", + "take-photo": "Tomar foto", + "map-direction": "Abrir indicaciones en mapa", + "map-location": "Abrir localización en mapa", + "scan-qr-code": "Escanear código QR", + "make-phone-call": "Hacer llamada telefónica", + "get-location": "Obtener localización del teléfono", + "take-screenshot": "Obtener captura de pantalla" + } }, "widgets-bundle": { "current": "Paquete actual", @@ -2462,6 +3349,9 @@ "delete": "Eliminar paquete de widgets", "title": "Título", "title-required": "Título requerido.", + "title-max-length": "El título debe ser menor de 256", + "description": "Descripción", + "image-preview": "Imagen previsualización", "add-widgets-bundle-text": "Agregar nuevo paquete de widgets", "no-widgets-bundles-text": "Ningún paquete de widgets encontrado", "empty": "Paquete de widgets vacío.", @@ -2483,7 +3373,8 @@ "invalid-widgets-bundle-file-error": "Imposible importar paquete de widgets: Estructura de datos inválida.", "search": "Buscar paquete de widgets", "selected-widgets-bundles": "{ count, plural, 1 {1 paquete de widgets} other {# paquetes de widgets} } seleccionados", - "open-widgets-bundle": "Abrir paquete de widgets" + "open-widgets-bundle": "Abrir paquete de widgets", + "loading-widgets-bundles": "Cargando paquete de widgets..." }, "widget-config": { "data": "Datos", @@ -2500,15 +3391,18 @@ "padding": "Relleno", "margin": "Margen", "widget-style": "Estilo de widget", + "widget-css": "CSS de widget", "title-style": "Estilo de título", "mobile-mode-settings": "Ajustes móvil.", "order": "Orden", "height": "Altura", + "mobile-hide": "Ocultar widget en modo móvil", "units": "Caracter especial a mostrar en el siguiente valor", "decimals": "Números de dígitos después de la coma", "timewindow": "Ventana de tiempo", "use-dashboard-timewindow": "Usar ventana de tiempo del Panel", "display-timewindow": "Mostrar ventana de tiempo", + "legend": "Leyenda", "display-legend": "Mostrar leyenda", "datasources": "Set de datos", "maximum-datasources": "Un máximo de { count, plural, 1 {1 set de datos es permitido.} other {# set de datos son permitidos} }", @@ -2529,15 +3423,22 @@ "action-name-required": "Nombre de accion requerido.", "action-name-not-unique": "Existe una acción con el mismo nombre.
El nombre de acción debe ser único dentro de la misma fuente de acción (origen).", "action-icon": "Icono", + "show-hide-action-using-function": "Mostrar/Ocultar acción usando función", "action-type": "Tipo", "action-type-required": "Tipo de acción requerido.", "edit-action": "Editar acción", "delete-action": "Borrar acción", "delete-action-title": "Borrar acción de widget", "delete-action-text": "Eliminar la acción de widget con el nombre '{{actionName}}'?", - "display-icon": "Mostrar icono del título", + "title-icon": "Título de icono", + "display-icon": "Mostrar título de icono", "icon-color": "Color del icono", - "icon-size": "Tamaño del icono" + "icon-size": "Tamaño del icono", + "advanced-settings": "Ajustes avanzados", + "data-settings": "Ajustes de datos", + "no-data-display-message": "\"No hay datos que mostrar\" mensaje alternativo", + "data-page-size": "Nº Máximo de entidades por origen de datos", + "settings-component-not-found": "Componente de ajustes no encontrado para el selector '{{selector}}'" }, "widget-type": { "import": "Importar tipo de widget", @@ -2548,7 +3449,146 @@ "invalid-widget-type-file-error": "No se puede importar tipo de widget: Estructura de datos del tipo de widget es inválida." }, "widgets": { + "chart": { + "common-settings": "Common settings", + "enable-stacking-mode": "Enable stacking mode", + "line-shadow-size": "Line shadow size", + "display-smooth-lines": "Display smooth (curved) lines", + "default-bar-width": "Default bar width for non-aggregated data (milliseconds)", + "bar-alignment": "Bar alignment", + "bar-alignment-left": "Left", + "bar-alignment-right": "Right", + "bar-alignment-center": "Center", + "default-font-size": "Default font size", + "default-font-color": "Default font color", + "thresholds-line-width": "Default line width for all thresholds", + "tooltip-settings": "Tooltip settings", + "show-tooltip": "Show tooltip", + "hover-individual-points": "Hover individual points", + "show-cumulative-values": "Show cumulative values in stacking mode", + "hide-zero-false-values": "Hide zero/false values from tooltip", + "tooltip-value-format-function": "Tooltip value format function", + "grid-settings": "Grid settings", + "show-vertical-lines": "Show vertical lines", + "show-horizontal-lines": "Show horizontal lines", + "grid-outline-border-width": "Grid outline/border width (px)", + "primary-color": "Primary color", + "background-color": "Background color", + "ticks-color": "Ticks color", + "xaxis-settings": "X axis settings", + "axis-title": "Axis title", + "xaxis-tick-labels-settings": "X axis tick labels settings", + "show-tick-labels": "Show axis tick labels", + "yaxis-settings": "Y axis settings", + "min-scale-value": "Minimum value on the scale", + "max-scale-value": "Maximum value on the scale", + "yaxis-tick-labels-settings": "Y axis tick labels settings", + "tick-step-size": "Step size between ticks", + "number-of-decimals": "The number of decimals to display", + "ticks-formatter-function": "Ticks formatter function", + "comparison-settings": "Comparison settings", + "enable-comparison": "Enable comparison", + "time-for-comparison": "Comparison period", + "time-for-comparison-previous-interval": "Previous interval (default)", + "time-for-comparison-days": "Day ago", + "time-for-comparison-weeks": "Week ago", + "time-for-comparison-months": "Month ago", + "time-for-comparison-years": "Year ago", + "time-for-comparison-custom-interval": "Custom interval", + "custom-interval-value": "Custom interval value (ms)", + "comparison-x-axis-settings": "Comparison X axis settings", + "axis-position": "Axis position", + "axis-position-top": "Top (default)", + "axis-position-bottom": "Bottom", + "custom-legend-settings": "Custom legend settings", + "enable-custom-legend": "Enable custom legend (this will allow you to use attribute/timeseries values in key labels)", + "key-name": "Key name", + "key-name-required": "Key name is required", + "key-type": "Key type", + "key-type-attribute": "Attribute", + "key-type-timeseries": "Timeseries", + "label-keys-list": "Keys list to use in labels", + "no-label-keys": "No keys configured", + "add-label-key": "Add new key", + "line-width": "Line width", + "color": "Color", + "data-is-hidden-by-default": "Data is hidden by default", + "disable-data-hiding": "Disable data hiding", + "remove-from-legend": "Remove datakey from legend", + "exclude-from-stacking": "Exclude from stacking(available in \"Stacking\" mode)", + "line-settings": "Line settings", + "show-line": "Show line", + "fill-line": "Fill line", + "points-settings": "Points settings", + "show-points": "Show points", + "points-line-width": "Line width of points", + "points-radius": "Radius of points", + "point-shape": "Point shape", + "point-shape-circle": "Circle", + "point-shape-cross": "Cross", + "point-shape-diamond": "Diamond", + "point-shape-square": "Square", + "point-shape-triangle": "Triangle", + "point-shape-custom": "Custom function", + "point-shape-draw-function": "Point shape draw function", + "show-separate-axis": "Show separate axis", + "axis-position-left": "Left", + "axis-position-right": "Right", + "thresholds": "Thresholds", + "no-thresholds": "No thresholds configured", + "add-threshold": "Add new threshold", + "show-values-for-comparison": "Show historical values for comparison", + "comparison-values-label": "Historical values label", + "threshold-settings": "Threshold settings", + "use-as-threshold": "Use key value as threshold", + "threshold-line-width": "Threshold line width", + "threshold-color": "Threshold color", + "common-pie-settings": "Common pie settings", + "radius": "Radius", + "inner-radius": "Inner radius", + "tilt": "Tilt", + "stroke-settings": "Stroke settings", + "width-pixels": "Width (pixels)", + "show-labels": "Show labels", + "animation-settings": "Animation settings", + "animated-pie": "Enable pie animation (experimental)", + "border-settings": "Border settings", + "border-width": "Border width", + "border-color": "Border color", + "legend-settings": "Legend settings", + "display-legend": "Display legend", + "labels-font-color": "Labels font color" + }, + "dashboard-state": { + "dashboard-state-settings": "Dashboard state settings", + "dashboard-state": "Dashboard state id", + "autofill-state-layout": "Autofill state layout height by default", + "default-margin": "Default widgets margin", + "default-background-color": "Default background color", + "sync-parent-state-params": "Sync state params with parent dashboard" + }, "date-range-navigator": { + "date-range-picker-settings": "Date range picker settings", + "hide-date-range-picker": "Hide date range picker", + "picker-one-panel": "Date range picker one panel", + "picker-auto-confirm": "Date range picker auto confirm", + "picker-show-template": "Date range picker show template", + "first-day-of-week": "First day of the week", + "interval-settings": "Interval settings", + "hide-interval": "Hide interval", + "initial-interval": "Initial interval", + "interval-hour": "Hour", + "interval-day": "Day", + "interval-week": "Week", + "interval-two-weeks": "2 weeks", + "interval-month": "Month", + "interval-three-months": "3 months", + "interval-six-months": "6 months", + "step-settings": "Step settings", + "hide-step-size": "Hide step size", + "initial-step-size": "Initial step size", + "hide-labels": "Hide labels", + "use-session-storage": "Use session storage", "localizationMap": { "Sun": "Dom.", "Mon": "Lun.", @@ -2605,6 +3645,176 @@ "Ok": "Ok" } }, + "entities-hierarchy": { + "hierarchy-data-settings": "Hierarchy data settings", + "relations-query-function": "Node relations query function", + "has-children-function": "Node has children function", + "node-state-settings": "Node state settings", + "node-opened-function": "Default node opened function", + "node-disabled-function": "Node disabled function", + "display-settings": "Display settings", + "node-icon-function": "Node icon function", + "node-text-function": "Node text function", + "sort-settings": "Sort settings", + "nodes-sort-function": "Nodes sort function" + }, + "edge": { + "display-default-title": "Display default title" + }, + "gateway": { + "general-settings": "General settings", + "widget-title": "Widget title", + "default-archive-file-name": "Default archive file name", + "device-type-for-new-gateway": "Device type for new gateway", + "messages-settings": "Messages settings", + "save-config-success-message": "Text message about successfully saved gateway configuration", + "device-name-exists-message": "Text message when device with entered name is already exists", + "gateway-title": "Gateway form", + "read-only": "Read only", + "events-title": "Gateway events form title", + "events-filter": "Events filter", + "event-key-contains": "Event key contains..." + }, + "gauge": { + "default-color": "Default color", + "radial-gauge-settings": "Radial gauge settings", + "ticks-settings": "Ticks settings", + "min-value": "Minimum value", + "max-value": "Maximum value", + "start-ticks-angle": "Start ticks angle", + "ticks-angle": "Ticks angle", + "major-ticks-count": "Major ticks count", + "major-ticks-color": "Major ticks color", + "minor-ticks-count": "Minor ticks count", + "minor-ticks-color": "Minor ticks color", + "tick-numbers-font": "Tick numbers font", + "unit-title-settings": "Unit title settings", + "show-unit-title": "Show unit title", + "unit-title": "Unit title", + "title-font": "Title text font", + "units-settings": "Units settings", + "units-font": "Units text font", + "value-box-settings": "Value box settings", + "show-value-box": "Show value box", + "value-int": "Digits count for integer part of value", + "value-font": "Value text font", + "value-box-rect-stroke-color": "Value box rectangle stroke color", + "value-box-rect-stroke-color-end": "Value box rectangle stroke color - end gradient", + "value-box-background-color": "Value box background color", + "value-box-shadow-color": "Value box shadow color", + "plate-settings": "Plate settings", + "show-plate-border": "Show plate border", + "plate-color": "Plate color", + "needle-settings": "Needle settings", + "needle-circle-size": "Needle circle size", + "needle-color": "Needle color", + "needle-color-end": "Needle color - end gradient", + "needle-color-shadow-up": "Upper half of the needle shadow color", + "needle-color-shadow-down": "Drop shadow needle color", + "highlights-settings": "Highlights settings", + "highlights-width": "Highlights width", + "highlights": "Highlights", + "highlight-from": "From", + "highlight-to": "To", + "highlight-color": "Color", + "no-highlights": "No highlights configured", + "add-highlight": "Add highlight", + "animation-settings": "Animation settings", + "enable-animation": "Enable animation", + "animation-duration": "Animation duration", + "animation-rule": "Animation rule", + "animation-linear": "Linear", + "animation-quad": "Quad", + "animation-quint": "Quint", + "animation-cycle": "Cycle", + "animation-bounce": "Bounce", + "animation-elastic": "Elastic", + "animation-dequad": "Dequad", + "animation-dequint": "Dequint", + "animation-decycle": "Decycle", + "animation-debounce": "Debounce", + "animation-delastic": "Delastic", + "linear-gauge-settings": "Linear gauge settings", + "bar-stroke-width": "Bar stroke width", + "bar-stroke-color": "Bar stroke color", + "bar-background-color": "Gauge bar background color", + "bar-background-color-end": "Bar background color - end gradient", + "progress-bar-color": "Progress bar color", + "progress-bar-color-end": "Progress bar color - end gradient", + "major-ticks-names": "Major ticks names", + "show-stroke-ticks": "Show ticks stroke", + "major-ticks-font": "Major ticks font", + "border-color": "Border color", + "border-width": "Border width", + "needle-circle-color": "Needle circle color", + "animation-target": "Animation target", + "animation-target-needle": "Needle", + "animation-target-plate": "Plate", + "common-settings": "Common gauge settings", + "gauge-type": "Gauge type", + "gauge-type-arc": "Arc", + "gauge-type-donut": "Donut", + "gauge-type-horizontal-bar": "Horizontal bar", + "gauge-type-vertical-bar": "Vertical bar", + "donut-start-angle": "Angle to start from", + "bar-settings": "Gauge bar settings", + "relative-bar-width": "Relative bar width", + "neon-glow-brightness": "Neon glow effect brightness, (0-100), 0 - disable effect", + "stripes-thickness": "Thickness of the stripes, 0 - no stripes", + "rounded-line-cap": "Display rounded line cap", + "bar-color-settings": "Bar color settings", + "use-precise-level-color-values": "Use precise color levels", + "bar-colors": "Bar colors, from lower to upper", + "color": "Color", + "no-bar-colors": "No bar colors configured", + "add-bar-color": "Add bar color", + "from": "From", + "to": "To", + "fixed-level-colors": "Bar colors using boundary values", + "gauge-title-settings": "Gauge title settings", + "show-gauge-title": "Show gauge title", + "gauge-title": "Gauge title", + "gauge-title-font": "Gauge title font", + "unit-title-and-timestamp-settings": "Unit title and timestamp settings", + "show-timestamp": "Show value timestamp", + "timestamp-format": "Timestamp format", + "label-font": "Font of label showing under value", + "value-settings": "Value settings", + "show-value": "Show value text", + "min-max-settings": "Minimum/maximum labels settings", + "show-min-max": "Show min and max values", + "min-max-font": "Font of minimum and maximum labels", + "show-ticks": "Show ticks", + "tick-width": "Tick width", + "tick-color": "Tick color", + "tick-values": "Tick values", + "no-tick-values": "No tick values configured", + "add-tick-value": "Add tick value" + }, + "gpio": { + "pin": "Pin", + "label": "Label", + "row": "Row", + "column": "Column", + "color": "Color", + "panel-settings": "Panel settings", + "background-color": "Background color", + "gpio-switches": "GPIO switches", + "no-gpio-switches": "No GPIO switches configured", + "add-gpio-switch": "Add GPIO switch", + "gpio-status-request": "GPIO status request", + "method-name": "Method name", + "method-body": "Method body", + "gpio-status-change-request": "GPIO status change request", + "parse-gpio-status-function": "Parse gpio status function", + "gpio-leds": "GPIO leds", + "no-gpio-leds": "No GPIO leds configured", + "add-gpio-led": "Add GPIO led" + }, + "html-card": { + "html": "HTML", + "css": "CSS" + }, "input-widgets": { "attribute-not-allowed": "El parámetro de atributo no se puede usar en este widget", "blocked-location": "La función de geolocalización está bloqueada en tu navegador", @@ -2649,7 +3859,570 @@ "update-successful": "Actualización exitosa", "update-attribute": "Actualizar atributo", "update-timeseries": "Actualizar series de tiempo", - "value": "Valor" + "value": "Valor", + "general-settings": "General settings", + "widget-title": "Widget title", + "claim-button-label": "Claiming button label", + "show-secret-key-field": "Show 'Secret key' input field", + "labels-settings": "Labels settings", + "show-labels": "Show labels", + "device-name-label": "Label for device name input field", + "secret-key-label": "Label for secret key input field", + "messages-settings": "Messages settings", + "claim-device-success-message": "Text message of successful device claiming", + "claim-device-not-found-message": "Text message when device not found", + "claim-device-failed-message": "Text message of failed device claiming", + "claim-device-name-required-message": "'Device name required' error message", + "claim-device-secret-key-required-message": "'Secret key required' error message", + "show-label": "Show label", + "label": "Label", + "required": "Required", + "required-error-message": "'Required' error message", + "show-result-message": "Show result message", + "integer-field-settings": "Integer field settings", + "min-value": "Min value", + "max-value": "Max value", + "double-field-settings": "Double field settings", + "text-field-settings": "Text field settings", + "min-length": "Min length", + "max-length": "Max length", + "checkbox-settings": "Checkbox settings", + "true-label": "Checked label", + "false-label": "Unchecked label", + "image-input-settings": "Image input settings", + "display-preview": "Display preview", + "display-clear-button": "Display clear button", + "display-apply-button": "Display apply button", + "display-discard-button": "Display discard button", + "datetime-field-settings": "Date/time field settings", + "display-time-input": "Display time input", + "latitude-key-name": "Latitude key name", + "longitude-key-name": "Longitude key name", + "show-get-location-button": "Show button 'Get current location'", + "use-high-accuracy": "Use high accuracy", + "location-fields-settings": "Location fields settings", + "latitude-label": "Label for latitude", + "longitude-label": "Label for longitude", + "input-fields-alignment": "Input fields alignment", + "input-fields-alignment-column": "Column (default)", + "input-fields-alignment-row": "Row", + "latitude-field-required": "Latitude field required", + "longitude-field-required": "Longitude field required", + "attribute-settings": "Attribute settings", + "widget-mode": "Widget mode", + "widget-mode-update-attribute": "Update attribute", + "widget-mode-update-timeseries": "Update timeseries", + "attribute-scope": "Attribute scope", + "attribute-scope-server": "Server attribute", + "attribute-scope-shared": "Shared attribute", + "value-required": "Value required", + "image-settings": "Image settings", + "image-format": "Image format", + "image-format-jpeg": "JPEG", + "image-format-png": "PNG", + "image-format-webp": "WEBP", + "image-quality": "Image quality that use lossy compression such as jpeg and webp", + "max-image-width": "Maximum image width", + "max-image-height": "Maximum image height", + "action-buttons": "Action buttons", + "show-action-buttons": "Show action buttons", + "update-all-values": "Update all values, not only modified", + "save-button-label": "'SAVE' button label", + "reset-button-label": "'UNDO' button label", + "group-settings": "Group settings", + "show-group-title": "Show title for group of fields, related to different entities", + "group-title": "Group title", + "fields-alignment": "Fields alignment", + "fields-alignment-row": "Row (default)", + "fields-alignment-column": "Column", + "fields-in-row": "Number of fields in the row", + "option-value": "Value (write 'null' for create empty option)", + "option-label": "Label", + "hide-input-field": "Hide input field", + "datakey-type": "Datakey type", + "datakey-type-server": "Server attribute (default)", + "datakey-type-shared": "Shared attribute", + "datakey-type-timeseries": "Timeseries", + "datakey-value-type": "Datakey value type", + "datakey-value-type-string": "String", + "datakey-value-type-double": "Double", + "datakey-value-type-integer": "Integer", + "datakey-value-type-boolean-checkbox": "Boolean (Checkbox)", + "datakey-value-type-boolean-switch": "Boolean (Switch)", + "datakey-value-type-date-time": "Date & Time", + "datakey-value-type-date": "Date", + "datakey-value-type-time": "Time", + "datakey-value-type-select": "Select", + "value-is-required": "Value is required", + "ability-to-edit-attribute": "Ability to edit attribute", + "ability-to-edit-attribute-editable": "Editable (default)", + "ability-to-edit-attribute-disabled": "Disabled", + "ability-to-edit-attribute-readonly": "Read-only", + "disable-on-datakey-name": "Disable on false value of another datakey (specify datakey name)", + "slide-toggle-settings": "Slide toggle settings", + "slide-toggle-label-position": "Slide toggle label position", + "slide-toggle-label-position-after": "After", + "slide-toggle-label-position-before": "Before", + "select-options": "Select options", + "no-select-options": "No select options configured", + "add-select-option": "Add select option", + "numeric-field-settings": "Numeric field settings", + "step-interval": "Step interval between values", + "error-messages": "Error messages", + "min-value-error-message": "'Min value' error message", + "max-value-error-message": "'Max value' error message", + "invalid-date-error-message": "'Invalid date' error message", + "icon-settings": "Icon settings", + "use-custom-icon": "Use custom icon", + "input-cell-icon": "Icon to show before input cell", + "value-conversion-settings": "Value conversion settings", + "get-value-settings": "Get value settings", + "use-get-value-function": "Use getValue function", + "get-value-function": "getValue function", + "set-value-settings": "Set value settings", + "use-set-value-function": "Use setValue function", + "set-value-function": "setValue function" + }, + "invalid-qr-code-text": "Invalid input text for QR code. Input should have a string type", + "qr-code": { + "use-qr-code-text-function": "Use QR code text function", + "qr-code-text-pattern": "QR code text pattern (for ex. '${entityName} | ${keyName} - some text.')", + "qr-code-text-pattern-required": "QR code text pattern is required.", + "qr-code-text-function": "QR code text function" + }, + "label-widget": { + "label-pattern": "Pattern", + "label-pattern-hint": "Hint: for ex. 'Text ${keyName} units.' or ${#<key index>} units'", + "label-pattern-required": "Pattern is required", + "label-position": "Position (Percentage relative to background)", + "x-pos": "X", + "y-pos": "Y", + "background-color": "Background color", + "font-settings": "Font settings", + "background-image": "Background image", + "labels": "Labels", + "no-labels": "No labels configured", + "add-label": "Add label" + }, + "navigation": { + "title": "Title", + "navigation-path": "Navigation path", + "filter-type": "Filter type", + "filter-type-all": "All items", + "filter-type-include": "Include items", + "filter-type-exclude": "Exclude items", + "items": "Items", + "enter-urls-to-filter": "Enter urls to filter..." + }, + "persistent-table": { + "rpc-id": "RPC ID", + "message-type": "Message type", + "method": "Method", + "params": "Params", + "created-time": "Created time", + "expiration-time": "Expiration time", + "retries": "Retries", + "status": "Status", + "filter": "Filter", + "refresh": "Refresh", + "add": "Add RPC request", + "details": "Details", + "delete": "Delete", + "delete-request-title": "Delete Persistent RPC request", + "delete-request-text": "Are you sure you want to delete request?", + "details-title": "Details RPC ID: ", + "additional-info": "Additional info", + "response": "Response", + "any-status": "Any status", + "rpc-status-list": "RPC status list", + "no-request-prompt": "No request to display", + "send-request": "Send request", + "add-title": "Create Persistent RPC request", + "method-error": "Method is required.", + "timeout-error": "Min timeout value is 5000 (5 seconds).", + "white-space-error": "White space is not allowed.", + "rpc-status": { + "QUEUED": "QUEUED", + "SENT": "SENT", + "DELIVERED": "DELIVERED", + "SUCCESSFUL": "SUCCESSFUL", + "TIMEOUT": "TIMEOUT", + "EXPIRED": "EXPIRED", + "FAILED": "FAILED" + }, + "rpc-search-status-all": "ALL", + "message-types": { + "false": "Two-way", + "true": "One-way" + }, + "general-settings": "General settings", + "enable-filter": "Enable filter", + "enable-sticky-header": "Display header while scrolling", + "enable-sticky-action": "Display actions column while scrolling", + "display-request-details": "Display request details", + "allow-send-request": "Allow send RPC request", + "allow-delete-request": "Allow delete request", + "columns-settings": "Columns settings", + "display-columns": "Columns to display", + "column": "Column", + "no-columns-found": "No columns found", + "no-columns-matching": "'{{column}}' not found." + }, + "rpc": { + "value-settings": "Value settings", + "initial-value": "Initial value", + "retrieve-value-settings": "Retrieve on/off value settings", + "retrieve-value-method": "Retrieve value using method", + "retrieve-value-method-none": "Don't retrieve", + "retrieve-value-method-rpc": "Call RPC get value method", + "retrieve-value-method-attribute": "Subscribe for attribute", + "retrieve-value-method-timeseries": "Subscribe for timeseries", + "attribute-value-key": "Attribute key", + "timeseries-value-key": "Timeseries key", + "get-value-method": "RPC get value method", + "parse-value-function": "Parse value function", + "update-value-settings": "Update value settings", + "set-value-method": "RPC set value method", + "convert-value-function": "Convert value function", + "rpc-settings": "RPC settings", + "request-timeout": "RPC request timeout (ms)", + "persistent-rpc-settings": "Persistent RPC settings", + "request-persistent": "RPC request persistent", + "persistent-polling-interval": "Polling interval (ms) to get persistent RPC command response", + "common-settings": "Common settings", + "switch-title": "Switch title", + "show-on-off-labels": "Show on/off labels", + "slide-toggle-label": "Slide toggle label", + "label-position": "Label position", + "label-position-before": "Before", + "label-position-after": "After", + "slider-color": "Slider color", + "slider-color-primary": "Primary", + "slider-color-accent": "Accent", + "slider-color-warn": "Warn", + "button-style": "Button style", + "button-raised": "Raised button", + "button-primary": "Primary color", + "button-background-color": "Button background color", + "button-text-color": "Button text color", + "widget-title": "Widget title", + "button-label": "Button label", + "device-attribute-scope": "Device attribute scope", + "server-attribute": "Server attribute", + "shared-attribute": "Shared attribute", + "device-attribute-parameters": "Device attribute parameters", + "is-one-way-command": "Is one way command", + "rpc-method": "RPC method", + "rpc-method-params": "RPC method params", + "show-rpc-error": "Show RPC command execution error", + "led-title": "LED title", + "led-color": "LED color", + "check-status-settings": "Check status settings", + "perform-rpc-status-check": "Perform RPC device status check", + "retrieve-led-status-value-method": "Retrieve led status value using method", + "led-status-value-attribute": "Device attribute containing led status value", + "led-status-value-timeseries": "Device timeseries containing led status value", + "check-status-method": "RPC check device status method", + "parse-led-status-value-function": "Parse led status value function", + "knob-title": "Knob title", + "min-value": "Minimum value", + "max-value": "Maximum value" + }, + "maps": { + "select-entity": "Select entity", + "select-entity-hint": "Hint: after selection click at the map to set position", + "tooltips": { + "placeMarker": "Click to place '{{entityName}}' entity", + "firstVertex": "Polygon for '{{entityName}}': click to place first point", + "firstVertex-cut": "Click to place first point", + "continueLine": "Polygon for '{{entityName}}': click to continue drawing", + "continueLine-cut": "Click to continue drawing", + "finishLine": "Click any existing marker to finish", + "finishPoly": "Polygon for '{{entityName}}': click first marker to finish and save", + "finishPoly-cut": "Click first marker to finish and save", + "finishRect": "Polygon for '{{entityName}}': click to finish and save", + "startCircle": "Circle for '{{entityName}}': click to place circle center", + "finishCircle": "Circle for '{{entityName}}': click to finish circle", + "placeCircleMarker": "Click to place circle marker" + }, + "actions": { + "finish": "Finish", + "cancel": "Cancel", + "removeLastVertex": "Remove last point" + }, + "buttonTitles": { + "drawMarkerButton": "Place entity", + "drawPolyButton": "Create polygon", + "drawLineButton": "Create polyline", + "drawCircleButton": "Create circle", + "drawRectButton": "Create rectangle", + "editButton": "Edit mode", + "dragButton": "Drag-drop mode", + "cutButton": "Cut polygon area", + "deleteButton": "Remove", + "drawCircleMarkerButton": "Create circle marker", + "rotateButton": "Rotate polygon" + }, + "map-provider-settings": "Map provider settings", + "map-provider": "Map provider", + "map-provider-google": "Google maps", + "map-provider-openstreet": "OpenStreet maps", + "map-provider-here": "HERE maps", + "map-provider-image": "Image map", + "map-provider-tencent": "Tencent maps", + "openstreet-provider": "OpenStreet map provider", + "openstreet-provider-mapnik": "OpenStreetMap.Mapnik (Default)", + "openstreet-provider-hot": "OpenStreetMap.HOT", + "openstreet-provider-esri-street": "Esri.WorldStreetMap", + "openstreet-provider-esri-topo": "Esri.WorldTopoMap", + "openstreet-provider-cartodb-positron": "CartoDB.Positron", + "openstreet-provider-cartodb-dark-matter": "CartoDB.DarkMatter", + "use-custom-provider": "Use custom provider", + "custom-provider-tile-url": "Custom provider tile URL", + "google-maps-api-key": "Google Maps API Key", + "default-map-type": "Default map type", + "google-map-type-roadmap": "Roadmap", + "google-map-type-satelite": "Satellite", + "google-map-type-hybrid": "Hybrid", + "google-map-type-terrain": "Terrain", + "map-layer": "Map layer", + "here-map-normal-day": "HERE.normalDay (Default)", + "here-map-normal-night": "HERE.normalNight", + "here-map-hybrid-day": "HERE.hybridDay", + "here-map-terrain-day": "HERE.terrainDay", + "credentials": "Credentials", + "here-app-id": "HERE app id", + "here-app-code": "HERE app code", + "tencent-maps-api-key": "Tencent Maps API Key", + "tencent-map-type-roadmap": "Roadmap", + "tencent-map-type-satelite": "Satellite", + "tencent-map-type-hybrid": "Hybrid", + "image-map-background": "Image map background", + "image-map-background-from-entity-attribute": "Take image map background from entity attribute", + "image-url-source-entity-alias": "Image URL source entity alias", + "image-url-source-entity-attribute": "Image URL source entity attribute", + "common-map-settings": "Common map settings", + "x-pos-key-name": "X position key name", + "y-pos-key-name": "Y position key name", + "latitude-key-name": "Latitude key name", + "longitude-key-name": "Longitude key name", + "default-map-zoom-level": "Default map zoom level (0 - 20)", + "default-map-center-position": "Default map center position (0,0)", + "disable-scroll-zooming": "Disable scroll zooming", + "disable-zoom-control-buttons": "Disable zoom control buttons", + "fit-map-bounds": "Fit map bounds to cover all markers", + "use-default-map-center-position": "Use default map center position", + "entities-limit": "Limit of entities to load", + "markers-settings": "Markers settings", + "marker-offset-x": "Marker X offset relative to position multiplied by marker width", + "marker-offset-y": "Marker Y offset relative to position multiplied by marker height", + "position-function": "Position conversion function, should return x,y coordinates as double from 0 to 1 each", + "draggable-marker": "Draggable marker", + "label": "Label", + "show-label": "Show label", + "use-label-function": "Use label function", + "label-pattern": "Label (pattern examples: '${entityName}', '${entityName}: (Text ${keyName} units.)' )", + "label-function": "Label function", + "tooltip": "Tooltip", + "show-tooltip": "Show tooltip", + "show-tooltip-action": "Action for displaying the tooltip", + "show-tooltip-action-click": "Show tooltip on click (Default)", + "show-tooltip-action-hover": "Show tooltip on hover", + "auto-close-tooltips": "Auto-close tooltips", + "use-tooltip-function": "Use tooltip function", + "tooltip-pattern": "Tooltip (for ex. 'Text ${keyName} units.' or Link text')", + "tooltip-function": "Tooltip function", + "tooltip-offset-x": "Tooltip X offset relative to marker anchor multiplied by marker width", + "tooltip-offset-y": "Tooltip Y offset relative to marker anchor multiplied by marker height", + "color": "Color", + "use-color-function": "Use color function", + "color-function": "Color function", + "marker-image": "Marker image", + "use-marker-image-function": "Use marker image function", + "custom-marker-image": "Custom marker image", + "custom-marker-image-size": "Custom marker image size (px)", + "marker-image-function": "Marker image function", + "marker-images": "Marker images", + "polygon-settings": "Polygon settings", + "show-polygon": "Show polygon", + "polygon-key-name": "Polygon key name", + "enable-polygon-edit": "Enable polygon edit", + "polygon-label": "Polygon label", + "show-polygon-label": "Show polygon label", + "use-polygon-label-function": "Use polygon label function", + "polygon-label-pattern": "Polygon label (pattern examples: '${entityName}', '${entityName}: (Text ${keyName} units.)' )", + "polygon-label-function": "Polygon label function", + "polygon-tooltip": "Polygon tooltip", + "show-polygon-tooltip": "Show polygon tooltip", + "auto-close-polygon-tooltips": "Auto-close polygon tooltips", + "use-polygon-tooltip-function": "Use polygon tooltip function", + "polygon-tooltip-pattern": "Tooltip (for ex. 'Text ${keyName} units.' or Link text')", + "polygon-tooltip-function": "Polygon tooltip function", + "polygon-color": "Polygon color", + "polygon-opacity": "Polygon opacity", + "use-polygon-color-function": "Use polygon color function", + "polygon-color-function": "Polygon color function", + "polygon-stroke": "Polygon stroke", + "stroke-color": "Stroke color", + "stroke-opacity": "Stroke opacity", + "stroke-weight": "Stroke weight", + "use-polygon-stroke-color-function": "Use polygon stroke color function", + "polygon-stroke-color-function": "Polygon stroke color function", + "circle-settings": "Circle settings", + "show-circle": "Show circle", + "circle-key-name": "Circle key name", + "enable-circle-edit": "Enable circle edit", + "circle-label": "Circle label", + "show-circle-label": "Show circle label", + "use-circle-label-function": "Use circle label function", + "circle-label-pattern": "Circle label (pattern examples: '${entityName}', '${entityName}: (Text ${keyName} units.)' )", + "circle-label-function": "Circle label function", + "circle-tooltip": "Circle tooltip", + "show-circle-tooltip": "Show circle tooltip", + "auto-close-circle-tooltips": "Auto-close circle tooltips", + "use-circle-tooltip-function": "Use circle tooltip function", + "circle-tooltip-pattern": "Tooltip (for ex. 'Text ${keyName} units.' or Link text')", + "circle-tooltip-function": "Circle tooltip function", + "circle-fill-color": "Circle fill color", + "circle-fill-color-opacity": "Circle fill color opacity", + "use-circle-fill-color-function": "Use circle fill color function", + "circle-fill-color-function": "Circle fill color function", + "circle-stroke": "Circle stroke", + "use-circle-stroke-color-function": "Use circle stroke color function", + "circle-stroke-color-function": "Circle stroke color function", + "markers-clustering-settings": "Markers clustering settings", + "use-map-markers-clustering": "Use map markers clustering", + "zoom-on-cluster-click": "Zoom when clicking on a cluster", + "max-cluster-zoom": "The maximum zoom level when a marker can be part of a cluster (0 - 18)", + "max-cluster-radius-pixels": "Maximum radius that a cluster will cover in pixels", + "cluster-zoom-animation": "Show animation on markers when zooming", + "show-markers-bounds-on-cluster-mouse-over": "Show the bounds of markers when mouse over a cluster", + "spiderfy-max-zoom-level": "Spiderfy at the max zoom level (to see all cluster markers)", + "load-optimization": "Load optimization", + "cluster-chunked-loading": "Use chunks for adding markers so that the page does not freeze", + "cluster-markers-lazy-load": "Use lazy load for adding markers", + "editor-settings": "Editor settings", + "enable-snapping": "Enable snapping to other vertices for precision drawing", + "init-draggable-mode": "Initialize map in draggable mode", + "hide-all-edit-buttons": "Hide all edit control buttons", + "hide-draw-buttons": "Hide draw buttons", + "hide-edit-buttons": "Hide edit buttons", + "hide-remove-button": "Hide remove button", + "route-map-settings": "Route map settings", + "trip-animation-settings": "Trip animation settings", + "normalization-step": "Normalization data step (ms)", + "tooltip-background-color": "Tooltip background color", + "tooltip-font-color": "Tooltip font color", + "tooltip-opacity": "Tooltip opacity (0-1)", + "auto-close-tooltip": "Auto-close tooltip", + "rotation-angle": "Set additional rotation angle for marker (deg)", + "path-settings": "Path settings", + "path-color": "Path color", + "use-path-color-function": "Use path color function", + "path-color-function": "Path color function", + "path-decorator": "Path decorator", + "use-path-decorator": "Use path decorator", + "decorator-symbol": "Decorator symbol", + "decorator-symbol-arrow-head": "Arrow", + "decorator-symbol-dash": "Dash", + "decorator-symbol-size": "Decorator symbol size (px)", + "use-path-decorator-custom-color": "Use path decorator custom color", + "decorator-custom-color": "Decorator custom color", + "decorator-offset": "Decorator offset", + "end-decorator-offset": "End decorator offset", + "decorator-repeat": "Decorator repeat", + "points-settings": "Points settings", + "show-points": "Show points", + "point-color": "Point color", + "point-size": "Point size (px)", + "use-point-color-function": "Use point color function", + "point-color-function": "Point color function", + "use-point-as-anchor": "Use point as anchor", + "point-as-anchor-function": "Point as anchor function", + "independent-point-tooltip": "Independent point tooltip" + }, + "markdown": { + "use-markdown-text-function": "Use markdown/HTML value function", + "markdown-text-function": "Markdown/HTML value function", + "markdown-text-pattern": "Markdown/HTML pattern (markdown or HTML with variables, for ex. '${entityName} or ${keyName} - some text.')", + "markdown-css": "Markdown/HTML CSS" + }, + "simple-card": { + "label-position": "Label position", + "label-position-left": "Left", + "label-position-top": "Top" + }, + "table": { + "common-table-settings": "Common Table Settings", + "enable-search": "Enable search", + "enable-sticky-header": "Always display header", + "enable-sticky-action": "Always display actions column", + "hidden-cell-button-display-mode": "Hidden cell button actions display mode", + "show-empty-space-hidden-action": "Show empty space instead of hidden cell button action", + "dont-reserve-space-hidden-action": "Don't reserve space for hidden action buttons", + "display-timestamp": "Display timestamp column", + "display-milliseconds": "Display timestamp milliseconds", + "display-pagination": "Display pagination", + "default-page-size": "Default page size", + "use-entity-label-tab-name": "Use entity label in tab name", + "hide-empty-lines": "Hide empty lines", + "row-style": "Row style", + "use-row-style-function": "Use row style function", + "row-style-function": "Row style function", + "cell-style": "Cell style", + "use-cell-style-function": "Use cell style function", + "cell-style-function": "Cell style function", + "cell-content": "Cell content", + "use-cell-content-function": "Use cell content function", + "cell-content-function": "Cell content function", + "show-latest-data-column": "Show latest data column", + "latest-data-column-order": "Latest data column order", + "entities-table-title": "Entities table title", + "enable-select-column-display": "Enable select columns to display", + "display-entity-name": "Display entity name column", + "entity-name-column-title": "Entity name column title", + "display-entity-label": "Display entity label column", + "entity-label-column-title": "Entity label column title", + "display-entity-type": "Display entity type column", + "default-sort-order": "Default sort order", + "column-width": "Column width (px or %)", + "default-column-visibility": "Default column visibility", + "column-visibility-visible": "Visible", + "column-visibility-hidden": "Hidden", + "column-selection-to-display": "Column selection in 'Columns to Display'", + "column-selection-to-display-enabled": "Enabled", + "column-selection-to-display-disabled": "Disabled", + "alarms-table-title": "Alarms table title", + "enable-alarms-selection": "Enable alarms selection", + "enable-alarms-search": "Enable alarms search", + "enable-alarm-filter": "Enable alarm filter", + "display-alarm-details": "Display alarm details", + "allow-alarms-ack": "Allow alarms acknowledgment", + "allow-alarms-clear": "Allow alarms clear" + }, + "value-source": { + "value-source": "Value source", + "predefined-value": "Predefined value", + "entity-attribute": "Value taken from entity attribute", + "value": "Value", + "source-entity-alias": "Source entity alias", + "source-entity-attribute": "Source entity attribute" + }, + "widget-font": { + "font-family": "Font family", + "size": "Size", + "relative-font-size": "Relative font size (percents)", + "font-style": "Style", + "font-style-normal": "Normal", + "font-style-italic": "Italic", + "font-style-oblique": "Oblique", + "font-weight": "Weight", + "font-weight-normal": "Normal", + "font-weight-bold": "Bold", + "font-weight-bolder": "Bolder", + "font-weight-lighter": "Lighter", + "color": "Color", + "shadow-color": "Shadow color" } }, "icon": { @@ -2664,6 +4437,7 @@ "row-click": "En click de fila", "polygon-click": "Clic en polígono", "marker-click": "En click de marcador", + "circle-click": "En click de círculo", "tooltip-tag-action": "Acción de la etiqueta Tooltip", "node-selected": "Clic en el nodo seleccionado", "element-click": "Clic en el elemento HTML", @@ -2672,6 +4446,6 @@ } }, "language": { - "language": "Lenguaje" + "language": "Idioma" } } From 0ba1dc6d481d5ec443e42f0f3def57a323d8f215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20N=C3=BA=C3=B1ez?= Date: Fri, 3 Jun 2022 11:40:25 +0200 Subject: [PATCH 22/37] Add security and 2FA translations --- .../assets/locale/locale.constant-es_ES.json | 406 +++++++++--------- 1 file changed, 203 insertions(+), 203 deletions(-) diff --git a/ui-ngx/src/assets/locale/locale.constant-es_ES.json b/ui-ngx/src/assets/locale/locale.constant-es_ES.json index 578153c62f..ddc8847ce8 100644 --- a/ui-ngx/src/assets/locale/locale.constant-es_ES.json +++ b/ui-ngx/src/assets/locale/locale.constant-es_ES.json @@ -238,23 +238,23 @@ "domain-schema-mixed": "HTTP+HTTPS", "enable": "Activar ajustes OAuth2", "domains": "Dominios", - "mobile-apps": "Aplicaciones móviles", - "no-mobile-apps": "No hay aplicaciones configuradas", - "mobile-package": "Paquete de aplicación", - "mobile-package-placeholder": "Ej.: mi.ejemplo.app", - "mobile-package-hint": "Para Android: El ID único de aplicación. Para iOS: Identificador Product bundle.", - "mobile-package-unique": "El paquete de aplicación debe ser único.", - "mobile-app-secret": "Secreto de aplicación", - "invalid-mobile-app-secret": "El secreto de aplicación sólo puede contener carácteres alfanuméricos y debe tener entre 16 y 2048 carácteres de longitud.", - "copy-mobile-app-secret": "Copiar secreto de aplicación", - "add-mobile-app": "Añadir aplicación", - "delete-mobile-app": "Borrar información de aplicación", - "providers": "Proveedores", - "platform-web": "Web", - "platform-android": "Android", - "platform-ios": "iOS", - "all-platforms": "Todas las plataformas", - "allowed-platforms": "Plataformas permitidas" + "mobile-apps": "Aplicaciones móviles", + "no-mobile-apps": "No hay aplicaciones configuradas", + "mobile-package": "Paquete de aplicación", + "mobile-package-placeholder": "Ej.: mi.ejemplo.app", + "mobile-package-hint": "Para Android: El ID único de aplicación. Para iOS: Identificador Product bundle.", + "mobile-package-unique": "El paquete de aplicación debe ser único.", + "mobile-app-secret": "Secreto de aplicación", + "invalid-mobile-app-secret": "El secreto de aplicación sólo puede contener carácteres alfanuméricos y debe tener entre 16 y 2048 carácteres de longitud.", + "copy-mobile-app-secret": "Copiar secreto de aplicación", + "add-mobile-app": "Añadir aplicación", + "delete-mobile-app": "Borrar información de aplicación", + "providers": "Proveedores", + "platform-web": "Web", + "platform-android": "Android", + "platform-ios": "iOS", + "all-platforms": "Todas las plataformas", + "allowed-platforms": "Plataformas permitidas" }, "smpp-provider": { "smpp-version": "Versión SMPP", @@ -299,61 +299,61 @@ "npi-private-numbering-plan": "9 - Privado", "npi-ermes-numbering-plan": "10 - ERMES (ETSI DE/PS 3 01-3)", "npi-internet": "13 - Internet (IP)", - "npi-wap-client-id": "18 - WAP Client Id (to be defined by WAP Forum)", - "scheme-smsc": "0 - SMSC Default Alphabet (ASCII for short and long code and to GSM for toll-free)", - "scheme-ia5": "1 - IA5 (ASCII for short and long code, Latin 9 for toll-free (ISO-8859-9))", - "scheme-octet-unspecified-2": "2 - Octet Unspecified (8-bit binary)", + "npi-wap-client-id": "18 - WAP Client Id (a definir por WAP Forum)", + "scheme-smsc": "0 - Alfabeto por defecto SMSC (ASCII para códigos cortos y largos y GSM para gratuitos)", + "scheme-ia5": "1 - IA5 (ASCII para códigos cortos y largos, Latin 9 para gratuitos (ISO-8859-9))", + "scheme-octet-unspecified-2": "2 - Octetos sin especificar (binario 8-bit)", "scheme-latin-1": "3 - Latin 1 (ISO-8859-1)", - "scheme-octet-unspecified-4": "4 - Octet Unspecified (8-bit binary)", + "scheme-octet-unspecified-4": "4 - Octetos sin especificar (binario 8-bit)", "scheme-jis": "5 - JIS (X 0208-1990)", - "scheme-cyrillic": "6 - Cyrillic (ISO-8859-5)", - "scheme-latin-hebrew": "7 - Latin/Hebrew (ISO-8859-8)", + "scheme-cyrillic": "6 - Ciríllico (ISO-8859-5)", + "scheme-latin-hebrew": "7 - Latin/Hebreo (ISO-8859-8)", "scheme-ucs-utf": "8 - UCS2/UTF-16 (ISO/IEC-10646)", - "scheme-pictogram-encoding": "9 - Pictogram Encoding", - "scheme-music-codes": "10 - Music Codes (ISO-2022-JP)", - "scheme-extended-kanji-jis": "13 - Extended Kanji JIS (X 0212-1990)", - "scheme-korean-graphic-character-set": "14 - Korean Graphic Character Set (KS C 5601/KS X 1001)" + "scheme-pictogram-encoding": "9 - Codificación por Pictograma", + "scheme-music-codes": "10 - Códigos musicales (ISO-2022-JP)", + "scheme-extended-kanji-jis": "13 - Kanji extendido JIS (X 0212-1990)", + "scheme-korean-graphic-character-set": "14 - Set de carácteres Koreanos (KS C 5601/KS X 1001)" }, - "queue-select-name": "Select queue name", - "queue-name": "Name", - "queue-name-required": "Queue name is required!", - "queues": "Queues", - "queue-partitions": "Partitions", - "queue-submit-strategy": "Submit strategy", - "queue-processing-strategy": "Processing strategy", - "queue-configuration": "Queue configuration", + "queue-select-name": "Seleccionar nombre de cola", + "queue-name": "Nombre", + "queue-name-required": "Nombre de cola requerido!", + "queues": "Colas", + "queue-partitions": "Particiones", + "queue-submit-strategy": "Estrategia de envíos", + "queue-processing-strategy": "Estrategia de procesamiento", + "queue-configuration": "Configuración Cola", "2fa": { - "2fa": "Two-factor authentication", - "available-providers": "Available providers", - "issuer-name": "Issuer name", - "issuer-name-required": "Issuer name is required.", - "max-verification-failures-before-user-lockout": "Max verification failures before user lockout", - "max-verification-failures-before-user-lockout-pattern": "Max verification failures must be a positive integer.", - "number-of-checking-attempts": "Number of checking attempts", - "number-of-checking-attempts-pattern": "Number of checking attempts must be a positive integer.", - "number-of-checking-attempts-required": "Number of checking attempts is required.", - "number-of-codes": "Number of codes", - "number-of-codes-pattern": "Number of codes must be a positive integer.", - "number-of-codes-required": "Number of codes is required.", - "provider": "Provider", - "retry-verification-code-period": "Retry verification code period (sec)", - "retry-verification-code-period-pattern": "Minimal period time is 5 sec", - "retry-verification-code-period-required": "Retry verification code period is required.", - "total-allowed-time-for-verification": "Total allowed time for verification (sec)", - "total-allowed-time-for-verification-pattern": "Minimal total allowed time is 60 sec", - "total-allowed-time-for-verification-required": "Total allowed time is required.", - "use-system-two-factor-auth-settings": "Use system two factor auth settings", - "verification-code-check-rate-limit": "Verification code check rate limit", - "verification-code-lifetime": "Verification code lifetime (sec)", - "verification-code-lifetime-pattern": "Verification code lifetime must be a positive integer.", - "verification-code-lifetime-required": "Verification code lifetime is required.", - "verification-message-template": "Verification message template", - "verification-limitations": "Verification limitations", - "verification-message-template-pattern": "Verification message need to contains pattern: ${code}", - "verification-message-template-required": "Verification message template is required.", - "within-time": "Within time (sec)", - "within-time-pattern": "Time must be a positive integer.", - "within-time-required": "Time is required." + "2fa": "Autenticación de dos factores (2FA)", + "available-providers": "Proveedores disponibles", + "issuer-name": "Nombre de emisor", + "issuer-name-required": "Nombre de emisor requerido.", + "max-verification-failures-before-user-lockout": "Máximo de fallos de verificación antes de bloquear cuenta", + "max-verification-failures-before-user-lockout-pattern": "Máximo de fallos debe ser un número entero positivo.", + "number-of-checking-attempts": "Número de intentos de verificación", + "number-of-checking-attempts-pattern": "Número de intentos debe ser un número entero positivo.", + "number-of-checking-attempts-required": "Número de intentos requerido.", + "number-of-codes": "Número de códigos", + "number-of-codes-pattern": "Número de códigos debe ser un número entero positivo.", + "number-of-codes-required": "Número de códigos requerido.", + "provider": "Proveedor", + "retry-verification-code-period": "Reintentos de código de verificación (sec)", + "retry-verification-code-period-pattern": "El período mínimo es de 5 sec", + "retry-verification-code-period-required": "Reintentos requerido.", + "total-allowed-time-for-verification": "Total de tiempo permitido para verificación (sec)", + "total-allowed-time-for-verification-pattern": "El mínimo del total de tiempo perminito es de 60 sec", + "total-allowed-time-for-verification-required": "Total de tiempo requerido.", + "use-system-two-factor-auth-settings": "Usar ajustes 2FA del sistema", + "verification-code-check-rate-limit": "Límite de chequeo del código de verificación", + "verification-code-lifetime": "Tiempo de vida del código de verificación (sec)", + "verification-code-lifetime-pattern": "Tiempo de vida del código de verificación debe ser un número entero positivo.", + "verification-code-lifetime-required": "Tiempo de vida requerido.", + "verification-message-template": "Plantilla del mensaje de verificación", + "verification-limitations": "Límites de verificación", + "verification-message-template-pattern": "El mensaje de verificación debe contener el patrón: ${code}", + "verification-message-template-required": "Plantilla de mensaje de verificación requerida.", + "within-time": "Rango de tiempo (sec)", + "within-time-pattern": "Tiempo debe ser un número entero positivo.", + "within-time-required": "Tiempo requerido." } }, "alarm": { @@ -2401,22 +2401,22 @@ "access-token": "Token de acceso", "x509": "X.509", "mqtt": { - "client-id": "Client ID MQTT", - "user-name": "Usuario MQTT", - "password": "Contraseña MQTT" + "client-id": "Client ID MQTT", + "user-name": "Usuario MQTT", + "password": "Contraseña MQTT" }, "lwm2m": { - "client-endpoint": "Nombre endpoint cliente LwM2M", - "security-config-mode": "Configuración de seguridad LwM2M", - "client-identity": "Identidad cliente LwM2M", - "client-key": "Clave cliente LwM2M", - "client-cert": "Clave pública cliente LwM2M", - "bootstrap-server-security-mode": "Modo seguridad servidor Bootstrap LwM2M", - "bootstrap-server-secret-key": "Clave secreta servidor Bootstrap LwM2M", - "bootstrap-server-public-key-id": "Clave pública o id servidor Bootstrap LwM2M", - "lwm2m-server-security-mode": "Modo seguridad servidor LwM2M", - "lwm2m-server-secret-key": "Clave secreta servidor LwM2M", - "lwm2m-server-public-key-id": "Clave pública servidor LwM2M" + "client-endpoint": "Nombre endpoint cliente LwM2M", + "security-config-mode": "Configuración de seguridad LwM2M", + "client-identity": "Identidad cliente LwM2M", + "client-key": "Clave cliente LwM2M", + "client-cert": "Clave pública cliente LwM2M", + "bootstrap-server-security-mode": "Modo seguridad servidor Bootstrap LwM2M", + "bootstrap-server-secret-key": "Clave secreta servidor Bootstrap LwM2M", + "bootstrap-server-public-key-id": "Clave pública o id servidor Bootstrap LwM2M", + "lwm2m-server-security-mode": "Modo seguridad servidor LwM2M", + "lwm2m-server-secret-key": "Clave secreta servidor LwM2M", + "lwm2m-server-public-key-id": "Clave pública servidor LwM2M" }, "isgateway": "Es Gateway", "activity-time-from-gateway-device": "Fecha de actividad desde el dispositivo gateway", @@ -2504,19 +2504,19 @@ "login-with": "Login con {{name}}", "or": "o", "error": "Error de Login", - "verify-your-identity": "Verify your identity", - "select-way-to-verify": "Select a way to verify", - "resend-code": "Resend code", - "resend-code-wait": "Resend code in { time, plural, 1 {1 second} other {# seconds} }", - "try-another-way": "Try another way", - "totp-auth-description": "Please enter the security code from your authenticator app.", - "totp-auth-placeholder": "Code", - "sms-auth-description": "A security code has been sent to your phone at {{contact}}.", - "sms-auth-placeholder": "SMS code", - "email-auth-description": "A security code has been sent to your email address at {{contact}}.", - "email-auth-placeholder": "Email code", - "backup-code-auth-description": "Please enter one of your backup codes.", - "backup-code-auth-placeholder": "Backup code" + "verify-your-identity": "Verificar identidad", + "select-way-to-verify": "Selecciona el modo de verificación", + "resend-code": "Reenviar código", + "resend-code-wait": "Reenviar código en { time, plural, 1 {1 segundo} other {# segundos} }", + "try-another-way": "Otros modos de verificación", + "totp-auth-description": "Por favor, introduce el código de seguridad de tu aplicación de autenticación.", + "totp-auth-placeholder": "Código", + "sms-auth-description": "Se ha enviado un código de verificación a tu número: {{contact}} proporcionado.", + "sms-auth-placeholder": "Código SMS", + "email-auth-description": "Se ha enviado un código de verificación al email {{contact}} proporcionado.", + "email-auth-placeholder": "Código Email", + "backup-code-auth-description": "Por favor, introduce el código de backup.", + "backup-code-auth-placeholder": "Código de Backup" }, "markdown": { "edit": "Editar", @@ -2525,69 +2525,69 @@ "copied": "Copiado!" }, "ota-update": { - "add": "Añadir paquete", - "assign-firmware": "Firmware asignado", - "assign-firmware-required": "Firmware asignado requerido", - "assign-software": "Software asignado", - "assign-software-required": "Software asignado requerido", - "auto-generate-checksum": "Auto-generar checksum", - "checksum": "Checksum", - "checksum-hint": "Si el checksum está vacío, se generará automáticamente", - "checksum-algorithm": "Algoritmo checksum", - "checksum-copied-message": "El checksum del paquete se ha copiado al portapapeles", - "change-firmware": "El cambio del firmware provocará la actualización de { count, plural, 1 {1 dispositivo} other {# dispositivos} }.", - "change-software": "El cambio del software provocará la actualización de { count, plural, 1 {1 dispositivo} other {# dispositivos} }.", - "chose-compatible-device-profile": "El paquete subido, sólamente estará disponible para los dispositivos con el perfil seleccionado.", - "chose-firmware-distributed-device": "Elige el firmware que se distribuirá a los dispositivos", - "chose-software-distributed-device": "Elige el software que se distribuirá a los dispositivos", - "content-type": "Tipo de contenido", - "copy-checksum": "Copiar checksum", - "copy-direct-url": "Copiar URL directa", - "copyId": "Copiar Id de paquete", - "copied": "Copiado!", - "delete": "Borrar paquete", - "delete-ota-update-text": "Atención, tras la confirmación la actualización OTA será irrecuperable.", - "delete-ota-update-title": "Estás seguro de borrar la actualización OTA '{{title}}'?", - "delete-ota-updates-text": "Atención, tras la confirmación todas las actualizaciones OTA seleccionadas se borrarán.", - "delete-ota-updates-title": "Estás seguro de borrar { count, plural, 1 {1 Actualización OTA} other {# Actualizaciones OTA} }?", - "description": "Descripción", - "direct-url": "URL Directa", - "direct-url-copied-message": "La URL directa del paquete se ha copiado al portapapeles", - "direct-url-required": "URL Directa requerida", - "download": "Descargar paquete", - "drop-file": "Arrastra un fichero o haz click para seleccionar un fichero a subir.", - "drop-package-file-or": "Arrastrar y soltar un fichero o", - "file-name": "Nombre del fichero", - "file-size": "Tamaño del fichero", - "file-size-bytes": "Tamaño del fichero en bytes", - "idCopiedMessage": "El Id del paquete se ha copiado al portapapeles", - "no-firmware-matching": "No se ha encontrado ningún paquete de firmware OTA compatible que coincidan con '{{entity}}'.", - "no-firmware-text": "No hay aprovisionado ningún paquete de firmware OTA.", - "no-packages-text": "No se han encontrado paquetes", - "no-software-matching": "No se ha encontrado ningún paquete de software OTA compatible que coincidan con '{{entity}}'.", - "no-software-text": "No hay aprovisionado ningún paquete de software OTA.", - "ota-update": "Actualización OTA", - "ota-update-details": "Detalles de actualización OTA", - "ota-updates": "Actualizaciones OTA", - "package-type": "Tipo de paquete", - "packages-repository": "Repositorio de paquetes", - "search": "Buscar paquetes", - "selected-package": "{ count, plural, 1 {1 paquete} other {# paquetes} } selected", - "title": "Título", - "title-required": "Título requerido.", - "title-max-length": "El título debe ser menor de 256", - "types": { - "firmware": "Firmware", - "software": "Software" - }, - "upload-binary-file": "Subir fichero binario", - "use-external-url": "Usar una URL externa", - "version": "Versión", - "version-required": "Versión requerida.", - "version-tag": "Tag de Versión", - "version-tag-hint": "El tag de versión debe coincidir con la versión reportada por el dispositivo.", - "version-max-length": "Versión debe ser menor que 256", - "warning-after-save-no-edit": "Una vez que el paquete se haya subido, no se podrá modificar el título, versión, perfil de dispositivo y tipo de paquete." + "add": "Añadir paquete", + "assign-firmware": "Firmware asignado", + "assign-firmware-required": "Firmware asignado requerido", + "assign-software": "Software asignado", + "assign-software-required": "Software asignado requerido", + "auto-generate-checksum": "Auto-generar checksum", + "checksum": "Checksum", + "checksum-hint": "Si el checksum está vacío, se generará automáticamente", + "checksum-algorithm": "Algoritmo checksum", + "checksum-copied-message": "El checksum del paquete se ha copiado al portapapeles", + "change-firmware": "El cambio del firmware provocará la actualización de { count, plural, 1 {1 dispositivo} other {# dispositivos} }.", + "change-software": "El cambio del software provocará la actualización de { count, plural, 1 {1 dispositivo} other {# dispositivos} }.", + "chose-compatible-device-profile": "El paquete subido, sólamente estará disponible para los dispositivos con el perfil seleccionado.", + "chose-firmware-distributed-device": "Elige el firmware que se distribuirá a los dispositivos", + "chose-software-distributed-device": "Elige el software que se distribuirá a los dispositivos", + "content-type": "Tipo de contenido", + "copy-checksum": "Copiar checksum", + "copy-direct-url": "Copiar URL directa", + "copyId": "Copiar Id de paquete", + "copied": "Copiado!", + "delete": "Borrar paquete", + "delete-ota-update-text": "Atención, tras la confirmación la actualización OTA será irrecuperable.", + "delete-ota-update-title": "Estás seguro de borrar la actualización OTA '{{title}}'?", + "delete-ota-updates-text": "Atención, tras la confirmación todas las actualizaciones OTA seleccionadas se borrarán.", + "delete-ota-updates-title": "Estás seguro de borrar { count, plural, 1 {1 Actualización OTA} other {# Actualizaciones OTA} }?", + "description": "Descripción", + "direct-url": "URL Directa", + "direct-url-copied-message": "La URL directa del paquete se ha copiado al portapapeles", + "direct-url-required": "URL Directa requerida", + "download": "Descargar paquete", + "drop-file": "Arrastra un fichero o haz click para seleccionar un fichero a subir.", + "drop-package-file-or": "Arrastrar y soltar un fichero o", + "file-name": "Nombre del fichero", + "file-size": "Tamaño del fichero", + "file-size-bytes": "Tamaño del fichero en bytes", + "idCopiedMessage": "El Id del paquete se ha copiado al portapapeles", + "no-firmware-matching": "No se ha encontrado ningún paquete de firmware OTA compatible que coincidan con '{{entity}}'.", + "no-firmware-text": "No hay aprovisionado ningún paquete de firmware OTA.", + "no-packages-text": "No se han encontrado paquetes", + "no-software-matching": "No se ha encontrado ningún paquete de software OTA compatible que coincidan con '{{entity}}'.", + "no-software-text": "No hay aprovisionado ningún paquete de software OTA.", + "ota-update": "Actualización OTA", + "ota-update-details": "Detalles de actualización OTA", + "ota-updates": "Actualizaciones OTA", + "package-type": "Tipo de paquete", + "packages-repository": "Repositorio de paquetes", + "search": "Buscar paquetes", + "selected-package": "{ count, plural, 1 {1 paquete} other {# paquetes} } selected", + "title": "Título", + "title-required": "Título requerido.", + "title-max-length": "El título debe ser menor de 256", + "types": { + "firmware": "Firmware", + "software": "Software" + }, + "upload-binary-file": "Subir fichero binario", + "use-external-url": "Usar una URL externa", + "version": "Versión", + "version-required": "Versión requerida.", + "version-tag": "Tag de Versión", + "version-tag-hint": "El tag de versión debe coincidir con la versión reportada por el dispositivo.", + "version-max-length": "Versión debe ser menor que 256", + "warning-after-save-no-edit": "Una vez que el paquete se haya subido, no se podrá modificar el título, versión, perfil de dispositivo y tipo de paquete." }, "position": { "top": "Superior", @@ -2606,59 +2606,59 @@ "tokenCopiedWarnMessage": "JWT caducado, por favor actualiza la página." }, "security": { - "security": "Security", + "security": "Seguridad", "2fa": { - "2fa": "Two-factor authentication", - "2fa-description": "Two-factor authentication protects your account from unauthorized access. All you have to do is enter a security code when you log in.", - "authenticate-with": "You can authenticate with:", - "disable-2fa-provider-text": "Disabling {{name}} will make your account less secure", - "disable-2fa-provider-title": "Are you sure you want to disable {{name}}?", - "get-new-code": "Get new code", - "main-2fa-method": "Use as main two-factor authentication method", + "2fa": "Autenticación de doble factor (2FA)", + "2fa-description": "La autenticación de doble factor proteje tu cuenta de accesos no autorizados. Lo único que tienes que hacer es entrar un código de seguridad al hacer login.", + "authenticate-with": "Puedes autenticarte con:", + "disable-2fa-provider-text": "Desactivar {{name}} hará tu cuenta menos segura", + "disable-2fa-provider-title": "Estás seguro de desactivar {{name}}?", + "get-new-code": "Obtener un nuevo código", + "main-2fa-method": "Usar como método de autenticación de doble factor principal", "dialog": { - "activation-step-description-email": "The next time you login in, you will be prompted to enter the security code that will be sent to your email address.", - "activation-step-description-sms": "The next time you login in, you will be prompted to enter the security code that will be sent to the phone number.", - "activation-step-description-totp": "The next time you login in, you will need to provide a two-factor authentication code.", - "activation-step-label": "Activation", - "backup-code-description": "Print out the codes so you have them handy when you need to use them to log in to your account. You can use each backup code once.", - "backup-code-warn": "Once you leave this page, these codes cannot be shown again. Store them safely using the options below.", - "download-txt": "Download (txt)", - "email-step-description": "Enter an email to use as your authenticator.", + "activation-step-description-email": "La próxima vez que hagas log-in, se deberá introducir el código de seguridad que se enviará a tu dirección de email.", + "activation-step-description-sms": "La próxima vez que hagas log-in, se deberá introducir el código de seguridad que se enviará a tu número de teléfono.", + "activation-step-description-totp": "La próxima vez que hagas log-in, se deberá introducir el código de seguridad de doble factor.", + "activation-step-label": "Activación", + "backup-code-description": "Imprime los códigos y guárdalos en un lugar seguro, se necesitarán para hacer login en tu cuenta. Puedes usar cada código de backup sólo una vez.", + "backup-code-warn": "Una vez que salgas de esta página, estos códigos no se volverán a mostrar. Guárdalos en un lugar seguro usando las opciones a continuación.", + "download-txt": "Descargar (txt)", + "email-step-description": "Introduce tu email para usar como autenticador.", "email-step-label": "Email", - "enable-email-title": "Enable email authenticator", - "enable-sms-title": "Enable SMS authenticator", - "enable-totp-title": "Enable authenticator app", - "enter-verification-code": "Enter the 6-digit code here", - "get-backup-code-title": "Get backup code", - "next": "Next", - "scan-qr-code": "Scan this QR code with your verification app", - "send-code": "Send code", - "sms-step-description": "Enter a phone number to use as your authenticator.", - "sms-step-label": "Phone Number", - "success": "Success!", - "totp-step-description-install": "You can install apps like Google Authenticator, Authy, or Duo.", - "totp-step-description-open": "Open the authenticator app on your mobile phone.", - "totp-step-label": "Get app", - "verification-code": "6-digit code", - "verification-code-invalid": "Invalid verification code format", - "verification-code-incorrect": "Verification code is incorrect", - "verification-code-many-request": "Too many requests check verification code", - "verification-step-description": "Enter a 6-digit code we just sent to {{address}}", - "verification-step-label": "Verification" + "enable-email-title": "Activar autenticador por email", + "enable-sms-title": "Activar autenticador por SMS", + "enable-totp-title": "Activar autenticador por app", + "enter-verification-code": "Entra el código de 6-dígitos", + "get-backup-code-title": "Obtener copia de seguridad", + "next": "Siguiente", + "scan-qr-code": "Escanea el código QR con tu aplicación de autenticación", + "send-code": "Enviar código", + "sms-step-description": "Introduce tu número de teléfono para usar como autenticador.", + "sms-step-label": "Número de teléfono", + "success": "Éxito!", + "totp-step-description-install": "Puedes instalar la aplicación Google Authenticator, Authy, o Duo.", + "totp-step-description-open": "Abre la aplicación de autenticación en tu teléfono móvil.", + "totp-step-label": "Obtener app", + "verification-code": "Código de 6-dígitos", + "verification-code-invalid": "Formáto de código inválido", + "verification-code-incorrect": "El código de verificación es incorrecto", + "verification-code-many-request": "Demasiadas solicitudes, revisa el código de verificación", + "verification-step-description": "Introduce el código de 6-dígitos que acabamos de enviar a {{address}}", + "verification-step-label": "Verificación" }, "provider": { "email": "Email", - "email-description": "Use a security code sent to your email address to authenticate.", - "email-hint": "Authentication codes are sent via email to {{ info }}", + "email-description": "Usar un código de seguridad enviado a tu email para autenticarte.", + "email-hint": "Los códigos de autenticación se han enviado por email a {{ info }}", "sms": "SMS", - "sms-description": "Use your phone to authenticate. We'll send you a security code via SMS message when you log in.", - "sms-hint": "Authentication codes are sent by text message to {{ info }}", - "totp": "Authenticator app", - "totp-description": "Use apps like Google Authenticator, Authy, or Duo on your phone to authenticate. It will generate a security code for logging in.", - "totp-hint": "Authenticator app is set up for your account", - "backup_code": "Backup code", - "backup-code-description": "These printable one-time passcodes allow you to sign in when away from your phone, like when you’re traveling.", - "backup-code-hint": "{{ info }} single-use codes are active at this time" + "sms-description": "Usar tu teléfono para autenticarte. Enviaremos un código de seguridad vía SMS.", + "sms-hint": "Los códigos de autenticación se han enviado por mensaje de texto SMS a {{ info }}", + "totp": "App de autenticación", + "totp-description": "Usar aplicaciones como Google Authenticator, Authy, o Duo en tu teléfono para autenticarte. Se generará un código de seguridad para hacer login.", + "totp-hint": "La aplicación de autenticación se ha configurado en tu cuenta", + "backup_code": "Código Backup", + "backup-code-description": "Estos códigos de seguridad imprimibles son de un solo uso, te permiten identificarte cuando no tengas el teléfono a mano, útil cuando se viaja.", + "backup-code-hint": "{{ info }} códigos de un solo uso activos en este momento" } } }, From 9382f6928c6d4bfb2eb39c375f3118b827c02687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20N=C3=BA=C3=B1ez?= Date: Fri, 3 Jun 2022 12:51:19 +0200 Subject: [PATCH 23/37] Add queues tranlations --- .../assets/locale/locale.constant-es_ES.json | 144 +++++++++--------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/ui-ngx/src/assets/locale/locale.constant-es_ES.json b/ui-ngx/src/assets/locale/locale.constant-es_ES.json index ddc8847ce8..ea6196fa8a 100644 --- a/ui-ngx/src/assets/locale/locale.constant-es_ES.json +++ b/ui-ngx/src/assets/locale/locale.constant-es_ES.json @@ -2873,84 +2873,84 @@ "browser-time": "Hora del navegador" }, "queue": { - "queue-name": "Queue", + "queue-name": "Cola", "no-queues-matching": "No se encontraron colas que coincidan con '{{queue}}'.", "select_name": "Selecciona el nombre de la cola", "name": "Nombre Cola", "name_required": "Necesario especificar el nombre de cola", - "name-unique": "Queue name is not unique!", - "queue-required": "Queue is required!", - "topic-required": "Queue topic is required!", - "poll-interval-required": "Poll interval is required!", - "poll-interval-min-value": "Poll interval value can't be less then 1", - "partitions-required": "Partitions is required!", - "partitions-min-value": "Partitions value can't be less then 1", - "pack-processing-timeout-required": "Processing timeout is required", - "pack-processing-timeout-min-value": "Processing timeout value can't be less then 1", - "batch-size-required": "Batch size is required!", - "batch-size-min-value": "Batch size value can't be less then 1", - "retries-required": "Retries is required!", - "retries-min-value": "Retries value can't be negative", - "failure-percentage-required": "Failure percentage is required!", - "failure-percentage-min-value": "Failure percentage value can't be less then 0", - "failure-percentage-max-value": "Failure percentage value can't be more then 100", - "pause-between-retries-required": "Pause between retries is required!", - "pause-between-retries-min-value": "Pause between retries value can't be less then 1", - "max-pause-between-retries-required": "Max pause between retries is required!", - "max-pause-between-retries-min-value": "Max pause between retries value can't be less then 1", - "submit-strategy-type-required": "Submit strategy type is required!", - "processing-strategy-type-required": "Processing strategy type is required!", - "queues": "Queues", - "selected-queues": "{ count, plural, 1 {1 queue} other {# queues} } selected", - "delete-queue-title": "Are you sure you want to delete the queue '{{queueName}}'?", - "delete-queues-title": "Are you sure you want to delete { count, plural, 1 {1 queue} other {# queues} }?", - "delete-queue-text": "Be careful, after the confirmation the queue and all related data will become unrecoverable.", - "delete-queues-text": "After the confirmation all selected queues will be deleted and won't be accessible.", - "search": "Search queue", - "add" : "Add queue", - "details": "Queue details", + "name-unique": "El nombre de cola ya existe!", + "queue-required": "Cola requerida!", + "topic-required": "Topic cola requerido!", + "poll-interval-required": "Intervalo de obtención requerido!", + "poll-interval-min-value": "El intervalo no debe ser menor de 1", + "partitions-required": "Particiones requeridas!", + "partitions-min-value": "El valor de particion no debe ser menor de 1", + "pack-processing-timeout-required": "Timeout de procesamiento", + "pack-processing-timeout-min-value": "Timeout de procesamiento no puede ser menor de 1", + "batch-size-required": "Tamaño del lote requerido!", + "batch-size-min-value": "El valor de tamaño de lote no puede ser menor de 1", + "retries-required": "Reintentos requerido!", + "retries-min-value": "El valor de reintentos no puede ser negativo", + "failure-percentage-required": "Porcentaje de fallos requerido!", + "failure-percentage-min-value": "Porcentaje de fallos no puede ser menor de 0", + "failure-percentage-max-value": "Porcentaje de fallos no puede ser mayor de 100", + "pause-between-retries-required": "Pausa entre reintentos requerido!", + "pause-between-retries-min-value": "Pausa mínima entre reintentos no puede ser menor de 1", + "max-pause-between-retries-required": "Pausa máxima entre reintentos requerido!", + "max-pause-between-retries-min-value": "Pausa máxima entre reintentos no puede ser menor de 1", + "submit-strategy-type-required": "Estrategia de envío requerida!", + "processing-strategy-type-required": "Estrategia de procesamiento requerida!", + "queues": "Colas", + "selected-queues": "{ count, plural, 1 {1 cola} other {# colas} } seleccionadas", + "delete-queue-title": "Estás seguro de borrar la cola '{{queueName}}'?", + "delete-queues-title": "Estás seguro de borrar { count, plural, 1 {1 cola} other {# colas} }?", + "delete-queue-text": "Atención, tras la confirmacion la cola y todos sus datos relacionados serán irrecuperables.", + "delete-queues-text": "Atención, tras la confirmación todas las colas se borrarán y no serán accesibles.", + "search": "Buscar cola", + "add" : "Añadir cola", + "details": "Detalles cola", "topic": "Topic", - "submit-strategy": "Submit Strategy", - "processing-strategy": "Processing Strategy", - "poll-interval": "Poll interval", - "partitions": "Partitions", - "consumer-per-partition": "Consumer per partition", - "consumer-per-partition-hint": "Enable separate consumer(s) per each partition", - "processing-timeout": "Processing timeout, ms", - "batch-size": "Batch size", - "retries": "Retries (0 - unlimited)", - "failure-percentage": "Failure Percentage", - "pause-between-retries": "Pause between retries", - "max-pause-between-retries": "Maximal pause between retries", - "delete": "Delete queue", - "copyId": "Copy queue Id", - "idCopiedMessage": "Queue Id has been copied to clipboard", - "description": "Description", - "description-hint": "This text will be displayed in the Queue description instead of the selected strategy", - "alt-description": "Submit Strategy: {{submitStrategy}}, Processing Strategy: {{processingStrategy}}", + "submit-strategy": "Estrategia de envío", + "processing-strategy": "Estrategia de procesamiento", + "poll-interval": "Intervalo de obtención", + "partitions": "Particiones", + "consumer-per-partition": "Consumidores por partición", + "consumer-per-partition-hint": "Activar consumidores separados para cada partición", + "processing-timeout": "Timeout de procesamiento, ms", + "batch-size": "Tamaño de lote", + "retries": "Reintentos (0 - ilimitados)", + "failure-percentage": "Porcentaje de fallos", + "pause-between-retries": "Pausa entre reintentos", + "max-pause-between-retries": "Pausa máxima entre reintentos", + "delete": "Borrar cola", + "copyId": "Copiar Id de cola", + "idCopiedMessage": "La Id de cola se ha copiado al portapapeles", + "description": "Descripción", + "description-hint": "Este texto se mostrará en la descripción de la cola, en lugar de la estrategia seleccionada", + "alt-description": "Estrategia de envío: {{submitStrategy}}, Estrategia de procesamiento: {{processingStrategy}}", "strategies": { - "sequential-by-originator-label": "Sequential by originator", - "sequential-by-originator-hint": "New message for e.g. device A is not submitted until previous message for device A is acknowledged", - "sequential-by-tenant-label": "Sequential by tenant", - "sequential-by-tenant-hint": "New message for e.g tenant A is not submitted until previous message for tenant A is acknowledged", - "sequential-label": "Sequential", - "sequential-hint": "New message is not submitted until previous message is acknowledged", - "burst-label": "Burst", - "burst-hint": "All messages are submitted to the rule chains in the order they arrive", - "batch-label": "Batch", - "batch-hint": "New batch is not submitted until previous batch is acknowledged", - "skip-all-failures-label": "Skip all failures", - "skip-all-failures-hint": "Ignore all failures", - "skip-all-failures-and-timeouts-label": "Skip all failures and timeouts", - "skip-all-failures-and-timeouts-hint": "Ignore all failures and timeouts", - "retry-all-label": "Retry all", - "retry-all-hint": "Retry all messages from processing pack", - "retry-failed-label": "Retry failed", - "retry-failed-hint": "Retry all failed messages from processing pack", - "retry-timeout-label": "Retry timeout", - "retry-timeout-hint": "Retry all timed-out messages from processing pack", - "retry-failed-and-timeout-label": "Retry failed and timeout", - "retry-failed-and-timeout-hint": "Retry all failed and timed-out messages from processing pack" + "sequential-by-originator-label": "Secuencial por iniciador", + "sequential-by-originator-hint": "El nuevo mensaje por ejemplo dispositivo A, no se enviará hasta que el mensaje anterior del dispositivo A sea admitido/procesado", + "sequential-by-tenant-label": "Secuencial por propietario", + "sequential-by-tenant-hint": "El nuevo mensaje, por ejemplo Propietario A, no se enviará hasta que el mensaje anterior del Propietario A sea admitido/procesado", + "sequential-label": "Secuencial", + "sequential-hint": "El nuevo mensaje no se enviará hasta que el mensaje anterior sea admitido/procesado", + "burst-label": "Ráfaga (Burst)", + "burst-hint": "Todos los mensajes se enviarán hacia las cadenas de reglas en el órden que lleguen", + "batch-label": "Lotes (Batch)", + "batch-hint": "El nuevo lote, no se enviará hasta que el anterior lote sea admitido/procesado", + "skip-all-failures-label": "Omitir todos los fallos", + "skip-all-failures-hint": "Ignorar todos los fallos", + "skip-all-failures-and-timeouts-label": "Omitir todos los fallos y timeouts", + "skip-all-failures-and-timeouts-hint": "Ignorar todos los fallos y timeouts", + "retry-all-label": "Reintentar todos", + "retry-all-hint": "Reintentar todos los mensajes del lote de procesamiento", + "retry-failed-label": "Reintentar fallidos", + "retry-failed-hint": "Reintentar todos los mensajes fallidos del lote de procesamiento", + "retry-timeout-label": "Timeout de reintentos", + "retry-timeout-hint": "Reintentar todos los mensajes que den timeout del lote de procesamiento", + "retry-failed-and-timeout-label": "Reintentar fallidos y timeouts", + "retry-failed-and-timeout-hint": "Reintentar todos los mensajes fallidos y que den timeout del lote de procesamiento" } }, "tenant": { From 1db2fb7d4987976b1a288485e582b01734b48c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20N=C3=BA=C3=B1ez?= Date: Fri, 3 Jun 2022 19:05:41 +0200 Subject: [PATCH 24/37] Add widgets translation --- .../assets/locale/locale.constant-es_ES.json | 1544 ++++++++--------- 1 file changed, 772 insertions(+), 772 deletions(-) diff --git a/ui-ngx/src/assets/locale/locale.constant-es_ES.json b/ui-ngx/src/assets/locale/locale.constant-es_ES.json index ea6196fa8a..56b85eac62 100644 --- a/ui-ngx/src/assets/locale/locale.constant-es_ES.json +++ b/ui-ngx/src/assets/locale/locale.constant-es_ES.json @@ -3450,145 +3450,145 @@ }, "widgets": { "chart": { - "common-settings": "Common settings", - "enable-stacking-mode": "Enable stacking mode", - "line-shadow-size": "Line shadow size", - "display-smooth-lines": "Display smooth (curved) lines", - "default-bar-width": "Default bar width for non-aggregated data (milliseconds)", - "bar-alignment": "Bar alignment", - "bar-alignment-left": "Left", - "bar-alignment-right": "Right", - "bar-alignment-center": "Center", - "default-font-size": "Default font size", - "default-font-color": "Default font color", - "thresholds-line-width": "Default line width for all thresholds", - "tooltip-settings": "Tooltip settings", - "show-tooltip": "Show tooltip", - "hover-individual-points": "Hover individual points", - "show-cumulative-values": "Show cumulative values in stacking mode", - "hide-zero-false-values": "Hide zero/false values from tooltip", - "tooltip-value-format-function": "Tooltip value format function", - "grid-settings": "Grid settings", - "show-vertical-lines": "Show vertical lines", - "show-horizontal-lines": "Show horizontal lines", - "grid-outline-border-width": "Grid outline/border width (px)", - "primary-color": "Primary color", - "background-color": "Background color", - "ticks-color": "Ticks color", - "xaxis-settings": "X axis settings", - "axis-title": "Axis title", - "xaxis-tick-labels-settings": "X axis tick labels settings", - "show-tick-labels": "Show axis tick labels", - "yaxis-settings": "Y axis settings", - "min-scale-value": "Minimum value on the scale", - "max-scale-value": "Maximum value on the scale", - "yaxis-tick-labels-settings": "Y axis tick labels settings", - "tick-step-size": "Step size between ticks", - "number-of-decimals": "The number of decimals to display", - "ticks-formatter-function": "Ticks formatter function", - "comparison-settings": "Comparison settings", - "enable-comparison": "Enable comparison", - "time-for-comparison": "Comparison period", - "time-for-comparison-previous-interval": "Previous interval (default)", - "time-for-comparison-days": "Day ago", - "time-for-comparison-weeks": "Week ago", - "time-for-comparison-months": "Month ago", - "time-for-comparison-years": "Year ago", - "time-for-comparison-custom-interval": "Custom interval", - "custom-interval-value": "Custom interval value (ms)", - "comparison-x-axis-settings": "Comparison X axis settings", - "axis-position": "Axis position", - "axis-position-top": "Top (default)", - "axis-position-bottom": "Bottom", - "custom-legend-settings": "Custom legend settings", - "enable-custom-legend": "Enable custom legend (this will allow you to use attribute/timeseries values in key labels)", - "key-name": "Key name", - "key-name-required": "Key name is required", - "key-type": "Key type", - "key-type-attribute": "Attribute", + "common-settings": "Ajustes comunes", + "enable-stacking-mode": "Activar modo de apilamiento (stacking)", + "line-shadow-size": "Tamaño de sombra (línea)", + "display-smooth-lines": "Mostrar líneas suaves (curvas)", + "default-bar-width": "Ancho de barra por defecto para datos no agregados (millisegundos)", + "bar-alignment": "Alineación barra", + "bar-alignment-left": "Izquierda", + "bar-alignment-right": "Derecha", + "bar-alignment-center": "Centro", + "default-font-size": "Tamaño de fuente por defecto", + "default-font-color": "Color de fuente por defecto", + "thresholds-line-width": "Ancho de línea por defecto para todos los umbrales", + "tooltip-settings": "Ajustes de sugerencias (tooltip)", + "show-tooltip": "Mostrar sugerencias", + "hover-individual-points": "Hover sobre puntos individuales", + "show-cumulative-values": "Mostrar valores acumulados en modo apilado", + "hide-zero-false-values": "Ocultar valores cero/false en sugerencias", + "tooltip-value-format-function": "Función de formateo de valores en sugerencias (tooltip)", + "grid-settings": "Ajustes de cuadrícula", + "show-vertical-lines": "Mostrar líneas verticales", + "show-horizontal-lines": "Mostrar líneas horizontales", + "grid-outline-border-width": "Ancho de cuadrícula/contorno en px", + "primary-color": "Color primario", + "background-color": "Color de fondo", + "ticks-color": "Color de ticks", + "xaxis-settings": "Ajustes eje X", + "axis-title": "Título de eje", + "xaxis-tick-labels-settings": "Ajustes de etiquetas en ticks eje X", + "show-tick-labels": "Mostrar etiquetas en ticks", + "yaxis-settings": "Ajustes eje Y", + "min-scale-value": "Valor mínimo en la escala", + "max-scale-value": "Valor máximo en la escala", + "yaxis-tick-labels-settings": "Ajustes de etiquetas en ticks eje Y", + "tick-step-size": "Tamaño de paso entre ticks", + "number-of-decimals": "Número de decimales", + "ticks-formatter-function": "Función de formateo de ticks", + "comparison-settings": "Ajustes de comparación", + "enable-comparison": "Activar comparación", + "time-for-comparison": "Período de comparación", + "time-for-comparison-previous-interval": "Intervalo anterior (por defecto)", + "time-for-comparison-days": "Hace un día", + "time-for-comparison-weeks": "Hace una semana", + "time-for-comparison-months": "Hace un mes", + "time-for-comparison-years": "Hace un año", + "time-for-comparison-custom-interval": "Intervalo personalizado", + "custom-interval-value": "Valor de intervalo personalizado (ms)", + "comparison-x-axis-settings": "Ajustes comparación eje X", + "axis-position": "Posición eje", + "axis-position-top": "Superior (por defecto)", + "axis-position-bottom": "Inferior", + "custom-legend-settings": "Ajustes leyenda", + "enable-custom-legend": "Activar leyenda personalizada (habilita poder usar valores de atributos/timeseries en las etiquetas)", + "key-name": "Nombre clave", + "key-name-required": "Nombre clave requerido", + "key-type": "Tipo clave", + "key-type-attribute": "Atributo", "key-type-timeseries": "Timeseries", - "label-keys-list": "Keys list to use in labels", - "no-label-keys": "No keys configured", - "add-label-key": "Add new key", - "line-width": "Line width", + "label-keys-list": "Lista de claves para usar en etiquetas", + "no-label-keys": "No hay claves configuradas", + "add-label-key": "Añadir nueva clave", + "line-width": "Ancho de línea", "color": "Color", - "data-is-hidden-by-default": "Data is hidden by default", - "disable-data-hiding": "Disable data hiding", - "remove-from-legend": "Remove datakey from legend", - "exclude-from-stacking": "Exclude from stacking(available in \"Stacking\" mode)", - "line-settings": "Line settings", - "show-line": "Show line", - "fill-line": "Fill line", - "points-settings": "Points settings", - "show-points": "Show points", - "points-line-width": "Line width of points", - "points-radius": "Radius of points", - "point-shape": "Point shape", - "point-shape-circle": "Circle", - "point-shape-cross": "Cross", - "point-shape-diamond": "Diamond", - "point-shape-square": "Square", - "point-shape-triangle": "Triangle", - "point-shape-custom": "Custom function", - "point-shape-draw-function": "Point shape draw function", - "show-separate-axis": "Show separate axis", - "axis-position-left": "Left", - "axis-position-right": "Right", - "thresholds": "Thresholds", - "no-thresholds": "No thresholds configured", - "add-threshold": "Add new threshold", - "show-values-for-comparison": "Show historical values for comparison", - "comparison-values-label": "Historical values label", - "threshold-settings": "Threshold settings", - "use-as-threshold": "Use key value as threshold", - "threshold-line-width": "Threshold line width", - "threshold-color": "Threshold color", - "common-pie-settings": "Common pie settings", - "radius": "Radius", - "inner-radius": "Inner radius", - "tilt": "Tilt", - "stroke-settings": "Stroke settings", - "width-pixels": "Width (pixels)", - "show-labels": "Show labels", - "animation-settings": "Animation settings", - "animated-pie": "Enable pie animation (experimental)", - "border-settings": "Border settings", - "border-width": "Border width", - "border-color": "Border color", - "legend-settings": "Legend settings", - "display-legend": "Display legend", - "labels-font-color": "Labels font color" + "data-is-hidden-by-default": "Ocultar datos por defecto", + "disable-data-hiding": "Desactivar ocultación de datos", + "remove-from-legend": "Quitar clave de la leyenda", + "exclude-from-stacking": "Excluir del modo apilado(disponible en el modo \"Apilado\")", + "line-settings": "Ajustes de línea", + "show-line": "Mostrar línea", + "fill-line": "Rellenar línea", + "points-settings": "Ajustes de puntos", + "show-points": "Mostrar puntos", + "points-line-width": "Ancho de línea en puntos", + "points-radius": "Radio de los puntos", + "point-shape": "Forma del punto", + "point-shape-circle": "Círculo", + "point-shape-cross": "Cruz", + "point-shape-diamond": "Diamante", + "point-shape-square": "Cuadrado", + "point-shape-triangle": "Triángulo", + "point-shape-custom": "Función personalizada", + "point-shape-draw-function": "Función de forma del punto", + "show-separate-axis": "Mostrar eje separado", + "axis-position-left": "Izquieda", + "axis-position-right": "Derecha", + "thresholds": "Umbrales", + "no-thresholds": "No hay umbrales configurados", + "add-threshold": "Añadir nuevo umbral", + "show-values-for-comparison": "Mostrar valores históricos para su comparación", + "comparison-values-label": "Etiqueta de valores históricos", + "threshold-settings": "Ajustes de umbrales", + "use-as-threshold": "Usar valor de clave como umbral", + "threshold-line-width": "Ancho de línea (para umbral)", + "threshold-color": "Color umbral", + "common-pie-settings": "Ajustes comunes diagrama de sectores", + "radius": "Radio", + "inner-radius": "Radio interior", + "tilt": "Inclinación", + "stroke-settings": "Ajustes de trazo", + "width-pixels": "Ancho (pixels)", + "show-labels": "Mostrar etiquetas", + "animation-settings": "Ajustes de animación", + "animated-pie": "Activar animación (experimental)", + "border-settings": "Ajustes de bordes", + "border-width": "Ancho de borde", + "border-color": "Color de borde", + "legend-settings": "Ajustes de leyenda", + "display-legend": "Mostrar leyenda", + "labels-font-color": "Color de texto en leyenda" }, "dashboard-state": { - "dashboard-state-settings": "Dashboard state settings", - "dashboard-state": "Dashboard state id", - "autofill-state-layout": "Autofill state layout height by default", - "default-margin": "Default widgets margin", - "default-background-color": "Default background color", - "sync-parent-state-params": "Sync state params with parent dashboard" + "dashboard-state-settings": "Ajustes estado de panel", + "dashboard-state": "Id de estado panel", + "autofill-state-layout": "Auto-rellenar altura por defecto (obtenida del estado)", + "default-margin": "Márgen entre widgets por defecto", + "default-background-color": "Color de fondo por defecto", + "sync-parent-state-params": "Sincronizar parámetros de estado con el panel padre" }, "date-range-navigator": { - "date-range-picker-settings": "Date range picker settings", - "hide-date-range-picker": "Hide date range picker", - "picker-one-panel": "Date range picker one panel", - "picker-auto-confirm": "Date range picker auto confirm", - "picker-show-template": "Date range picker show template", - "first-day-of-week": "First day of the week", - "interval-settings": "Interval settings", - "hide-interval": "Hide interval", - "initial-interval": "Initial interval", - "interval-hour": "Hour", - "interval-day": "Day", - "interval-week": "Week", - "interval-two-weeks": "2 weeks", - "interval-month": "Month", - "interval-three-months": "3 months", - "interval-six-months": "6 months", - "step-settings": "Step settings", - "hide-step-size": "Hide step size", - "initial-step-size": "Initial step size", - "hide-labels": "Hide labels", - "use-session-storage": "Use session storage", + "date-range-picker-settings": "Ajustes del selector de fechas", + "hide-date-range-picker": "Ocultar el selector de fechas", + "picker-one-panel": "Selector de fechas para un panel", + "picker-auto-confirm": "Auto-confirmar en selector de fechas", + "picker-show-template": "Mostrar plantilla de selector de fechas", + "first-day-of-week": "Primer día de la semana", + "interval-settings": "Ajustes de intervalo", + "hide-interval": "Ocultar intervalo", + "initial-interval": "Intervalo inicial", + "interval-hour": "Hora", + "interval-day": "Día", + "interval-week": "Semana", + "interval-two-weeks": "2 semanas", + "interval-month": "Mes", + "interval-three-months": "3 meses", + "interval-six-months": "6 meses", + "step-settings": "Ajustes de paso", + "hide-step-size": "Ocultar tamaño de paso", + "initial-step-size": "Tamaño de paso inicial", + "hide-labels": "Ocultar etiquetas", + "use-session-storage": "Usar almacenamiento de sesión", "localizationMap": { "Sun": "Dom.", "Mon": "Lun.", @@ -3646,170 +3646,170 @@ } }, "entities-hierarchy": { - "hierarchy-data-settings": "Hierarchy data settings", - "relations-query-function": "Node relations query function", - "has-children-function": "Node has children function", - "node-state-settings": "Node state settings", - "node-opened-function": "Default node opened function", - "node-disabled-function": "Node disabled function", - "display-settings": "Display settings", - "node-icon-function": "Node icon function", - "node-text-function": "Node text function", - "sort-settings": "Sort settings", - "nodes-sort-function": "Nodes sort function" + "hierarchy-data-settings": "Ajustes de datos de jerarquía", + "relations-query-function": "Función de obtención de relaciones", + "has-children-function": "El nodo tiene una función hija", + "node-state-settings": "Ajustes estado nodo", + "node-opened-function": "Función por defecto al abrir nodo", + "node-disabled-function": "Función con nodo desactivado", + "display-settings": "Mostrar ajustes", + "node-icon-function": "Función de icono nodo", + "node-text-function": "Función de texto nodo", + "sort-settings": "Ajustes de ordenación", + "nodes-sort-function": "Función de ordenación" }, "edge": { - "display-default-title": "Display default title" + "display-default-title": "Mostrar título por defecto" }, "gateway": { - "general-settings": "General settings", - "widget-title": "Widget title", - "default-archive-file-name": "Default archive file name", - "device-type-for-new-gateway": "Device type for new gateway", - "messages-settings": "Messages settings", - "save-config-success-message": "Text message about successfully saved gateway configuration", - "device-name-exists-message": "Text message when device with entered name is already exists", - "gateway-title": "Gateway form", - "read-only": "Read only", - "events-title": "Gateway events form title", - "events-filter": "Events filter", - "event-key-contains": "Event key contains..." + "general-settings": "Ajustes generales", + "widget-title": "Título del widget", + "default-archive-file-name": "Nombre del fichero por defecto", + "device-type-for-new-gateway": "Tipo de dispositivo para nuevo gateway", + "messages-settings": "Ajustes de mensajes", + "save-config-success-message": "Mensaje de éxito grabando configuración", + "device-name-exists-message": "Mensaje de texto cuando el nombre del dispositivo ya exista", + "gateway-title": "Formulario Gateway", + "read-only": "Solo lectura", + "events-title": "Título del formulario de eventos", + "events-filter": "Filtro de eventos", + "event-key-contains": "La clave de evento contiene..." }, "gauge": { - "default-color": "Default color", - "radial-gauge-settings": "Radial gauge settings", - "ticks-settings": "Ticks settings", - "min-value": "Minimum value", - "max-value": "Maximum value", - "start-ticks-angle": "Start ticks angle", - "ticks-angle": "Ticks angle", - "major-ticks-count": "Major ticks count", - "major-ticks-color": "Major ticks color", - "minor-ticks-count": "Minor ticks count", - "minor-ticks-color": "Minor ticks color", - "tick-numbers-font": "Tick numbers font", - "unit-title-settings": "Unit title settings", - "show-unit-title": "Show unit title", - "unit-title": "Unit title", - "title-font": "Title text font", - "units-settings": "Units settings", - "units-font": "Units text font", - "value-box-settings": "Value box settings", - "show-value-box": "Show value box", - "value-int": "Digits count for integer part of value", - "value-font": "Value text font", - "value-box-rect-stroke-color": "Value box rectangle stroke color", - "value-box-rect-stroke-color-end": "Value box rectangle stroke color - end gradient", - "value-box-background-color": "Value box background color", - "value-box-shadow-color": "Value box shadow color", - "plate-settings": "Plate settings", - "show-plate-border": "Show plate border", - "plate-color": "Plate color", - "needle-settings": "Needle settings", - "needle-circle-size": "Needle circle size", - "needle-color": "Needle color", - "needle-color-end": "Needle color - end gradient", - "needle-color-shadow-up": "Upper half of the needle shadow color", - "needle-color-shadow-down": "Drop shadow needle color", - "highlights-settings": "Highlights settings", - "highlights-width": "Highlights width", - "highlights": "Highlights", - "highlight-from": "From", - "highlight-to": "To", + "default-color": "Color por defecto", + "radial-gauge-settings": "Ajustes de indicador radial", + "ticks-settings": "Ajustes de ticks", + "min-value": "Valor mínimo", + "max-value": "Valor máximo", + "start-ticks-angle": "Ángulo de inicio ticks", + "ticks-angle": "Ángulo Ticks", + "major-ticks-count": "Nº de ticks principales", + "major-ticks-color": "Color Nº de ticks principales", + "minor-ticks-count": "Nº de ticks secundarios", + "minor-ticks-color": "Color Nº de ticks secundarios", + "tick-numbers-font": "Fuente del tick", + "unit-title-settings": "Ajustes de unidad (título)", + "show-unit-title": "Mostrar unidades (título)", + "unit-title": "Título de unidad", + "title-font": "Fuente de texto del título", + "units-settings": "Ajustes de unidades", + "units-font": "Fuente de texto de las unidades", + "value-box-settings": "Ajustes de valor", + "show-value-box": "Mostrar valor", + "value-int": "Nº de dígitos para la parte entera del valor", + "value-font": "Fuente de texto del valor", + "value-box-rect-stroke-color": "Color del trazo del rectángulo (valor)", + "value-box-rect-stroke-color-end": "Color del trazo del rectángulo (valor) - gradiente final", + "value-box-background-color": "Color de fondo del valor", + "value-box-shadow-color": "Color de sombra del valor", + "plate-settings": "Ajustes de la placa", + "show-plate-border": "Mostrar borde de la placa", + "plate-color": "Color de la placa", + "needle-settings": "Ajustes de la aguja", + "needle-circle-size": "Tamaño del círculo de la aguja", + "needle-color": "Color de la aguja", + "needle-color-end": "Color de la aguja - gradiente final", + "needle-color-shadow-up": "Color de sombreado de la mitad superior de la aguja", + "needle-color-shadow-down": "Color de sombra de la aguja", + "highlights-settings": "Ajustes de resalto", + "highlights-width": "Ancho del resalto", + "highlights": "Resaltos", + "highlight-from": "De", + "highlight-to": "A", "highlight-color": "Color", - "no-highlights": "No highlights configured", - "add-highlight": "Add highlight", - "animation-settings": "Animation settings", - "enable-animation": "Enable animation", - "animation-duration": "Animation duration", - "animation-rule": "Animation rule", - "animation-linear": "Linear", + "no-highlights": "No hay resaltos configurados", + "add-highlight": "Añadir resalto", + "animation-settings": "Ajustes de animación", + "enable-animation": "Activar animación", + "animation-duration": "Duración de animación", + "animation-rule": "Regla de animación", + "animation-linear": "Lineal", "animation-quad": "Quad", "animation-quint": "Quint", - "animation-cycle": "Cycle", - "animation-bounce": "Bounce", + "animation-cycle": "Ciclo (cycle)", + "animation-bounce": "Rebote (bounce)", "animation-elastic": "Elastic", "animation-dequad": "Dequad", "animation-dequint": "Dequint", "animation-decycle": "Decycle", "animation-debounce": "Debounce", "animation-delastic": "Delastic", - "linear-gauge-settings": "Linear gauge settings", - "bar-stroke-width": "Bar stroke width", - "bar-stroke-color": "Bar stroke color", - "bar-background-color": "Gauge bar background color", - "bar-background-color-end": "Bar background color - end gradient", - "progress-bar-color": "Progress bar color", - "progress-bar-color-end": "Progress bar color - end gradient", - "major-ticks-names": "Major ticks names", - "show-stroke-ticks": "Show ticks stroke", - "major-ticks-font": "Major ticks font", - "border-color": "Border color", - "border-width": "Border width", - "needle-circle-color": "Needle circle color", - "animation-target": "Animation target", - "animation-target-needle": "Needle", - "animation-target-plate": "Plate", - "common-settings": "Common gauge settings", - "gauge-type": "Gauge type", - "gauge-type-arc": "Arc", + "linear-gauge-settings": "Ajustes de indicador lineal", + "bar-stroke-width": "Ancho del trazo", + "bar-stroke-color": "Color del trazo", + "bar-background-color": "Color de fondo del indicador", + "bar-background-color-end": "Color de fondo del indicador - gradiente final", + "progress-bar-color": "Color de la barra de progreso", + "progress-bar-color-end": "Color de la barra de progreso - gradiente final", + "major-ticks-names": "Nombre de ticks principales", + "show-stroke-ticks": "Mostrar trazo de ticks", + "major-ticks-font": "Fuente de ticks principales", + "border-color": "Color del borde", + "border-width": "Ancho del borde", + "needle-circle-color": "Color del círculo de la aguja", + "animation-target": "Destino de la animación", + "animation-target-needle": "Aguja", + "animation-target-plate": "Placa", + "common-settings": "Ajustes comunes del indicador", + "gauge-type": "Tipo de indicador", + "gauge-type-arc": "Arco", "gauge-type-donut": "Donut", - "gauge-type-horizontal-bar": "Horizontal bar", - "gauge-type-vertical-bar": "Vertical bar", - "donut-start-angle": "Angle to start from", - "bar-settings": "Gauge bar settings", - "relative-bar-width": "Relative bar width", - "neon-glow-brightness": "Neon glow effect brightness, (0-100), 0 - disable effect", - "stripes-thickness": "Thickness of the stripes, 0 - no stripes", - "rounded-line-cap": "Display rounded line cap", - "bar-color-settings": "Bar color settings", - "use-precise-level-color-values": "Use precise color levels", - "bar-colors": "Bar colors, from lower to upper", + "gauge-type-horizontal-bar": "Barra horizontal", + "gauge-type-vertical-bar": "Barra vertical", + "donut-start-angle": "Ángulo de inicio", + "bar-settings": "Ajustes de barra indicadora", + "relative-bar-width": "Ancho relativo", + "neon-glow-brightness": "Efecto brillo de neon, (0-100), 0 - desactiva efecto", + "stripes-thickness": "Grosor de las rayas, 0 - sin rayas", + "rounded-line-cap": "Mostrar tapa de línea redondeada", + "bar-color-settings": "Ajustes de color de barra", + "use-precise-level-color-values": "Usar niveles precisos de color", + "bar-colors": "Colores de la barra, del más bajo al más alto", "color": "Color", - "no-bar-colors": "No bar colors configured", - "add-bar-color": "Add bar color", - "from": "From", - "to": "To", - "fixed-level-colors": "Bar colors using boundary values", - "gauge-title-settings": "Gauge title settings", - "show-gauge-title": "Show gauge title", - "gauge-title": "Gauge title", - "gauge-title-font": "Gauge title font", - "unit-title-and-timestamp-settings": "Unit title and timestamp settings", - "show-timestamp": "Show value timestamp", - "timestamp-format": "Timestamp format", - "label-font": "Font of label showing under value", - "value-settings": "Value settings", - "show-value": "Show value text", - "min-max-settings": "Minimum/maximum labels settings", - "show-min-max": "Show min and max values", - "min-max-font": "Font of minimum and maximum labels", - "show-ticks": "Show ticks", - "tick-width": "Tick width", - "tick-color": "Tick color", - "tick-values": "Tick values", - "no-tick-values": "No tick values configured", - "add-tick-value": "Add tick value" + "no-bar-colors": "No hay colores configurados", + "add-bar-color": "Añadir color", + "from": "De", + "to": "A", + "fixed-level-colors": "Colores de barra usando valores límite", + "gauge-title-settings": "Ajustes de título del indicador", + "show-gauge-title": "Mostrar título de indicador", + "gauge-title": "Título de indicador", + "gauge-title-font": "Fuente del título del indicador", + "unit-title-and-timestamp-settings": "Ajustes del título de unidades y timestamp", + "show-timestamp": "Mostrar valor timestamp", + "timestamp-format": "Formato timestamp", + "label-font": "Fuente de la etiqueta que se muestra bajo el valor", + "value-settings": "Ajustes del valor", + "show-value": "Mostrar texto del valor", + "min-max-settings": "Etiqueta mínimo/máximo", + "show-min-max": "Mostrar valores mínimos y máximos", + "min-max-font": "Fuente de los valores mínimo y máximo", + "show-ticks": "Mostrar ticks", + "tick-width": "Ancho de tick", + "tick-color": "Color de tick", + "tick-values": "Valores de tick", + "no-tick-values": "No hay valores configurados", + "add-tick-value": "Añadir valor de tick" }, "gpio": { "pin": "Pin", - "label": "Label", - "row": "Row", - "column": "Column", + "label": "Etiqueta", + "row": "Fila", + "column": "Columna", "color": "Color", - "panel-settings": "Panel settings", - "background-color": "Background color", - "gpio-switches": "GPIO switches", - "no-gpio-switches": "No GPIO switches configured", - "add-gpio-switch": "Add GPIO switch", - "gpio-status-request": "GPIO status request", - "method-name": "Method name", - "method-body": "Method body", - "gpio-status-change-request": "GPIO status change request", - "parse-gpio-status-function": "Parse gpio status function", - "gpio-leds": "GPIO leds", - "no-gpio-leds": "No GPIO leds configured", - "add-gpio-led": "Add GPIO led" + "panel-settings": "Ajustes de panel", + "background-color": "Color de fondo", + "gpio-switches": "switches GPIO", + "no-gpio-switches": "No hay switches GPIO configurados", + "add-gpio-switch": "Añadir switch GPIO", + "gpio-status-request": "Solicitud estado GPIO", + "method-name": "Nombre del método RPC", + "method-body": "Cuerpo del método RPC", + "gpio-status-change-request": "Solicitud de cambio de estado GPIO", + "parse-gpio-status-function": "Función de parseado de estado GPIO", + "gpio-leds": "Leds GPIO", + "no-gpio-leds": "No hay Leds GPIO configurados", + "add-gpio-led": "Añadir led GPIO" }, "html-card": { "html": "HTML", @@ -3860,569 +3860,569 @@ "update-attribute": "Actualizar atributo", "update-timeseries": "Actualizar series de tiempo", "value": "Valor", - "general-settings": "General settings", - "widget-title": "Widget title", - "claim-button-label": "Claiming button label", - "show-secret-key-field": "Show 'Secret key' input field", - "labels-settings": "Labels settings", - "show-labels": "Show labels", - "device-name-label": "Label for device name input field", - "secret-key-label": "Label for secret key input field", - "messages-settings": "Messages settings", - "claim-device-success-message": "Text message of successful device claiming", - "claim-device-not-found-message": "Text message when device not found", - "claim-device-failed-message": "Text message of failed device claiming", - "claim-device-name-required-message": "'Device name required' error message", - "claim-device-secret-key-required-message": "'Secret key required' error message", - "show-label": "Show label", - "label": "Label", - "required": "Required", - "required-error-message": "'Required' error message", - "show-result-message": "Show result message", - "integer-field-settings": "Integer field settings", - "min-value": "Min value", - "max-value": "Max value", - "double-field-settings": "Double field settings", - "text-field-settings": "Text field settings", - "min-length": "Min length", - "max-length": "Max length", - "checkbox-settings": "Checkbox settings", - "true-label": "Checked label", - "false-label": "Unchecked label", - "image-input-settings": "Image input settings", - "display-preview": "Display preview", - "display-clear-button": "Display clear button", - "display-apply-button": "Display apply button", - "display-discard-button": "Display discard button", - "datetime-field-settings": "Date/time field settings", - "display-time-input": "Display time input", - "latitude-key-name": "Latitude key name", - "longitude-key-name": "Longitude key name", - "show-get-location-button": "Show button 'Get current location'", - "use-high-accuracy": "Use high accuracy", - "location-fields-settings": "Location fields settings", - "latitude-label": "Label for latitude", - "longitude-label": "Label for longitude", - "input-fields-alignment": "Input fields alignment", - "input-fields-alignment-column": "Column (default)", - "input-fields-alignment-row": "Row", - "latitude-field-required": "Latitude field required", - "longitude-field-required": "Longitude field required", - "attribute-settings": "Attribute settings", - "widget-mode": "Widget mode", - "widget-mode-update-attribute": "Update attribute", - "widget-mode-update-timeseries": "Update timeseries", - "attribute-scope": "Attribute scope", - "attribute-scope-server": "Server attribute", - "attribute-scope-shared": "Shared attribute", - "value-required": "Value required", - "image-settings": "Image settings", - "image-format": "Image format", + "general-settings": "Ajustes Generales", + "widget-title": "Título del widget", + "claim-button-label": "Etiqueta del botón de reclamar", + "show-secret-key-field": "Mostrar el campo 'Clave Secreta'", + "labels-settings": "Ajustes de etiquetas", + "show-labels": "Mostrar etiquetas", + "device-name-label": "Etiqueta para el campo de entrada 'Nombre de Dispositivo'", + "secret-key-label": "Etiqueta para el campo de entrara 'Clave Secreta'", + "messages-settings": "Ajustes de mensajes", + "claim-device-success-message": "Mensaje a mostrar cuando el dispositivo se haya reclamado ok", + "claim-device-not-found-message": "Mensaje a mostrar cuando el dispositivo no se encuentre", + "claim-device-failed-message": "Mensaje a mostrar cuando ocurra un error reclamando el dispositivo", + "claim-device-name-required-message": "Mensaje de error a mostrar con 'Nombre de dispositivo requerido'", + "claim-device-secret-key-required-message": "Mensaje de error a mostrar con 'Clave Secreta requerida'", + "show-label": "Mostrar etiqueta", + "label": "Etiqueta", + "required": "Requerido", + "required-error-message": "Error a mostrar con campo 'Requerido'", + "show-result-message": "Mensaje para mostrar resultado", + "integer-field-settings": "Ajustes de campos tipo entero", + "min-value": "Valor Mínimo", + "max-value": "Valor Máximo", + "double-field-settings": "Ajustes de campos tipo double", + "text-field-settings": "Ajustes de campos tipo texto", + "min-length": "Longitud mínima", + "max-length": "Longitud máxima", + "checkbox-settings": "Ajustes de campos tipo checkbox", + "true-label": "Etiqueta checked", + "false-label": "Etiqueta unchecked", + "image-input-settings": "Ajustes de campos tipo entrada de imagen", + "display-preview": "Mostrar previsualización", + "display-clear-button": "Mostrar botón de borrar", + "display-apply-button": "Mostrar botón de aplicar", + "display-discard-button": "Mostrar botón de descartar", + "datetime-field-settings": "Ajustes de campos tipo Fecha/Hora", + "display-time-input": "Mostrar entrada de hora", + "latitude-key-name": "Nombre clave latitud", + "longitude-key-name": "Nombre clave longitud", + "show-get-location-button": "Mostrar botón 'Obtener localización actual'", + "use-high-accuracy": "Usar alta precisión", + "location-fields-settings": "Ajustes de campos de localización", + "latitude-label": "Etiqueta para latitud", + "longitude-label": "Etiqueta para longitud", + "input-fields-alignment": "Alineado de campos de entrada", + "input-fields-alignment-column": "Columna (por defecto)", + "input-fields-alignment-row": "Fila", + "latitude-field-required": "Campo latitud requerido", + "longitude-field-required": "Campo longitud requerido", + "attribute-settings": "Ajustes de atributos", + "widget-mode": "Modo del widget", + "widget-mode-update-attribute": "Actualizar atributo", + "widget-mode-update-timeseries": "Actualizar timeseries", + "attribute-scope": "Alcance de atributos", + "attribute-scope-server": "Atributos de servidor", + "attribute-scope-shared": "Atributos compartidos", + "value-required": "Valor requerido", + "image-settings": "Ajustes de imagen", + "image-format": "Formato de imagen", "image-format-jpeg": "JPEG", "image-format-png": "PNG", "image-format-webp": "WEBP", - "image-quality": "Image quality that use lossy compression such as jpeg and webp", - "max-image-width": "Maximum image width", - "max-image-height": "Maximum image height", - "action-buttons": "Action buttons", - "show-action-buttons": "Show action buttons", - "update-all-values": "Update all values, not only modified", - "save-button-label": "'SAVE' button label", - "reset-button-label": "'UNDO' button label", - "group-settings": "Group settings", - "show-group-title": "Show title for group of fields, related to different entities", - "group-title": "Group title", - "fields-alignment": "Fields alignment", - "fields-alignment-row": "Row (default)", - "fields-alignment-column": "Column", - "fields-in-row": "Number of fields in the row", - "option-value": "Value (write 'null' for create empty option)", - "option-label": "Label", - "hide-input-field": "Hide input field", - "datakey-type": "Datakey type", - "datakey-type-server": "Server attribute (default)", - "datakey-type-shared": "Shared attribute", + "image-quality": "Calidad de imagen que usa compresión con pérdida como jpeg y webp", + "max-image-width": "Máximo ancho de imagen", + "max-image-height": "Máximo alto de imagen", + "action-buttons": "Botones de acción", + "show-action-buttons": "Mostrar botones de acción", + "update-all-values": "Actualizar todos los valores, no sólo los modificados", + "save-button-label": "Etiqueta de botón 'GRABAR'", + "reset-button-label": "Etiqueta de botón 'DESHACER'", + "group-settings": "Ajustes de grupo", + "show-group-title": "Mostrar título para el grupo de campos relacionados con diferentes entidades", + "group-title": "Título del grupo", + "fields-alignment": "Alineado de campos", + "fields-alignment-row": "Fila (por defecto)", + "fields-alignment-column": "Columna", + "fields-in-row": "Número de campos en la fila", + "option-value": "Valor (escribe 'null' para crear una opción vacía)", + "option-label": "Etiqueta", + "hide-input-field": "Ocultar campo de entrada", + "datakey-type": "Tipo de clave de datos", + "datakey-type-server": "Atributo de servidor (por defecto)", + "datakey-type-shared": "Atributo compartido", "datakey-type-timeseries": "Timeseries", - "datakey-value-type": "Datakey value type", + "datakey-value-type": "Tipo de valor de la clave de datos", "datakey-value-type-string": "String", "datakey-value-type-double": "Double", - "datakey-value-type-integer": "Integer", + "datakey-value-type-integer": "Entero", "datakey-value-type-boolean-checkbox": "Boolean (Checkbox)", "datakey-value-type-boolean-switch": "Boolean (Switch)", - "datakey-value-type-date-time": "Date & Time", - "datakey-value-type-date": "Date", - "datakey-value-type-time": "Time", - "datakey-value-type-select": "Select", - "value-is-required": "Value is required", - "ability-to-edit-attribute": "Ability to edit attribute", - "ability-to-edit-attribute-editable": "Editable (default)", - "ability-to-edit-attribute-disabled": "Disabled", - "ability-to-edit-attribute-readonly": "Read-only", - "disable-on-datakey-name": "Disable on false value of another datakey (specify datakey name)", - "slide-toggle-settings": "Slide toggle settings", - "slide-toggle-label-position": "Slide toggle label position", - "slide-toggle-label-position-after": "After", - "slide-toggle-label-position-before": "Before", - "select-options": "Select options", - "no-select-options": "No select options configured", - "add-select-option": "Add select option", - "numeric-field-settings": "Numeric field settings", - "step-interval": "Step interval between values", - "error-messages": "Error messages", - "min-value-error-message": "'Min value' error message", - "max-value-error-message": "'Max value' error message", - "invalid-date-error-message": "'Invalid date' error message", - "icon-settings": "Icon settings", - "use-custom-icon": "Use custom icon", - "input-cell-icon": "Icon to show before input cell", - "value-conversion-settings": "Value conversion settings", - "get-value-settings": "Get value settings", - "use-get-value-function": "Use getValue function", - "get-value-function": "getValue function", - "set-value-settings": "Set value settings", - "use-set-value-function": "Use setValue function", - "set-value-function": "setValue function" + "datakey-value-type-date-time": "Fecha & Hora", + "datakey-value-type-date": "Fecha", + "datakey-value-type-time": "Hora", + "datakey-value-type-select": "Selección", + "value-is-required": "Valor requerido", + "ability-to-edit-attribute": "Posibilidad de editar atributo", + "ability-to-edit-attribute-editable": "Editable (por defecto)", + "ability-to-edit-attribute-disabled": "Desactivado", + "ability-to-edit-attribute-readonly": "Sólo lectura", + "disable-on-datakey-name": "Desactivar cuando otra clave de datos sea false (especificar nombre de clave de datos)", + "slide-toggle-settings": "Ajustes de deslizador", + "slide-toggle-label-position": "Posición de etiqueta", + "slide-toggle-label-position-after": "Después", + "slide-toggle-label-position-before": "Antes", + "select-options": "Seleccionar opciones", + "no-select-options": "No hay opciones configuradas", + "add-select-option": "Añadir opción", + "numeric-field-settings": "Ajustes de campos numéricos", + "step-interval": "Pasos entre valores (intervalo)", + "error-messages": "Mensajes de erro", + "min-value-error-message": "Mensaje de error de 'Valor Mínimo'", + "max-value-error-message": "Mensaje de error de 'Valor Máximo'", + "invalid-date-error-message": "Mensaje de erro de 'Fecha Inválida'", + "icon-settings": "Ajustes de iconos", + "use-custom-icon": "Usar icono personalizado", + "input-cell-icon": "Icono a mostrar antes del campo de entrada", + "value-conversion-settings": "Ajustes de conversión de valor", + "get-value-settings": "Ajustes de obtención de valores", + "use-get-value-function": "Usar función getValue", + "get-value-function": "Función getValue", + "set-value-settings": "Ajustes de establecimiento de valores", + "use-set-value-function": "Usar función setValue", + "set-value-function": "Función setValue" }, - "invalid-qr-code-text": "Invalid input text for QR code. Input should have a string type", + "invalid-qr-code-text": "Texto de entrara inválido para el código QR. La entrada debe ser de tipo string", "qr-code": { - "use-qr-code-text-function": "Use QR code text function", - "qr-code-text-pattern": "QR code text pattern (for ex. '${entityName} | ${keyName} - some text.')", - "qr-code-text-pattern-required": "QR code text pattern is required.", - "qr-code-text-function": "QR code text function" + "use-qr-code-text-function": "Usar función de texto QR", + "qr-code-text-pattern": "Patrón del código QR (por ej. '${entityName} | ${keyName} - texto adicional.')", + "qr-code-text-pattern-required": "Se requiere patrón del código QR.", + "qr-code-text-function": "Función del código QR" }, "label-widget": { - "label-pattern": "Pattern", - "label-pattern-hint": "Hint: for ex. 'Text ${keyName} units.' or ${#<key index>} units'", - "label-pattern-required": "Pattern is required", - "label-position": "Position (Percentage relative to background)", + "label-pattern": "Patrón", + "label-pattern-hint": "Ayuda: por ej. 'Texto ${keyName} unidades.' o ${#<key index>} unidades'", + "label-pattern-required": "Se requiere patrón", + "label-position": "Posición (Porcentaje relativo al fondo)", "x-pos": "X", "y-pos": "Y", - "background-color": "Background color", - "font-settings": "Font settings", - "background-image": "Background image", - "labels": "Labels", - "no-labels": "No labels configured", - "add-label": "Add label" + "background-color": "Color de fondo", + "font-settings": "Ajustes de fuente", + "background-image": "Imagen de fondo", + "labels": "Etiquetas", + "no-labels": "No hay etiquetas configuradas", + "add-label": "Añadir etiqueta" }, "navigation": { - "title": "Title", - "navigation-path": "Navigation path", - "filter-type": "Filter type", - "filter-type-all": "All items", - "filter-type-include": "Include items", - "filter-type-exclude": "Exclude items", - "items": "Items", - "enter-urls-to-filter": "Enter urls to filter..." + "title": "Título", + "navigation-path": "Ruta de navegación", + "filter-type": "Tipo de filtro", + "filter-type-all": "Todos los objetos", + "filter-type-include": "Incluir objetos", + "filter-type-exclude": "Excluir objetos", + "items": "Objetos", + "enter-urls-to-filter": "Especificar URLs a filtrar..." }, "persistent-table": { - "rpc-id": "RPC ID", - "message-type": "Message type", - "method": "Method", - "params": "Params", - "created-time": "Created time", - "expiration-time": "Expiration time", - "retries": "Retries", - "status": "Status", - "filter": "Filter", - "refresh": "Refresh", - "add": "Add RPC request", - "details": "Details", - "delete": "Delete", - "delete-request-title": "Delete Persistent RPC request", - "delete-request-text": "Are you sure you want to delete request?", - "details-title": "Details RPC ID: ", - "additional-info": "Additional info", - "response": "Response", - "any-status": "Any status", - "rpc-status-list": "RPC status list", - "no-request-prompt": "No request to display", - "send-request": "Send request", - "add-title": "Create Persistent RPC request", - "method-error": "Method is required.", - "timeout-error": "Min timeout value is 5000 (5 seconds).", - "white-space-error": "White space is not allowed.", + "rpc-id": "ID RPC", + "message-type": "Tipo de mensaje", + "method": "Método", + "params": "Parémetros", + "created-time": "Hora de creación", + "expiration-time": "Hora de expiración", + "retries": "Reintentos", + "status": "Estado", + "filter": "Filtro", + "refresh": "Actualizar", + "add": "Añadir petición RPC", + "details": "Detalles", + "delete": "Borrar", + "delete-request-title": "Borrar petición RPC persistente", + "delete-request-text": "Estas seguro de borrar la petición?", + "details-title": "Detalles ID RPC: ", + "additional-info": "Información adicional", + "response": "Respuesta", + "any-status": "Cualquier estado", + "rpc-status-list": "Lista de estados RPC", + "no-request-prompt": "No hay peticiones a mostrar", + "send-request": "Enviar petición", + "add-title": "Crear una petición RPC persistente", + "method-error": "Se requiere método.", + "timeout-error": "El valor mínimo de timeout es 5000 (5 segundos).", + "white-space-error": "No se permiten espacios en blanco.", "rpc-status": { - "QUEUED": "QUEUED", - "SENT": "SENT", - "DELIVERED": "DELIVERED", - "SUCCESSFUL": "SUCCESSFUL", + "QUEUED": "EN COLA", + "SENT": "ENVIADO", + "DELIVERED": "ENTREGADO", + "SUCCESSFUL": "CORRECTO", "TIMEOUT": "TIMEOUT", - "EXPIRED": "EXPIRED", - "FAILED": "FAILED" + "EXPIRED": "EXPIRADO", + "FAILED": "FALLO" }, - "rpc-search-status-all": "ALL", + "rpc-search-status-all": "TODOS", "message-types": { "false": "Two-way", "true": "One-way" }, - "general-settings": "General settings", - "enable-filter": "Enable filter", - "enable-sticky-header": "Display header while scrolling", - "enable-sticky-action": "Display actions column while scrolling", - "display-request-details": "Display request details", - "allow-send-request": "Allow send RPC request", - "allow-delete-request": "Allow delete request", - "columns-settings": "Columns settings", - "display-columns": "Columns to display", - "column": "Column", - "no-columns-found": "No columns found", - "no-columns-matching": "'{{column}}' not found." + "general-settings": "Ajustes Generales", + "enable-filter": "Activar filtro", + "enable-sticky-header": "Mostrar encabezado mientras se hace scroll", + "enable-sticky-action": "Mostrar columna de acciones mientras se hace scroll", + "display-request-details": "Mostrar detalles de petición", + "allow-send-request": "Permitir enviar petición RPC", + "allow-delete-request": "Permitir borrar petición", + "columns-settings": "Ajustes de columnas", + "display-columns": "Columnas a mostrar", + "column": "Columna", + "no-columns-found": "No se encontraron columnas", + "no-columns-matching": "'{{column}}' no encontrada." }, "rpc": { - "value-settings": "Value settings", - "initial-value": "Initial value", - "retrieve-value-settings": "Retrieve on/off value settings", - "retrieve-value-method": "Retrieve value using method", - "retrieve-value-method-none": "Don't retrieve", - "retrieve-value-method-rpc": "Call RPC get value method", - "retrieve-value-method-attribute": "Subscribe for attribute", - "retrieve-value-method-timeseries": "Subscribe for timeseries", - "attribute-value-key": "Attribute key", - "timeseries-value-key": "Timeseries key", - "get-value-method": "RPC get value method", - "parse-value-function": "Parse value function", - "update-value-settings": "Update value settings", - "set-value-method": "RPC set value method", - "convert-value-function": "Convert value function", - "rpc-settings": "RPC settings", - "request-timeout": "RPC request timeout (ms)", - "persistent-rpc-settings": "Persistent RPC settings", - "request-persistent": "RPC request persistent", - "persistent-polling-interval": "Polling interval (ms) to get persistent RPC command response", - "common-settings": "Common settings", - "switch-title": "Switch title", - "show-on-off-labels": "Show on/off labels", - "slide-toggle-label": "Slide toggle label", - "label-position": "Label position", - "label-position-before": "Before", - "label-position-after": "After", - "slider-color": "Slider color", - "slider-color-primary": "Primary", - "slider-color-accent": "Accent", - "slider-color-warn": "Warn", - "button-style": "Button style", - "button-raised": "Raised button", - "button-primary": "Primary color", - "button-background-color": "Button background color", - "button-text-color": "Button text color", - "widget-title": "Widget title", - "button-label": "Button label", - "device-attribute-scope": "Device attribute scope", - "server-attribute": "Server attribute", - "shared-attribute": "Shared attribute", - "device-attribute-parameters": "Device attribute parameters", - "is-one-way-command": "Is one way command", - "rpc-method": "RPC method", - "rpc-method-params": "RPC method params", - "show-rpc-error": "Show RPC command execution error", - "led-title": "LED title", - "led-color": "LED color", - "check-status-settings": "Check status settings", - "perform-rpc-status-check": "Perform RPC device status check", - "retrieve-led-status-value-method": "Retrieve led status value using method", - "led-status-value-attribute": "Device attribute containing led status value", - "led-status-value-timeseries": "Device timeseries containing led status value", - "check-status-method": "RPC check device status method", - "parse-led-status-value-function": "Parse led status value function", - "knob-title": "Knob title", - "min-value": "Minimum value", - "max-value": "Maximum value" + "value-settings": "Ajustes de valor", + "initial-value": "Valor inicial", + "retrieve-value-settings": "Obtener ajustes valores on/off", + "retrieve-value-method": "Obtener valor usando método", + "retrieve-value-method-none": "No obtener", + "retrieve-value-method-rpc": "Método para llamada RPC de obtención de valor", + "retrieve-value-method-attribute": "Suscribir por atributo", + "retrieve-value-method-timeseries": "Suscribir por timeseries", + "attribute-value-key": "Clave de atributo", + "timeseries-value-key": "Clave de timeseries", + "get-value-method": "Metodo para obtener valor vía RPC", + "parse-value-function": "Función de parseo de valor", + "update-value-settings": "Ajustes de actualización de valor", + "set-value-method": "Método para establecer valor vía RPC", + "convert-value-function": "Función de conversión", + "rpc-settings": "Ajustes RPC", + "request-timeout": "Timeout de petición RPC (ms)", + "persistent-rpc-settings": "Ajustes de RPC persistente", + "request-persistent": "Petición RPC persistente", + "persistent-polling-interval": "Intervalo de sondeo (ms) para obtener respuesta del comando RPC persistente", + "common-settings": "Ajustes comunes", + "switch-title": "Título del switch", + "show-on-off-labels": "Mostrar etiquetas on/off", + "slide-toggle-label": "Etiqueta de interruptor deslizante", + "label-position": "Posición de etiqueta", + "label-position-before": "Antes", + "label-position-after": "Después", + "slider-color": "Color del deslizador", + "slider-color-primary": "Primario", + "slider-color-accent": "Acento", + "slider-color-warn": "Aviso", + "button-style": "Estilo de botón", + "button-raised": "Botón levantado", + "button-primary": "Color primario", + "button-background-color": "Color de fondo", + "button-text-color": "Color de texto", + "widget-title": "Título del widget", + "button-label": "Etiqueta del botón", + "device-attribute-scope": "Alcance de atributos del dispositivo", + "server-attribute": "Atributos de servidor", + "shared-attribute": "Atributos compartidos", + "device-attribute-parameters": "Parámetros de atributos del dispositivo", + "is-one-way-command": "Es un comando de una vía (one way)", + "rpc-method": "Método RPC", + "rpc-method-params": "Parámetros método RPC", + "show-rpc-error": "Mostrar errores de ejecución de RPC", + "led-title": "Título LED", + "led-color": "Color LED", + "check-status-settings": "Ajustes de comprobación de estado", + "perform-rpc-status-check": "Realizar comprobación del dispositivo RPC", + "retrieve-led-status-value-method": "Obtener estado del led usando método", + "led-status-value-attribute": "Atributo del dispositivo que contiene el valor del estado del led", + "led-status-value-timeseries": "Timeseries del dispositivo que contiene el valor del estado del led", + "check-status-method": "Método RPC para chequear el estado del dispositivo", + "parse-led-status-value-function": "Función de parseo para el estado del led", + "knob-title": "Título de mando", + "min-value": "Valor mínimo", + "max-value": "Valor máximo" }, "maps": { - "select-entity": "Select entity", - "select-entity-hint": "Hint: after selection click at the map to set position", + "select-entity": "Seleccionar entidad", + "select-entity-hint": "Ayuda: tras la selección haz click en el mapa para establecer la posición", "tooltips": { - "placeMarker": "Click to place '{{entityName}}' entity", - "firstVertex": "Polygon for '{{entityName}}': click to place first point", - "firstVertex-cut": "Click to place first point", - "continueLine": "Polygon for '{{entityName}}': click to continue drawing", - "continueLine-cut": "Click to continue drawing", - "finishLine": "Click any existing marker to finish", - "finishPoly": "Polygon for '{{entityName}}': click first marker to finish and save", - "finishPoly-cut": "Click first marker to finish and save", - "finishRect": "Polygon for '{{entityName}}': click to finish and save", - "startCircle": "Circle for '{{entityName}}': click to place circle center", - "finishCircle": "Circle for '{{entityName}}': click to finish circle", - "placeCircleMarker": "Click to place circle marker" + "placeMarker": "Click para colocar la entidad '{{entityName}}'", + "firstVertex": "Polígono para la entidad '{{entityName}}': click para colocar el primer punto", + "firstVertex-cut": "Click para colocar el primer punto", + "continueLine": "Polígono para la entidad '{{entityName}}': click para continuar dibujando", + "continueLine-cut": "Click para continuar dibujando", + "finishLine": "Click en cualquier marcador existente para finalizar", + "finishPoly": "Polígono para la entidad '{{entityName}}': click en el primer marcador para finalizar y grabar los cambios", + "finishPoly-cut": "Click en el primer marcador para finalizar y grabar los cambios", + "finishRect": "Polígono para la entidad '{{entityName}}': click para finalizar y grabar los cambios", + "startCircle": "Círculo para la entidad '{{entityName}}': click para establecer el centro del círculo", + "finishCircle": "Círculo para la entidad '{{entityName}}': click para finalizar el círculo", + "placeCircleMarker": "Click para colocar el marcador del círculo" }, "actions": { - "finish": "Finish", - "cancel": "Cancel", - "removeLastVertex": "Remove last point" + "finish": "Finalizar", + "cancel": "Cancelar", + "removeLastVertex": "Quitar último punto" }, "buttonTitles": { - "drawMarkerButton": "Place entity", - "drawPolyButton": "Create polygon", - "drawLineButton": "Create polyline", - "drawCircleButton": "Create circle", - "drawRectButton": "Create rectangle", - "editButton": "Edit mode", - "dragButton": "Drag-drop mode", - "cutButton": "Cut polygon area", - "deleteButton": "Remove", - "drawCircleMarkerButton": "Create circle marker", - "rotateButton": "Rotate polygon" + "drawMarkerButton": "Establecer entidad", + "drawPolyButton": "Crear polígono", + "drawLineButton": "Crear polilínea", + "drawCircleButton": "Crear círculo", + "drawRectButton": "Crear rectángulo", + "editButton": "Modo de edición", + "dragButton": "Modo Arrastrar-soltar", + "cutButton": "Cortar el área del polígono", + "deleteButton": "Borrar", + "drawCircleMarkerButton": "Crear marcador de círculo", + "rotateButton": "Rotar polígono" }, - "map-provider-settings": "Map provider settings", - "map-provider": "Map provider", + "map-provider-settings": "Ajustes proveedor de mapas", + "map-provider": "Proveedor de mapas", "map-provider-google": "Google maps", "map-provider-openstreet": "OpenStreet maps", "map-provider-here": "HERE maps", - "map-provider-image": "Image map", + "map-provider-image": "Mapa de imagen", "map-provider-tencent": "Tencent maps", - "openstreet-provider": "OpenStreet map provider", + "openstreet-provider": "Proveedor OpenStreet map", "openstreet-provider-mapnik": "OpenStreetMap.Mapnik (Default)", "openstreet-provider-hot": "OpenStreetMap.HOT", "openstreet-provider-esri-street": "Esri.WorldStreetMap", "openstreet-provider-esri-topo": "Esri.WorldTopoMap", "openstreet-provider-cartodb-positron": "CartoDB.Positron", "openstreet-provider-cartodb-dark-matter": "CartoDB.DarkMatter", - "use-custom-provider": "Use custom provider", - "custom-provider-tile-url": "Custom provider tile URL", - "google-maps-api-key": "Google Maps API Key", - "default-map-type": "Default map type", - "google-map-type-roadmap": "Roadmap", - "google-map-type-satelite": "Satellite", - "google-map-type-hybrid": "Hybrid", - "google-map-type-terrain": "Terrain", - "map-layer": "Map layer", - "here-map-normal-day": "HERE.normalDay (Default)", + "use-custom-provider": "Usar proveedor personalizado", + "custom-provider-tile-url": "URL de proveedor personalizado", + "google-maps-api-key": "API Key Google Maps", + "default-map-type": "Tipo de mapa por defecto", + "google-map-type-roadmap": "Carretera", + "google-map-type-satelite": "Satelite", + "google-map-type-hybrid": "Híbrido", + "google-map-type-terrain": "Terreno", + "map-layer": "Capa de mapa", + "here-map-normal-day": "HERE.normalDay (Defecto)", "here-map-normal-night": "HERE.normalNight", "here-map-hybrid-day": "HERE.hybridDay", "here-map-terrain-day": "HERE.terrainDay", - "credentials": "Credentials", + "credentials": "Credenciales", "here-app-id": "HERE app id", "here-app-code": "HERE app code", - "tencent-maps-api-key": "Tencent Maps API Key", - "tencent-map-type-roadmap": "Roadmap", - "tencent-map-type-satelite": "Satellite", - "tencent-map-type-hybrid": "Hybrid", - "image-map-background": "Image map background", - "image-map-background-from-entity-attribute": "Take image map background from entity attribute", - "image-url-source-entity-alias": "Image URL source entity alias", - "image-url-source-entity-attribute": "Image URL source entity attribute", - "common-map-settings": "Common map settings", - "x-pos-key-name": "X position key name", - "y-pos-key-name": "Y position key name", - "latitude-key-name": "Latitude key name", - "longitude-key-name": "Longitude key name", - "default-map-zoom-level": "Default map zoom level (0 - 20)", - "default-map-center-position": "Default map center position (0,0)", - "disable-scroll-zooming": "Disable scroll zooming", - "disable-zoom-control-buttons": "Disable zoom control buttons", - "fit-map-bounds": "Fit map bounds to cover all markers", - "use-default-map-center-position": "Use default map center position", - "entities-limit": "Limit of entities to load", - "markers-settings": "Markers settings", - "marker-offset-x": "Marker X offset relative to position multiplied by marker width", - "marker-offset-y": "Marker Y offset relative to position multiplied by marker height", - "position-function": "Position conversion function, should return x,y coordinates as double from 0 to 1 each", - "draggable-marker": "Draggable marker", - "label": "Label", - "show-label": "Show label", - "use-label-function": "Use label function", - "label-pattern": "Label (pattern examples: '${entityName}', '${entityName}: (Text ${keyName} units.)' )", - "label-function": "Label function", - "tooltip": "Tooltip", - "show-tooltip": "Show tooltip", - "show-tooltip-action": "Action for displaying the tooltip", - "show-tooltip-action-click": "Show tooltip on click (Default)", - "show-tooltip-action-hover": "Show tooltip on hover", - "auto-close-tooltips": "Auto-close tooltips", - "use-tooltip-function": "Use tooltip function", - "tooltip-pattern": "Tooltip (for ex. 'Text ${keyName} units.' or Link text')", - "tooltip-function": "Tooltip function", - "tooltip-offset-x": "Tooltip X offset relative to marker anchor multiplied by marker width", - "tooltip-offset-y": "Tooltip Y offset relative to marker anchor multiplied by marker height", + "tencent-maps-api-key": "API Key Tencent Maps", + "tencent-map-type-roadmap": "Carretera", + "tencent-map-type-satelite": "Satelite", + "tencent-map-type-hybrid": "Híbrido", + "image-map-background": "Fondo de mapa de imagen", + "image-map-background-from-entity-attribute": "Obtener imagen de fondo desde un atributo de la entidad", + "image-url-source-entity-alias": "Alias de entidad para URL de imagen", + "image-url-source-entity-attribute": "Atributo de entidad para URL de imagen", + "common-map-settings": "Ajustes comunes de mapas", + "x-pos-key-name": "Clave para posición X", + "y-pos-key-name": "Clave para posición Y", + "latitude-key-name": "Clave para latitud", + "longitude-key-name": "Clave para longitud", + "default-map-zoom-level": "Nivel de zoom por defecto (0 - 20)", + "default-map-center-position": "Posición central del mapa por defecto (0,0)", + "disable-scroll-zooming": "Desactivar zoom en scroll", + "disable-zoom-control-buttons": "Desactivar botones de zoom", + "fit-map-bounds": "Ajustar los límites del mapa para cubrir todos los marcadores", + "use-default-map-center-position": "Usar posición central por defecto", + "entities-limit": "Límite de entidades a cargar", + "markers-settings": "Ajustes de los marcadores", + "marker-offset-x": "Offset X relativo a la posición multiplicado por el ancho del marcador", + "marker-offset-y": "Offset Y relativo a la posición multiplicado por el alto del marcador", + "position-function": "Función de conversión de posición, debe retornar coordenadas x,y como valor double de 0 a 1", + "draggable-marker": "Marcador arrastrable", + "label": "Etiqueta", + "show-label": "Mostrar etiqueta", + "use-label-function": "Usar función de etiqueta", + "label-pattern": "Etiqueta (Ejemplos de patrón: '${entityName}', '${entityName}: (Texto ${keyName} unidades.)' )", + "label-function": "Función de etiqueta", + "tooltip": "Sugerencias (tooltip)", + "show-tooltip": "Mostrar sugerencias", + "show-tooltip-action": "Acción para mostrar las sugerencias", + "show-tooltip-action-click": "Mostrar sugerencias tooltip en click (por defecto)", + "show-tooltip-action-hover": "Mostrar sugerencias on hover", + "auto-close-tooltips": "Auto-cerrar sugerencias", + "use-tooltip-function": "Función de sugerencias", + "tooltip-pattern": "Sugerencia (Por ej. 'Texto ${keyName} unidades.' o Texto Link')", + "tooltip-function": "Función de sugerencia", + "tooltip-offset-x": "Offset X relativo al ancla del marcador multiplicado por el ancho", + "tooltip-offset-y": "Offset Y relativo al ancla del marcador multiplicado por la altura", "color": "Color", - "use-color-function": "Use color function", - "color-function": "Color function", - "marker-image": "Marker image", - "use-marker-image-function": "Use marker image function", - "custom-marker-image": "Custom marker image", - "custom-marker-image-size": "Custom marker image size (px)", - "marker-image-function": "Marker image function", - "marker-images": "Marker images", - "polygon-settings": "Polygon settings", - "show-polygon": "Show polygon", - "polygon-key-name": "Polygon key name", - "enable-polygon-edit": "Enable polygon edit", - "polygon-label": "Polygon label", - "show-polygon-label": "Show polygon label", - "use-polygon-label-function": "Use polygon label function", - "polygon-label-pattern": "Polygon label (pattern examples: '${entityName}', '${entityName}: (Text ${keyName} units.)' )", - "polygon-label-function": "Polygon label function", - "polygon-tooltip": "Polygon tooltip", - "show-polygon-tooltip": "Show polygon tooltip", - "auto-close-polygon-tooltips": "Auto-close polygon tooltips", - "use-polygon-tooltip-function": "Use polygon tooltip function", - "polygon-tooltip-pattern": "Tooltip (for ex. 'Text ${keyName} units.' or Link text')", - "polygon-tooltip-function": "Polygon tooltip function", - "polygon-color": "Polygon color", - "polygon-opacity": "Polygon opacity", - "use-polygon-color-function": "Use polygon color function", - "polygon-color-function": "Polygon color function", - "polygon-stroke": "Polygon stroke", - "stroke-color": "Stroke color", - "stroke-opacity": "Stroke opacity", - "stroke-weight": "Stroke weight", - "use-polygon-stroke-color-function": "Use polygon stroke color function", - "polygon-stroke-color-function": "Polygon stroke color function", - "circle-settings": "Circle settings", - "show-circle": "Show circle", - "circle-key-name": "Circle key name", - "enable-circle-edit": "Enable circle edit", - "circle-label": "Circle label", - "show-circle-label": "Show circle label", - "use-circle-label-function": "Use circle label function", - "circle-label-pattern": "Circle label (pattern examples: '${entityName}', '${entityName}: (Text ${keyName} units.)' )", - "circle-label-function": "Circle label function", - "circle-tooltip": "Circle tooltip", - "show-circle-tooltip": "Show circle tooltip", - "auto-close-circle-tooltips": "Auto-close circle tooltips", - "use-circle-tooltip-function": "Use circle tooltip function", - "circle-tooltip-pattern": "Tooltip (for ex. 'Text ${keyName} units.' or Link text')", - "circle-tooltip-function": "Circle tooltip function", - "circle-fill-color": "Circle fill color", - "circle-fill-color-opacity": "Circle fill color opacity", - "use-circle-fill-color-function": "Use circle fill color function", - "circle-fill-color-function": "Circle fill color function", - "circle-stroke": "Circle stroke", - "use-circle-stroke-color-function": "Use circle stroke color function", - "circle-stroke-color-function": "Circle stroke color function", - "markers-clustering-settings": "Markers clustering settings", - "use-map-markers-clustering": "Use map markers clustering", - "zoom-on-cluster-click": "Zoom when clicking on a cluster", - "max-cluster-zoom": "The maximum zoom level when a marker can be part of a cluster (0 - 18)", - "max-cluster-radius-pixels": "Maximum radius that a cluster will cover in pixels", - "cluster-zoom-animation": "Show animation on markers when zooming", - "show-markers-bounds-on-cluster-mouse-over": "Show the bounds of markers when mouse over a cluster", - "spiderfy-max-zoom-level": "Spiderfy at the max zoom level (to see all cluster markers)", - "load-optimization": "Load optimization", - "cluster-chunked-loading": "Use chunks for adding markers so that the page does not freeze", - "cluster-markers-lazy-load": "Use lazy load for adding markers", - "editor-settings": "Editor settings", - "enable-snapping": "Enable snapping to other vertices for precision drawing", - "init-draggable-mode": "Initialize map in draggable mode", - "hide-all-edit-buttons": "Hide all edit control buttons", - "hide-draw-buttons": "Hide draw buttons", - "hide-edit-buttons": "Hide edit buttons", - "hide-remove-button": "Hide remove button", - "route-map-settings": "Route map settings", - "trip-animation-settings": "Trip animation settings", - "normalization-step": "Normalization data step (ms)", - "tooltip-background-color": "Tooltip background color", - "tooltip-font-color": "Tooltip font color", - "tooltip-opacity": "Tooltip opacity (0-1)", - "auto-close-tooltip": "Auto-close tooltip", - "rotation-angle": "Set additional rotation angle for marker (deg)", - "path-settings": "Path settings", - "path-color": "Path color", - "use-path-color-function": "Use path color function", - "path-color-function": "Path color function", - "path-decorator": "Path decorator", - "use-path-decorator": "Use path decorator", - "decorator-symbol": "Decorator symbol", - "decorator-symbol-arrow-head": "Arrow", - "decorator-symbol-dash": "Dash", - "decorator-symbol-size": "Decorator symbol size (px)", - "use-path-decorator-custom-color": "Use path decorator custom color", - "decorator-custom-color": "Decorator custom color", - "decorator-offset": "Decorator offset", - "end-decorator-offset": "End decorator offset", - "decorator-repeat": "Decorator repeat", - "points-settings": "Points settings", - "show-points": "Show points", - "point-color": "Point color", - "point-size": "Point size (px)", - "use-point-color-function": "Use point color function", - "point-color-function": "Point color function", - "use-point-as-anchor": "Use point as anchor", - "point-as-anchor-function": "Point as anchor function", - "independent-point-tooltip": "Independent point tooltip" + "use-color-function": "Usar función de color", + "color-function": "Función de color", + "marker-image": "Imagen de marcador", + "use-marker-image-function": "Usar función de imagen de marcador", + "custom-marker-image": "Imagen de marcador personalizada", + "custom-marker-image-size": "Tamaño de imagen personalizada (px)", + "marker-image-function": "Función de imagen de marcador", + "marker-images": "Imagenes de marcador", + "polygon-settings": "Ajustes de polígono", + "show-polygon": "Mostrar polígono", + "polygon-key-name": "Clave del polígono", + "enable-polygon-edit": "Polígono editable", + "polygon-label": "Etiqueta del polígono", + "show-polygon-label": "Mostrar etiqueta del polígono", + "use-polygon-label-function": "Usar funciones de etiqueta en el polígono", + "polygon-label-pattern": "Etiqueta del polígono (Ejemplos de patrón: '${entityName}', '${entityName}: (Texto ${keyName} unidades.)' )", + "polygon-label-function": "Función de etiqueta del polígono", + "polygon-tooltip": "Sugerencia polígono", + "show-polygon-tooltip": "Mostrar sugerencias", + "auto-close-polygon-tooltips": "Auto-cerrar sugerencias polígono", + "use-polygon-tooltip-function": "Usar función de sugerencias en el polígono", + "polygon-tooltip-pattern": "Sugerencias (por ej. 'Texto ${keyName} unidades.' o Texto Link')", + "polygon-tooltip-function": "Función de sugerencia de polígono", + "polygon-color": "Color de polígono", + "polygon-opacity": "Opacidad de polígono", + "use-polygon-color-function": "Usar función de color en polígono", + "polygon-color-function": "Función de color de polígono", + "polygon-stroke": "Trazo de polígono", + "stroke-color": "Color de trazo", + "stroke-opacity": "Opacidad de trazo", + "stroke-weight": "Peso de trazo", + "use-polygon-stroke-color-function": "Usar función de color de trazo en polígono", + "polygon-stroke-color-function": "Función de color de trazo", + "circle-settings": "Ajustes de círculo", + "show-circle": "Mostrar círculo", + "circle-key-name": "Clave de círculo", + "enable-circle-edit": "Activar edición de círculo", + "circle-label": "Etiqueta de círculo", + "show-circle-label": "Mostrar etiqueta de círculo", + "use-circle-label-function": "Usar función para etiqueta de círculo", + "circle-label-pattern": "Etiqueta de círculo (Ejemplos patrón: '${entityName}', '${entityName}: (Texto ${keyName} unidades.)' )", + "circle-label-function": "Funcion de etiqueta de círculo", + "circle-tooltip": "Sugerencias de círculo", + "show-circle-tooltip": "Mostrar sugerencias de círculo", + "auto-close-circle-tooltips": "Auto-cerrar sugerencias", + "use-circle-tooltip-function": "Usar función de sugerencias en círculo", + "circle-tooltip-pattern": "Sugerencia (por ej. 'Texto ${keyName} unidades.' o Texto Link')", + "circle-tooltip-function": "Función de sugerencia círculo", + "circle-fill-color": "Color de relleno círculo", + "circle-fill-color-opacity": "Opacidad color de relleno", + "use-circle-fill-color-function": "Usar función de color de relleno", + "circle-fill-color-function": "Función de color de relleno", + "circle-stroke": "Trazo del círculo", + "use-circle-stroke-color-function": "Usar función de color de trazo", + "circle-stroke-color-function": "Función de color de trazo", + "markers-clustering-settings": "Ajustes de agrupación de marcadores", + "use-map-markers-clustering": "Usar agrupación de marcadores en mapa", + "zoom-on-cluster-click": "Zoom cuando se haga click en un grupo", + "max-cluster-zoom": "Nivel máximo de zoom en la que un marcador puede ser parte de un grupo (0 - 18)", + "max-cluster-radius-pixels": "Radio máximo que un grupo cubre en píxeles", + "cluster-zoom-animation": "Mostrar animacion en marcadores cuando se haga zoom", + "show-markers-bounds-on-cluster-mouse-over": "Mostrar los limites de los marcadores cuando el raton pase por encima de un grupo", + "spiderfy-max-zoom-level": "Spiderfy al máximo nivel de zoom (para ver todos los marcadores)", + "load-optimization": "Optimización de carga", + "cluster-chunked-loading": "Usar fragmentos para añadir marcadores para que la página no se congele", + "cluster-markers-lazy-load": "Usar lazy load al añadir marcadores", + "editor-settings": "Ajustes del editor", + "enable-snapping": "Habilitar ajuste a otros vértices para dibujar con precisión", + "init-draggable-mode": "Inicializar mapa en modo arrastre", + "hide-all-edit-buttons": "Ocultar todos los botones de edición", + "hide-draw-buttons": "Ocultar botones de dibujo", + "hide-edit-buttons": "Ocultar botones de edición", + "hide-remove-button": "Ocultar botones de borrado", + "route-map-settings": "Ajustes de mapa de ruta", + "trip-animation-settings": "Ajustes de animación de ruta", + "normalization-step": "Pasos de normalización (ms)", + "tooltip-background-color": "Color de fondo de la sugerencia", + "tooltip-font-color": "Color de fuente de las sugerencias", + "tooltip-opacity": "Opacidad de las sugerencias (0-1)", + "auto-close-tooltip": "Auto-cerrar sugerencias", + "rotation-angle": "Ángulo de rotación adicional para el marcador (grados)", + "path-settings": "Ajustes de ruta", + "path-color": "Color de ruta", + "use-path-color-function": "Usar función de color de ruta", + "path-color-function": "Función de color de ruta", + "path-decorator": "Decorador de ruta", + "use-path-decorator": "Usar decorador de ruta", + "decorator-symbol": "Símbolo del decorador", + "decorator-symbol-arrow-head": "Flecha", + "decorator-symbol-dash": "Estrella", + "decorator-symbol-size": "Tamaño del decorador (px)", + "use-path-decorator-custom-color": "Usar color personalizado en el decorador", + "decorator-custom-color": "Color personalizado del decorador", + "decorator-offset": "Offset decorador", + "end-decorator-offset": "Offset final del decorador", + "decorator-repeat": "Repetición del decorador", + "points-settings": "Ajustes de puntos", + "show-points": "Mostrar puntos", + "point-color": "Color de puntos", + "point-size": "Tamaño de puntos (px)", + "use-point-color-function": "Usar función de color de puntos", + "point-color-function": "Función de color de puntos", + "use-point-as-anchor": "Usar punto como ancla", + "point-as-anchor-function": "Función de punto como ancla", + "independent-point-tooltip": "Sugerencia independiente en punto" }, "markdown": { - "use-markdown-text-function": "Use markdown/HTML value function", - "markdown-text-function": "Markdown/HTML value function", - "markdown-text-pattern": "Markdown/HTML pattern (markdown or HTML with variables, for ex. '${entityName} or ${keyName} - some text.')", + "use-markdown-text-function": "Usar función markdown/HTML", + "markdown-text-function": "Función de valor Markdown/HTML", + "markdown-text-pattern": "Patrón de Markdown/HTML (markdown o HTML con variables, por ej. '${entityName} o ${keyName} - texto.')", "markdown-css": "Markdown/HTML CSS" }, "simple-card": { - "label-position": "Label position", - "label-position-left": "Left", - "label-position-top": "Top" + "label-position": "Posición etiqueta", + "label-position-left": "Izquierda", + "label-position-top": "Superior" }, "table": { - "common-table-settings": "Common Table Settings", - "enable-search": "Enable search", - "enable-sticky-header": "Always display header", - "enable-sticky-action": "Always display actions column", - "hidden-cell-button-display-mode": "Hidden cell button actions display mode", - "show-empty-space-hidden-action": "Show empty space instead of hidden cell button action", - "dont-reserve-space-hidden-action": "Don't reserve space for hidden action buttons", - "display-timestamp": "Display timestamp column", - "display-milliseconds": "Display timestamp milliseconds", - "display-pagination": "Display pagination", - "default-page-size": "Default page size", - "use-entity-label-tab-name": "Use entity label in tab name", - "hide-empty-lines": "Hide empty lines", - "row-style": "Row style", - "use-row-style-function": "Use row style function", - "row-style-function": "Row style function", - "cell-style": "Cell style", - "use-cell-style-function": "Use cell style function", - "cell-style-function": "Cell style function", - "cell-content": "Cell content", - "use-cell-content-function": "Use cell content function", - "cell-content-function": "Cell content function", - "show-latest-data-column": "Show latest data column", - "latest-data-column-order": "Latest data column order", - "entities-table-title": "Entities table title", - "enable-select-column-display": "Enable select columns to display", - "display-entity-name": "Display entity name column", - "entity-name-column-title": "Entity name column title", - "display-entity-label": "Display entity label column", - "entity-label-column-title": "Entity label column title", - "display-entity-type": "Display entity type column", - "default-sort-order": "Default sort order", - "column-width": "Column width (px or %)", - "default-column-visibility": "Default column visibility", + "common-table-settings": "Ajustes comunes en tablas", + "enable-search": "Activar búsqueda", + "enable-sticky-header": "Mostrar siempre el encabezado", + "enable-sticky-action": "Mostrar siempre la columna de acciones", + "hidden-cell-button-display-mode": "Visualización de botones de acción oculta", + "show-empty-space-hidden-action": "Mostrar espacio vacío en lugar de celda oculta", + "dont-reserve-space-hidden-action": "No reservar espacio para los botones en celda oculta", + "display-timestamp": "Mostrar columna timestamp", + "display-milliseconds": "Mostrar milisegundos", + "display-pagination": "Mostrar páginas", + "default-page-size": "Tamaño de página por defecto", + "use-entity-label-tab-name": "Usar etiqueta de entidad en el nombre de la tabla", + "hide-empty-lines": "Ocultar líneas vacías", + "row-style": "Estilo de fila", + "use-row-style-function": "Usar función de estilo de fila", + "row-style-function": "Función de estilo de fila", + "cell-style": "Estilo de celda", + "use-cell-style-function": "Usar función de estilo de celda", + "cell-style-function": "Función de estilo de celda", + "cell-content": "Contenido de celda", + "use-cell-content-function": "Usar función de contenido de celda", + "cell-content-function": "Función de contenido de celda", + "show-latest-data-column": "Mostrar columna de últimos datos", + "latest-data-column-order": "Órden de columna de últimos datos", + "entities-table-title": "Título de tabla de entidades", + "enable-select-column-display": "Activar posibilidad de seleccionar columnas a mostrar", + "display-entity-name": "Mostrar columna de nombre de entidad", + "entity-name-column-title": "Título de columna en nombre de entidad", + "display-entity-label": "Mostrar columna de etiqueta de entidad", + "entity-label-column-title": "Título de columna en etiqueta de entidad", + "display-entity-type": "Mostrar columna de tipo de entidad", + "default-sort-order": "Ordenación por defecto", + "column-width": "Ancho de columna (px o %)", + "default-column-visibility": "Visibilidad por defecto en columna", "column-visibility-visible": "Visible", - "column-visibility-hidden": "Hidden", - "column-selection-to-display": "Column selection in 'Columns to Display'", - "column-selection-to-display-enabled": "Enabled", - "column-selection-to-display-disabled": "Disabled", - "alarms-table-title": "Alarms table title", - "enable-alarms-selection": "Enable alarms selection", - "enable-alarms-search": "Enable alarms search", - "enable-alarm-filter": "Enable alarm filter", - "display-alarm-details": "Display alarm details", - "allow-alarms-ack": "Allow alarms acknowledgment", - "allow-alarms-clear": "Allow alarms clear" + "column-visibility-hidden": "Oculta", + "column-selection-to-display": "Selección de columnas en 'Columnas a Mostrar'", + "column-selection-to-display-enabled": "Activada", + "column-selection-to-display-disabled": "Desactivada", + "alarms-table-title": "Título de tabla de alarmas", + "enable-alarms-selection": "Activar selección de alarmas", + "enable-alarms-search": "Activar búsqueda de alarmas", + "enable-alarm-filter": "Activar filtro de alarmas", + "display-alarm-details": "Mostrar detalles de alarma", + "allow-alarms-ack": "Permitir reconocimiento de alarmas", + "allow-alarms-clear": "Permitir borrado de alarmas" }, "value-source": { - "value-source": "Value source", - "predefined-value": "Predefined value", - "entity-attribute": "Value taken from entity attribute", - "value": "Value", - "source-entity-alias": "Source entity alias", - "source-entity-attribute": "Source entity attribute" + "value-source": "Origen valor", + "predefined-value": "Valor predefinido", + "entity-attribute": "Valor tomado de un atributo de entidad", + "value": "Valor", + "source-entity-alias": "Alias entidad de origen", + "source-entity-attribute": "Atributo entidad de origen" }, "widget-font": { - "font-family": "Font family", - "size": "Size", - "relative-font-size": "Relative font size (percents)", - "font-style": "Style", + "font-family": "Familia (font family)", + "size": "Tamaño", + "relative-font-size": "Tamaño fuente relativo (porcentaje)", + "font-style": "Estilo", "font-style-normal": "Normal", - "font-style-italic": "Italic", - "font-style-oblique": "Oblique", - "font-weight": "Weight", + "font-style-italic": "Cursiva", + "font-style-oblique": "Subrayada", + "font-weight": "Peso", "font-weight-normal": "Normal", - "font-weight-bold": "Bold", - "font-weight-bolder": "Bolder", + "font-weight-bold": "Negrita", + "font-weight-bolder": "Negrita+", "font-weight-lighter": "Lighter", "color": "Color", - "shadow-color": "Shadow color" + "shadow-color": "Color sombra" } }, "icon": { From 9669da0442bb0243c16e8f3651439b6a45d0aac8 Mon Sep 17 00:00:00 2001 From: devaskim Date: Fri, 3 Jun 2022 23:06:34 +0500 Subject: [PATCH 25/37] Add resource service to widget context. --- .../widget/dynamic-widget.component.ts | 2 ++ .../app/modules/home/models/services.map.ts | 4 +++- .../home/models/widget-component.models.ts | 2 ++ .../models/ace/service-completion.models.ts | 19 +++++++++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/dynamic-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/dynamic-widget.component.ts index 7aa0f6933e..a76a65ab96 100644 --- a/ui-ngx/src/app/modules/home/components/widget/dynamic-widget.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/dynamic-widget.component.ts @@ -38,6 +38,7 @@ import { EntityRelationService } from '@core/http/entity-relation.service'; import { EntityService } from '@core/http/entity.service'; import { DialogService } from '@core/services/dialog.service'; import { CustomDialogService } from '@home/components/widget/dialog/custom-dialog.service'; +import { ResourceService } from '@core/http/resource.service'; import { DatePipe } from '@angular/common'; import { TranslateService } from '@ngx-translate/core'; import { DomSanitizer } from '@angular/platform-browser'; @@ -76,6 +77,7 @@ export class DynamicWidgetComponent extends PageComponent implements IDynamicWid this.ctx.entityService = $injector.get(EntityService); this.ctx.dialogs = $injector.get(DialogService); this.ctx.customDialog = $injector.get(CustomDialogService); + this.ctx.resourceService = $injector.get(ResourceService); this.ctx.date = $injector.get(DatePipe); this.ctx.translate = $injector.get(TranslateService); this.ctx.http = $injector.get(HttpClient); diff --git a/ui-ngx/src/app/modules/home/models/services.map.ts b/ui-ngx/src/app/modules/home/models/services.map.ts index 1f3a2bf5ae..e2ad5f1ad6 100644 --- a/ui-ngx/src/app/modules/home/models/services.map.ts +++ b/ui-ngx/src/app/modules/home/models/services.map.ts @@ -36,6 +36,7 @@ import { BroadcastService } from '@core/services/broadcast.service'; import { ImportExportService } from '@home/components/import-export/import-export.service'; import { DeviceProfileService } from '@core/http/device-profile.service'; import { OtaPackageService } from '@core/http/ota-package.service'; +import { ResourceService } from '@core/http/resource.service'; export const ServicesMap = new Map>( [ @@ -59,6 +60,7 @@ export const ServicesMap = new Map>( ['router', Router], ['importExport', ImportExportService], ['deviceProfileService', DeviceProfileService], - ['otaPackageService', OtaPackageService] + ['otaPackageService', OtaPackageService], + ['resourceService', ResourceService] ] ); diff --git a/ui-ngx/src/app/modules/home/models/widget-component.models.ts b/ui-ngx/src/app/modules/home/models/widget-component.models.ts index 3bb727f4f5..0d8700145e 100644 --- a/ui-ngx/src/app/modules/home/models/widget-component.models.ts +++ b/ui-ngx/src/app/modules/home/models/widget-component.models.ts @@ -72,6 +72,7 @@ import { EntityRelationService } from '@core/http/entity-relation.service'; import { EntityService } from '@core/http/entity.service'; import { DialogService } from '@core/services/dialog.service'; import { CustomDialogService } from '@home/components/widget/dialog/custom-dialog.service'; +import { ResourceService } from '@core/http/resource.service'; import { DatePipe } from '@angular/common'; import { TranslateService } from '@ngx-translate/core'; import { PageLink } from '@shared/models/page/page-link'; @@ -168,6 +169,7 @@ export class WidgetContext { entityService: EntityService; dialogs: DialogService; customDialog: CustomDialogService; + resourceService: ResourceService; date: DatePipe; translate: TranslateService; http: HttpClient; diff --git a/ui-ngx/src/app/shared/models/ace/service-completion.models.ts b/ui-ngx/src/app/shared/models/ace/service-completion.models.ts index 25c5b5dc7d..bcad0a000c 100644 --- a/ui-ngx/src/app/shared/models/ace/service-completion.models.ts +++ b/ui-ngx/src/app/shared/models/ace/service-completion.models.ts @@ -100,6 +100,8 @@ export const importEntitiesResultInfoHref = 'CustomDialogComponent'; +export const resourceInfoHref = 'Resource info'; + export const pageLinkArg: FunctionArg = { name: 'pageLink', type: 'PageLink', @@ -1300,6 +1302,23 @@ export const serviceCompletions: TbEditorCompletions = { }, } }, + resourceService: { + description: 'Resource Service API
' + + 'See ResourceService for API reference.', + meta: 'service', + type: 'ResourceService', + children: { + getResources: { + description: 'Find resources by search text', + meta: 'function', + args: [ + pageLinkArg, + requestConfigArg + ], + return: observablePageDataReturnType(resourceInfoHref) + }, + } + }, dialogs: { description: 'Dialogs Service API
' + 'See DialogService for API reference.', From ac751b09f90c2f3e27679fa5735ba05ec6a3b957 Mon Sep 17 00:00:00 2001 From: YevhenBondarenko Date: Mon, 6 Jun 2022 09:17:19 +0200 Subject: [PATCH 26/37] fixed hash partition service initialization --- .../service/cluster/routing/HashPartitionServiceTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/application/src/test/java/org/thingsboard/server/service/cluster/routing/HashPartitionServiceTest.java b/application/src/test/java/org/thingsboard/server/service/cluster/routing/HashPartitionServiceTest.java index 74738c361f..cea08003bf 100644 --- a/application/src/test/java/org/thingsboard/server/service/cluster/routing/HashPartitionServiceTest.java +++ b/application/src/test/java/org/thingsboard/server/service/cluster/routing/HashPartitionServiceTest.java @@ -85,7 +85,9 @@ public class HashPartitionServiceTest { .addAllServiceTypes(Collections.singletonList(ServiceType.TB_CORE.name())) .build()); } + clusterRoutingService.init(); + clusterRoutingService.partitionsInit(); clusterRoutingService.recalculatePartitions(currentServer, otherServers); } From fa87a2fc8f3f0da9573f24c5e2e0e2e2271e3a5f Mon Sep 17 00:00:00 2001 From: YevhenBondarenko Date: Mon, 6 Jun 2022 09:35:04 +0200 Subject: [PATCH 27/37] fixed Rate limits test --- .../org/thingsboard/server/common/msg/tools/RateLimitsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/message/src/test/java/org/thingsboard/server/common/msg/tools/RateLimitsTest.java b/common/message/src/test/java/org/thingsboard/server/common/msg/tools/RateLimitsTest.java index b0bbfa3dc6..c8583527f1 100644 --- a/common/message/src/test/java/org/thingsboard/server/common/msg/tools/RateLimitsTest.java +++ b/common/message/src/test/java/org/thingsboard/server/common/msg/tools/RateLimitsTest.java @@ -67,7 +67,7 @@ public class RateLimitsTest { assertThat(rateLimits.tryConsume()).as("new token is available").isFalse(); int expectedRefillTime = period * 1000; - int gap = 300; + int gap = 500; await("tokens refill for rate limit " + rateLimitConfig) .atLeast(expectedRefillTime - gap, TimeUnit.MILLISECONDS) From 6f21de1d4d46f28db76fc46f856fe87e53594dab Mon Sep 17 00:00:00 2001 From: fe-dev Date: Mon, 6 Jun 2022 13:33:01 +0300 Subject: [PATCH 28/37] UI: Fix translation, console error and add height for menu visability --- ui-ngx/src/app/core/services/menu.service.ts | 2 +- .../home/components/profile/tenant-profile-data.component.ts | 2 +- .../app/modules/home/components/queue/queue-form.component.html | 2 +- ui-ngx/src/app/shared/models/queue.models.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ui-ngx/src/app/core/services/menu.service.ts b/ui-ngx/src/app/core/services/menu.service.ts index a655b0d8b1..f042ff6b5e 100644 --- a/ui-ngx/src/app/core/services/menu.service.ts +++ b/ui-ngx/src/app/core/services/menu.service.ts @@ -108,7 +108,7 @@ export class MenuService { name: 'admin.system-settings', type: 'toggle', path: '/settings', - height: '280px', + height: '320px', icon: 'settings', pages: [ { diff --git a/ui-ngx/src/app/modules/home/components/profile/tenant-profile-data.component.ts b/ui-ngx/src/app/modules/home/components/profile/tenant-profile-data.component.ts index dacf3df551..a6b02305d5 100644 --- a/ui-ngx/src/app/modules/home/components/profile/tenant-profile-data.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/tenant-profile-data.component.ts @@ -95,7 +95,7 @@ export class TenantProfileDataComponent implements ControlValueAccessor, OnInit, if (this.tenantProfileDataFormGroup.valid) { tenantProfileData = this.tenantProfileDataFormGroup.getRawValue(); } - this.propagateChange(tenantProfileData.configuration); + this.propagateChange(tenantProfileData?.configuration); } } diff --git a/ui-ngx/src/app/modules/home/components/queue/queue-form.component.html b/ui-ngx/src/app/modules/home/components/queue/queue-form.component.html index 5dee2afa87..fce4a9e499 100644 --- a/ui-ngx/src/app/modules/home/components/queue/queue-form.component.html +++ b/ui-ngx/src/app/modules/home/components/queue/queue-form.component.html @@ -16,7 +16,7 @@ --> -
+ admin.queue-name diff --git a/ui-ngx/src/app/shared/models/queue.models.ts b/ui-ngx/src/app/shared/models/queue.models.ts index dc90781d30..5814a6eeb9 100644 --- a/ui-ngx/src/app/shared/models/queue.models.ts +++ b/ui-ngx/src/app/shared/models/queue.models.ts @@ -75,7 +75,7 @@ export const QueueProcessingStrategyTypesMap = new Map Date: Mon, 6 Jun 2022 15:12:57 +0300 Subject: [PATCH 29/37] Fix backward compatibility for defaultQueueName field of device profile --- .../install/SqlDatabaseUpgradeService.java | 41 +++++++++++++++++++ .../update/DefaultDataUpdateService.java | 38 ----------------- .../server/common/data/DeviceProfile.java | 12 ++++++ .../dao/device/DeviceProfileServiceImpl.java | 11 +++++ 4 files changed, 64 insertions(+), 38 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseUpgradeService.java b/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseUpgradeService.java index d0d5f37e00..306102c66c 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseUpgradeService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseUpgradeService.java @@ -571,6 +571,22 @@ public class SqlDatabaseUpgradeService implements DatabaseEntitiesUpgradeService schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "3.3.4", SCHEMA_UPDATE_SQL); loadSql(schemaUpdateFile, conn); + log.info("Loading queues..."); + try { + if (!CollectionUtils.isEmpty(queueConfig.getQueues())) { + queueConfig.getQueues().forEach(queueSettings -> { + Queue queue = queueConfigToQueue(queueSettings); + Queue existing = queueService.findQueueByTenantIdAndName(queue.getTenantId(), queue.getName()); + if (existing == null) { + queueService.saveQueue(queue); + } + }); + } else { + systemDataLoaderService.createQueues(); + } + } catch (Exception e) { + } + log.info("Updating device profiles..."); schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "3.3.4", "schema_update_device_profile.sql"); loadSql(schemaUpdateFile, conn); @@ -628,4 +644,29 @@ public class SqlDatabaseUpgradeService implements DatabaseEntitiesUpgradeService return isOldSchema; } + private Queue queueConfigToQueue(TbRuleEngineQueueConfiguration queueSettings) { + Queue queue = new Queue(); + queue.setTenantId(TenantId.SYS_TENANT_ID); + queue.setName(queueSettings.getName()); + queue.setTopic(queueSettings.getTopic()); + queue.setPollInterval(queueSettings.getPollInterval()); + queue.setPartitions(queueSettings.getPartitions()); + queue.setPackProcessingTimeout(queueSettings.getPackProcessingTimeout()); + SubmitStrategy submitStrategy = new SubmitStrategy(); + submitStrategy.setBatchSize(queueSettings.getSubmitStrategy().getBatchSize()); + submitStrategy.setType(SubmitStrategyType.valueOf(queueSettings.getSubmitStrategy().getType())); + queue.setSubmitStrategy(submitStrategy); + ProcessingStrategy processingStrategy = new ProcessingStrategy(); + processingStrategy.setType(ProcessingStrategyType.valueOf(queueSettings.getProcessingStrategy().getType())); + processingStrategy.setRetries(queueSettings.getProcessingStrategy().getRetries()); + processingStrategy.setFailurePercentage(queueSettings.getProcessingStrategy().getFailurePercentage()); + processingStrategy.setPauseBetweenRetries(queueSettings.getProcessingStrategy().getPauseBetweenRetries()); + processingStrategy.setMaxPauseBetweenRetries(queueSettings.getProcessingStrategy().getMaxPauseBetweenRetries()); + queue.setProcessingStrategy(processingStrategy); + queue.setConsumerPerPartition(queueSettings.isConsumerPerPartition()); + return queue; + } + + + } diff --git a/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java b/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java index 7b87668319..e27f2e88c2 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java @@ -162,21 +162,6 @@ public class DefaultDataUpdateService implements DataUpdateService { break; case "3.3.4": log.info("Updating data from version 3.3.4 to 3.4.0 ..."); - log.info("Loading queues..."); - try { - if (!CollectionUtils.isEmpty(queueConfig.getQueues())) { - queueConfig.getQueues().forEach(queueSettings -> { - Queue queue = queueConfigToQueue(queueSettings); - Queue existing = queueService.findQueueByTenantIdAndName(queue.getTenantId(), queue.getName()); - if (existing == null) { - queueService.saveQueue(queue); - } - }); - } else { - systemDataLoaderService.createQueues(); - } - } catch (Exception e) { - } tenantsProfileQueueConfigurationUpdater.updateEntities(null); checkPointRuleNodesUpdater.updateEntities(null); break; @@ -649,29 +634,6 @@ public class DefaultDataUpdateService implements DataUpdateService { return mainQueueConfiguration; } - private Queue queueConfigToQueue(TbRuleEngineQueueConfiguration queueSettings) { - Queue queue = new Queue(); - queue.setTenantId(TenantId.SYS_TENANT_ID); - queue.setName(queueSettings.getName()); - queue.setTopic(queueSettings.getTopic()); - queue.setPollInterval(queueSettings.getPollInterval()); - queue.setPartitions(queueSettings.getPartitions()); - queue.setPackProcessingTimeout(queueSettings.getPackProcessingTimeout()); - SubmitStrategy submitStrategy = new SubmitStrategy(); - submitStrategy.setBatchSize(queueSettings.getSubmitStrategy().getBatchSize()); - submitStrategy.setType(SubmitStrategyType.valueOf(queueSettings.getSubmitStrategy().getType())); - queue.setSubmitStrategy(submitStrategy); - ProcessingStrategy processingStrategy = new ProcessingStrategy(); - processingStrategy.setType(ProcessingStrategyType.valueOf(queueSettings.getProcessingStrategy().getType())); - processingStrategy.setRetries(queueSettings.getProcessingStrategy().getRetries()); - processingStrategy.setFailurePercentage(queueSettings.getProcessingStrategy().getFailurePercentage()); - processingStrategy.setPauseBetweenRetries(queueSettings.getProcessingStrategy().getPauseBetweenRetries()); - processingStrategy.setMaxPauseBetweenRetries(queueSettings.getProcessingStrategy().getMaxPauseBetweenRetries()); - queue.setProcessingStrategy(processingStrategy); - queue.setConsumerPerPartition(queueSettings.isConsumerPerPartition()); - return queue; - } - private final PaginatedUpdater checkPointRuleNodesUpdater = new PaginatedUpdater<>() { diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/DeviceProfile.java b/common/data/src/main/java/org/thingsboard/server/common/data/DeviceProfile.java index 36cbda47c3..f432862499 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/DeviceProfile.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/DeviceProfile.java @@ -16,6 +16,7 @@ package org.thingsboard.server.common.data; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -78,6 +79,8 @@ public class DeviceProfile extends SearchTextBased implements H "If present, the specified queue will be used to store all unprocessed messages related to device, including telemetry, attribute updates, etc. " + "Otherwise, the 'Main' queue will be used to store those messages.") private QueueId defaultQueueId; + + private String defaultQueueName; @Valid private transient DeviceProfileData profileData; @JsonIgnore @@ -168,4 +171,13 @@ public class DeviceProfile extends SearchTextBased implements H } } + @JsonIgnore + public String getDefaultQueueName() { + return defaultQueueName; + } + + @JsonProperty + public void setDefaultQueueName(String defaultQueueName) { + this.defaultQueueName = defaultQueueName; + } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java index 04084de987..df5a49c1e1 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileServiceImpl.java @@ -37,8 +37,10 @@ import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; +import org.thingsboard.server.common.data.queue.Queue; import org.thingsboard.server.dao.entity.AbstractCachedEntityService; import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.dao.queue.QueueService; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.service.Validator; @@ -71,6 +73,9 @@ public class DeviceProfileServiceImpl extends AbstractCachedEntityService deviceProfileValidator; + @Autowired + private QueueService queueService; + private final Lock findOrCreateLock = new ReentrantLock(); @TransactionalEventListener(classes = DeviceProfileEvictEvent.class) @@ -119,6 +124,12 @@ public class DeviceProfileServiceImpl extends AbstractCachedEntityService Date: Mon, 6 Jun 2022 15:18:28 +0300 Subject: [PATCH 30/37] UI: Add translate for table cell --- .../pages/admin/queue/queues-table-config.resolver.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ui-ngx/src/app/modules/home/pages/admin/queue/queues-table-config.resolver.ts b/ui-ngx/src/app/modules/home/pages/admin/queue/queues-table-config.resolver.ts index 5af2735a49..24f33a8a03 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/queue/queues-table-config.resolver.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/queue/queues-table-config.resolver.ts @@ -17,7 +17,12 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, Router } from '@angular/router'; import { EntityTableColumn, EntityTableConfig } from '@home/models/entity/entities-table-config.models'; -import { QueueInfo, ServiceType } from '@shared/models/queue.models'; +import { + QueueInfo, + QueueProcessingStrategyTypesMap, + QueueSubmitStrategyTypesMap, + ServiceType +} from '@shared/models/queue.models'; import { select, Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; import { BroadcastService } from '@core/services/broadcast.service'; @@ -83,14 +88,14 @@ export class QueuesTableConfigResolver implements Resolve('partitions', 'admin.queue-partitions', '25%'), new EntityTableColumn('submitStrategy', 'admin.queue-submit-strategy', '25%', (entity: QueueInfo) => { - return entity.submitStrategy.type; + return this.translate.instant(QueueSubmitStrategyTypesMap.get(entity.submitStrategy.type).label); }, () => ({}), false ), new EntityTableColumn('processingStrategy', 'admin.queue-processing-strategy', '25%', (entity: QueueInfo) => { - return entity.processingStrategy.type; + return this.translate.instant(QueueProcessingStrategyTypesMap.get(entity.processingStrategy.type).label); }, () => ({}), false From c5ff1252f59a6e309d6ce2efd494d56ae3b5f5e8 Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Mon, 6 Jun 2022 15:47:39 +0300 Subject: [PATCH 31/37] Startup sequence optimization --- .../queue/discovery/HashPartitionService.java | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java index 8a56a86bcc..3317e75c91 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java @@ -90,20 +90,37 @@ public class HashPartitionService implements PartitionService { @PostConstruct public void init() { this.hashFunction = forName(hashFunctionName); + QueueKey coreKey = new QueueKey(ServiceType.TB_CORE); + partitionSizesMap.put(coreKey, corePartitions); + partitionTopicsMap.put(coreKey, coreTopic); + + if (!isTransport(serviceInfoProvider.getServiceType())) { + doInitRuleEnginePartitions(); + } } @AfterStartUp(order = AfterStartUp.QUEUE_INFO_INITIALIZATION) public void partitionsInit() { - QueueKey coreKey = new QueueKey(ServiceType.TB_CORE); - partitionSizesMap.put(coreKey, corePartitions); - partitionTopicsMap.put(coreKey, coreTopic); + if (isTransport(serviceInfoProvider.getServiceType())) { + doInitRuleEnginePartitions(); + } + } - List queueRoutingInfoList; + private void doInitRuleEnginePartitions() { + List queueRoutingInfoList = getQueueRoutingInfos(); + queueRoutingInfoList.forEach(queue -> { + QueueKey queueKey = new QueueKey(ServiceType.TB_RULE_ENGINE, queue); + partitionTopicsMap.put(queueKey, queue.getQueueTopic()); + partitionSizesMap.put(queueKey, queue.getPartitions()); + queuesById.put(queue.getQueueId(), queue); + }); + } + private List getQueueRoutingInfos() { + List queueRoutingInfoList; String serviceType = serviceInfoProvider.getServiceType(); - - if ("tb-transport".equals(serviceType)) { + if (isTransport(serviceType)) { //If transport started earlier than tb-core int getQueuesRetries = 10; while (true) { @@ -128,13 +145,11 @@ public class HashPartitionService implements PartitionService { } else { queueRoutingInfoList = queueRoutingInfoService.getAllQueuesRoutingInfo(); } + return queueRoutingInfoList; + } - queueRoutingInfoList.forEach(queue -> { - QueueKey queueKey = new QueueKey(ServiceType.TB_RULE_ENGINE, queue); - partitionTopicsMap.put(queueKey, queue.getQueueTopic()); - partitionSizesMap.put(queueKey, queue.getPartitions()); - queuesById.put(queue.getQueueId(), queue); - }); + private boolean isTransport(String serviceType) { + return "tb-transport".equals(serviceType); } @Override From 2fecf128a099b249da8b48851d2d97c3080e17d4 Mon Sep 17 00:00:00 2001 From: fe-dev Date: Mon, 6 Jun 2022 16:13:33 +0300 Subject: [PATCH 32/37] UI: add for expansion panel header fix height --- .../modules/home/components/queue/queue-form.component.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ui-ngx/src/app/modules/home/components/queue/queue-form.component.scss b/ui-ngx/src/app/modules/home/components/queue/queue-form.component.scss index c42c4d714d..13128ad29a 100644 --- a/ui-ngx/src/app/modules/home/components/queue/queue-form.component.scss +++ b/ui-ngx/src/app/modules/home/components/queue/queue-form.component.scss @@ -17,6 +17,10 @@ .queue-strategy { padding-bottom: 16px; + .mat-expansion-panel-header { + height: 50px; + } + .mat-expansion-panel-body { padding-bottom: 0 !important; } From b61ce04420ace1597bf6f6a014d969e06e5d4f7c Mon Sep 17 00:00:00 2001 From: fe-dev Date: Mon, 6 Jun 2022 17:47:02 +0300 Subject: [PATCH 33/37] UI: Fixed description for default created queues --- .../app/modules/home/components/queue/queue-form.component.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui-ngx/src/app/modules/home/components/queue/queue-form.component.ts b/ui-ngx/src/app/modules/home/components/queue/queue-form.component.ts index bb86b1edcb..b84dfc9985 100644 --- a/ui-ngx/src/app/modules/home/components/queue/queue-form.component.ts +++ b/ui-ngx/src/app/modules/home/components/queue/queue-form.component.ts @@ -158,6 +158,8 @@ export class QueueFormComponent implements ControlValueAccessor, OnInit, OnDestr this.modelValue = value; if (isDefinedAndNotNull(this.modelValue)) { this.queueFormGroup.patchValue(this.modelValue, {emitEvent: false}); + this.queueFormGroup.get('additionalInfo').get('description') + .patchValue(this.modelValue.additionalInfo?.description, {emitEvent: false}); this.submitStrategyTypeChanged(); } if (!this.disabled && !this.queueFormGroup.valid) { From 4082d901d020f6a3d75dc674d0fb68394b87fb23 Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Tue, 7 Jun 2022 11:27:06 +0300 Subject: [PATCH 34/37] update Pie widgets --- .../data/json/system/widget_bundles/charts.json | 4 ++-- .../home/components/widget/lib/flot-widget.ts | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/application/src/main/data/json/system/widget_bundles/charts.json b/application/src/main/data/json/system/widget_bundles/charts.json index 2772c696bf..de32604dbb 100644 --- a/application/src/main/data/json/system/widget_bundles/charts.json +++ b/application/src/main/data/json/system/widget_bundles/charts.json @@ -54,7 +54,7 @@ }, { "alias": "pie", - "name": "Pie- Flot", + "name": "Pie - Flot", "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAIAAADGnbT+AAAABmJLR0QA/wD/AP+gvaeTAAAZTElEQVR42u2deXwUVbbH/e+tM/Pe5/Oe82beNjo6znvjvFFnRkFxF1f2RREQWQQEEZFNFDUCOjAoCKjsq+xG1hBCWAJkJSEJCQGyJyQkZN+7urq7lvt+1RU61dWd0Emqqm911/2cPzq9pdP1zT3nnnvO795BrGENHcYd1ldgDQss3YYoiDcr+NQkLvqQc/sGx5eL2Q9n2aePt49/lRk1gBn0jNeTk+4kKb8iab8jGX1JzkCS9xYp/YxUriMNsYQtJUSwvs4wBovjhGtXXAf2OZZF2KeNs738hO3Zh7swr9ee/5uuLOFnJP1PJG8iqVxLWtOIwFpghfrgef7yJefWdex7k20v9euapJ6DpbL4f5AmtpKFpPFMWEEW+mCJba3ciShHxAfwaN2CSRuwvCazfyJXhpHq3YRrssAyLU92O3fmBPvJHNuL/XrMk8ZgdUxj/0hyBpPaH0J4DgtBsISyUuemb5khz/aeJ73A8ljSz0nBdNKWaYFFdQjFnY6xz5igIU+6g+WxrKdJbSQRXRZYNA2Xkzt53P7mCD2QMggs2S7cI6UtQsI/mhwsp9MVuZsZ/oJ+SBkKlmwp/00qVhPBboEVlEhKwFqPeX2Q3kgFAaz22esucnMzEXkLLAOjqUvp9kmvG4NU0MCSLeMR0nTeAkv/JEJDvWPZZ7bnHjGSqmCCJdnfkrwJxFVrgaUTUyJ39AAz+FmDkaIALDkx8QtStRXfggWWxhMVu3B2UJCiBSzZsOftvGmBpc1AdkrbbKeJwZKnLqTsLbB6NRwOVLAEFynqwJIN1RMCY4HVI/dXU4WKKBqoohEsacHYh7AlFljdTChcSApWnG4asOStxsaTFlgB79Ac+sHWvw89VNELllQo8fek4jsLrNvnFFw7NlGFFO1gyVY0l7YcPU1guZxsxPxuXW/7lDH2ccP9PsQMec6x8i+OpREd9wx73rlulVRRM3pQqIEFuzaWquIIasByONC/EOBlZka+BESE4kLpdcsi/D6Hi4mSZsD6uvaXDHxKrLop5Ofy2RmoKWVee0W6//m+zIgXQwQsKcs1mJ6tazrAcrDsvBkBUoVnYgdanuE6A4ud+w68qhIs9qNZuEeqTu7fR2xscKxahjudG9YIuVdCByxYdn/C2yywblE1a0rgXol9f6pr/0601rj2bPcP1suPCxU3hMI8L7A+nYceL0xRuC1WVznXfs2MGUxYO/v+2yEFlsTWCzRUdAUbLI7DXNKzgLozsFz7vseUhhyYlysc+bLIMPCPgFJ6dMoYZDTwY+jEWEq7/AoRHGEMlig4Pl/Y45WaX7DsU8aiRhkNgzINHrCkh2ZM4M7EcvFxQNmx+EOxuZEZ2j80wZJi+dHBbZ0NJljONct7kwLwA1b/PgjPxdpqhOq+YHXE/oOeERvq5PIbrAMCyZmZDyxY8QfhCJaUBe1dbskXLOf61e57PsOmNUwui5A2sF941OuFRyL5zIv2qW9g16i9dGLm5BAEC4Zu7LACi8/OtL3wmOZgiS3Nfn8dInelQ8RyAZ0XfGYanxzPDHyaO3Uc81xogoW8fJD2fIIAltjUiOxl77Phfmasb1cg/+kx6XcxNtzoSKI+31coKoDsh0RhVaVzw2rccHy5RLS1hSZYcpmNJFUSHjOWkH8NSQHNwfKlQRVjIQcmlBbLvdHwhnziOUycXPRhoSg/ZMGCpf/Z+Bqb4AXvrN0+a6rBYEl2q+Me+Qg8Kj2npZmdMy2UwYLlTwmrdIPo2rsjmLvL/ftA/koV2ocmWLC6A6EJVp29flHKkjp7ndotFubZXnmKwoqGUAMLxVuOG6EGlkjEiOTFAw4Nee3Y6MTKJB+3yLJzpltgGZGRN6rPxyCwTpSeBFWyDTw0dEvONk7g1W4xco8Flu5WtSN0wGpgG1+NGu0BS7Y55+bXMDVqt1h+3Tb4GQssHS35F8b0vhoB1vKLK1RUyQbaEioS/RRmBVxCY4HVE8sdHwpgZdde9kuVxy1uyN7kElxqt9jrDR8LrK6sOd7cYAmiMP30zC7Akm3W2Tk3bVXq194otw3pb4GlT+vYw3rXPugLVuz1k7elSraRUa+fv+Hzb+RyOT6db4Gli1XvMitYTt45/sRbAYIl28r01Q5eXaEGtb6QAiv+J+TKSHJ9CSmaRzL7eVVQQY/U16CEKwXdvyTF8yVZ79R7NdLfulvXQlMdwYosONAtqmR7N25WRVuF2i1WVtj0l+0zAqzkfydtWV7vVrGm/SHmmr8EIC+JeCf+C2Gvk7YMKTaClDc02WQF+ZT/7NWH0bMhUS+wMPGMOf5mD8CCjYgaFVd+zo9bXLTA9GBV73TDtJok/iu5+EB7KhwnDMhTSOpvOyz7RSmZWX+kvf0Gt3HUCspgnDWkYIa7ju9D6eSLXmpS6tbVoxdYh4uO9owqpVtkefVczSecNTdYrgapGl32brDy5dIb5k/utEYv61npNlwnYm1MUbjNlkntqam/kbpxsp6jthJQF7A4gXszZlIvwYJhRVneWq52DjXV9tcGmBWspH+TJh5VHhyTk9pj/lIqdIH+u2dq4VulJ99YITlHlME0xEg/9j7SQsQmcqYBC46s91TJNuzoyKNFx3zI5RxLFpp+VZj5qDR7MXmSg1M9hNAeAwqRHU/uR2r2kbqDkltEmO+qk3LoFFc96ALW7HPztAJLthXpX7NcMN2i9mAhikc8LjrJpSd8jtz5Z4kbKPdh/ehnzruTOKskfSxok6b8lx8oe3B2gSnAym3I05Yq2aaeeqe0RV1iK9bV2kcPMh9YWOW1pkvxuMSHz6OF70m/pTSik6hoPWk6K6kpO9xBgrOaXHqqt59HhzNXtAdrVcY3eoAlu8WY0hPq38fzjuWLzQRWwk9JU5z0Pshj+W1/gJwaFmsIs/x4z35S7JV2v/QO9cekpWXNHikN0cuPVDiTdrCwjkMOXSewZPviwjKbSy1PwKcl6yqppRlY4EaOacq+6FQ0BgNHB/g9+tCWTa4vdq8NS0nxgvaaY6651zWAd2qed9AYrNNlZ3SlSraJsZPzGvLVbrGh3j52KO1gVax25+TqSPmXHVbykcIrZUguEikuP2V6LxHmqjTh4Ta8IVJcCMKg0Y2Ma++9s9aCuRqD9XFShAFgwYYeGXm0+JivW3SuXEo1WC0X/M3zpbf0PF6UfkQnYBdutN0nPtauy43EWPbzWkggDaEXrFZn6+DDw40BS7YlF/7S6mxT7/9kZdj6Pxr6m9DwqkjWe3KtvY/8+BZKwQq8lkFDm3Bi8rWGXLVbbG3R9rCdEKxu8DXkyegEC004xoMFG3Jk+KHCI6KqTUAQeik6EnZgSQI19IGFKtARR0cFBSzZFqd8AV+sDroyL2riFsMCLGTXtFMx1QysrNrsIFIl2/gTk67WX/Nxi60QzbLACmxtkUIdWNuu7Ag6WDCsHiLzD/hxixvXWGDd3q5/Th1YaOeiASzZFiZ+2sg2qVeL13IC6aYPa7CynqELLFQhDzkygh6wYCgzvFSTpXaLba32qWMtsDpPOvxM2henB6ycuitUUSXboMPD9uTuQ6eQN1yic9sGC6xOTdodpwasAwWHKASrK7eYd7VbAl1hBFblOorA+ip9JbVgwcYeH3+pVu0WCcPY351ogeVzEuIkisAKpCs1uIaW642XN/sqkTgDOxMqjMBCZwclYKHCHblvysGSbUH8wnq2Xu0WC3JtrzxpgdVRv6pFk7QGYKEN0BRUyTY6etzFap/4FLqVs9+2wGo3NALRABauk4nAkt0i0rm86CPQtX+nBZZkDbFUgIW6KHOBJdu88wtq7WqlKKGkyDbg6XAH6+YWKsDakrPdjGDJupUJFT66ldIZd9PDGiy5+SzoYKE3y6RgKVaLnNotHtwfvmDlT6UCLMPKkfWz98/NrWaq1W7xRpnt1gka4QVWziAqwII+jNnBcrvFMUmVyT6boE72o/fDDiz00NIA1qTYqd2v+Rzx+YWlu3P3brq81bdtesaZ9+Cevr+6a1HK5wMPD1VmCjbnbN1+5Xt06eiEF5RIsKGudotHIsMLrIt/oAIsXO9u1h2MK24uUb6DUpoGSt2iKCq3t+W6CbQrQmW5sKkI96CvUBYdQfUVtmu0ZWtm3OzKtptd/cEhD1bKr6gACw3K3bpyp8vi3DAdgWrytNPvymdVQIYUD70RMx7ppRZnyztnZo46Nja9Gk12ZG3Wejz0WfISlO9hHYeahSZH03dZ63Dn1ivb8xsLNJ+33LqVCeELFmqUaQBL6a0CMVSmo0DeswuEgk9yqzH/o8RPiCRWc1Z+CK4QP6KtHrfhOjGTye1lNUwtfOjE2ClovF6QsFA/t+irWykN1O+iWRRVAGhKhpTjleHk0uPkwq87mv5CYVfHhGBhKsLE4/nxVNlpvAmKW3B78slpmJYKGguRBZAnJE/R87iYCXbOjiejRAclVlgxIOOPH3WN6BHt3Wit6MZ3AVVPKC+0JJOGaKlNHgkhibxhkqILRPpk5TRTlPtRAdahoT2+crPOzsXshYsHByffsz9fipTh4HDkDtwibnjEIFD9DGVlrN3gFpelLW92tLwe/Ybeq8W/pn2lYVMU4RolrVGQV/sjqfhWEquF4AzIQ00BIpvzf0dHK+xPTDljKaN4xONITs49/4HnThADKSx4PflUgeiS477d1ZjwcIwKXBWYRljmgVJzmxn3vnpLUdcBHTaokrakkvoo94T3uSRpBJ3IS09KEx48lEEz1k+pAKtn7YSYhwqaCuH4wIdyRQY3h/vBHHhCGyreH1kJ1WtBGw68wJPlzT4UiM6LX6A5VXC+qtTDyjTnq4fsC8461mc6owq5tJt8YaNQw4iMi/DGHKoFVwvVNQiHeFxt0Ryp0bTd1WrUbg89SxrAAgQ9kPRAHyJeixhcef/e3P24c3Xmt55oDD+WtZapTndCTD311HS8Q2pVGpaWUKZEGkJbqoZHvYrFqfLP3HPVddfati7s7rVt/Xbaxh9jP09y7MhxnSrlMqv50mahkRUdHA7pMIQ8HMBku0Iaz0i6WTdWSdLwODkHMjXpD5Hk/whYAv4uKsDC6qy7PQ7ykYV78/arHkISC/fvurZH/nHa6RnEWyIQ01hJc+muXOkJ2ISR979XZ35jczFadmEcGlZp80plxV3n7lnf1jVYgdgTu5jJMezSFMfeq64TJRJ5ZS1ik0N08kaRJwd5IK96d0eQB/IuPugO8txgQdiNBrDkFFTghgwWXoXQGycMeExe+k05NQ0ZBBiYW5+9EXMVnolTnDyv/TgxAndiwsNteMOUmxeQPoUYCTKuGoKFHKzyD7xUzf/vRg2ouq09tLXt9cP2j887NmS6oou41Eq+qFGok1ytaJSrZaRVrS2bCrAikhd167JhBvJ9E0w/8qNIZV1vaa9gRIYdGzuqVadMlbxz3MA2ELd80kcJn2hF1YnrXmVuZS3Cn7fZDKAqEHvQTd4n8Y5v0p2H8rkLlVKQV2cX25wiJxCqhgZgKaNvDSulxsVMDMSrQq9Bw4p7TJzKPw3h0dO7GUqouq3dt77tlf3MO7Hs12nOfddc58v4q3VCRavY6pRcrWg6sLArHALVDVKmI3W5UvSB5cjwg3azUBWI/X5z24DIjiDvXBl/rV7wBHkibWBFl8SEAFWzz81X9kwjlH47hg0lqgKxR7YzWNVevMlTARa2is1O1fiYt1Qpq0UJjnCjymMplXSAZa72L7+p2jaXl5DpxkuusKUKVsuIVICFTQ/PSs10hpRVNVPj5dmLuF+vC1+q/m+zjZYYy9TVydjkVv4h2KX57Ya2cJ6uhh6wUwQW5aIgnVl8RaLyr0BO6MEttnCmCjYvzkERWEeKokxH1Z7cvco/AXvJj+9kwpwq2O6rLorAKm4uNhdVqzLWKD+/nSNwARZVsNx6gSKwkAFC+5RZqPowYaGyXwPbcJOPsxZSsPs32bTalNRM3BZVnaagasqp6aq+Z9RXWUjJNuaoZmeAaQYWKhTop2pU9FgUzis/9pp0p8WTx1amOqkDCwfa0J6yOjKs3l0N0bHmKODutnhSWEY1Tx1Y8C/BPfLktoYKQeUHTq7gf7PegqnD/rjNpmHVl5aHNOHsU2qpSqvyUvHLbxD+EPYpK5XNPcPSVd3gGWfK4+ikCi38ys9ZZRMf/d6iSm3HizhKwTL+IMxADCXO3h9SfGGflQhVG6ICfDOUgtWDMmW9DU36yto91O++cdRKhPqxt0+w2pKgMVhny8/TQ9XMuFnKdlPwNeeMlQj1b2hWoxosNNiMiKJibYhDmvBhlJ/trylWyqrT9aDmvRgag0WkdtNvgk4V6sMgdaT8VHuvuiyAOrPFiQ7NMdAeLBo2pMtby72Wq2g3XWcB1KmhmccEYGGg4y+IVKGRVflhcmqF322ykgudGhoVKW3/8h3Q7AsWVcdLTig/STlN7aZ0GqZz04CFQ7b005/twjZd3qJqN312j5Wy6srw/eikGaELWMRbr9YY+wJakoqUlYMnIw5aKavb2F6N6kWNAwviad1VU+5du+k8Vbvp9FgrZXUb67PDxnLEZGBhHCw06DxfSHOr2k2XJBpRu4d+npkn2VUXnRHxjs62iXDxVH36D221QUALSTWIaYVGebvRYDl5FxQ79KYKCmnYo1T+3i1ZRqSssI19vdlrjlQmYCF7NOsUe76cRyHKD7kuZe3vjVYBC1UIxbQ4xL47JLagvGX8CgNiJ7oK1OgIFrmlpK1ru2mVzesMHGxNGJOyinbXAnyb7vyfjW399zKVbZKE1ZO7GJkem0t0/2tJH0kJ1oRjdjyAplB8SMgPQQoLdy5NdmbV8AaDBalLXS+9vmAh7plxRsdeVpXUVnqVce2mQArikZ5ft/2y5FZkHRGA9WMeB4YmRrMqsKbGsJjbZHFACAzBZaPnDLpqow4bus4YGMnorWp0h87vT7LrLutE1dkb57wy/k0CwpdgxSuoR8VneHm/V6Q1LsquAuuR7dJkFpnr2nDJiRkOzz9bxkfmGrrdhGpsTfRkggwWxtLU5Xq3mzbYxaeCoZA2JYZFSAcpUdHtFlWP+oIl97AfLeBiiqUpDSJp+OQG/z98eM5hwEU3AixoskP/WEOqVqSvUr4/2k2HBandFLo0jDucQjLWN8HhFyyl/Abar1HJgynk4e02Y0JDQIyPGiJguaP4WK2o+iBe3W46JdgKaYjZ8+oFBE+DIpnAwdqZ44IDHfCDFPjjaRAPMiCjC+VSY664QWAhJ66J/uzkU9NU7aYLzwWn3fSBLTZMOZ4fITiLD7Mi1RkgWHCImGif2cMk3eBPl3K/32zDJUcaQtfPPP6YnRg17jDsN+EUiV624Y+KHqNqN/0uI2i1e/Bi2DW6/1bdBBpffSnvDCysCiH+CQla3MY2+V+SpVfNj3Og6ly/D/ynbbZaRgxBsDBwvlLv2k3rle92tDCY7aabsqT8QkYVj1wUwnZMPwi2VM0/nYE19qi9oEG4b0P7cjK2hEMvA3SOURel30rwdCln5LU2FCyMrzN6qN1d1FysfB/oZN4XVIW0e9e34UQdOXKXCKvmh/xoDzx493z4wT8y1bb28H/0Eb1irIh4h8EX2miwcAxOD+T/cAKF8k0QKSvjmyAaRCX7fm/rZSHhPe43uVe3tuyX9jMsR0IcLCJJnNV065zBHwsOKl+O/+/HrHbT7uQXcLiG8Vc5CGARt4J3gIcM4uxn5QtxtsdL+63avW60oaZW8kG5xMEBCyOqOPq2VH2c9Jmq3RRRi4ULJYUxlIKFseHypi6owgH3vGC1m/bcliQ5gnhxgwkWah+WpX3pv900+k3UoCqf/FWq1W7aDZt9mhVEEqZgub0bF5G82F+7abPyacjxWKx0S4iBD/Ypc0EGS05ALEhYqATLc16hPFBYco+lkNYdHVEHH/SrSgFYMlsfJ0XIVGXWZCkfstpNu0uVJ2drgSUNdENAAulYSbTyTpSHo57EwiVAe+s4S8NcRRdYUrwleqWHcTojasktXAI/qoQX6bmYNIHl7RzJq4eslFWghn4ykbIrSClYM09ZKatA98KDmAU1H1iJN/g/WmIeAZRYBWvHxqxgYdxsE30LUSzzmKem2QKrB0tFIrd0Wqaq2sPXYudovnR0gyWPY0VcEBsGKXR/BteChixYGPV2EdsUFlUo7pDLTS2wtBzoY3kgXM8pwVIGDdOieS6WmcAi7gN257o7PMMHKVQ/o3e5ySGa60qZDCx5QJslTE7axdIvs5o34zUyJVjEXfd3II/rG7rF75CiOFzACaJJr49pwZKHSyAH8zlZlSpkDP8t2y67nLypr4zJwfLgBakqCE2FwCy1I8fl4EPgmoQEWPJAqwVU9tDzacbQHh8bWoTmdXyhDJZnFDUJixIcpjhA9cEtNuTQc+uF0LsKIQiWPND7C3GzGbEsdGZp4wmypZBcO1nCuYRQ/fpDFyzPQKkuNoWgihb05CqSnJBSxlpP27NMLbCCPFBgmV0jrM1wojDcMA1cFOyjYhEiR/jVghg+X3Y4gaUcWMxfrhWwloSiFYpzNOQMJEGTGLlytKwheOKF8PyCwxUs38kM4tgomkPSFSdNoH58UjSLmQY6ETg/AusACKzBk3oM4sfP72NeO2yHvPYHZx1opoVWEV5ew4jWl2mBZQ0LLGuYbfw/UfikHjIsMFkAAAAASUVORK5CYII=", "description": "Displays latest values of the attributes or timeseries data for multiple entities in a pie chart. Supports numeric values only.", "descriptor": { @@ -69,7 +69,7 @@ "dataKeySettingsSchema": "{}\n", "settingsDirective": "tb-flot-pie-widget-settings", "dataKeySettingsDirective": "tb-flot-pie-key-settings", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"First\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = (prevValue-50) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+50;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Second\",\"color\":\"#4caf50\",\"settings\":{},\"_hash\":0.6114638304362894,\"funcBody\":\"var value = (prevValue-20) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+20;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Third\",\"color\":\"#f44336\",\"settings\":{},\"_hash\":0.9955906536344441,\"funcBody\":\"var value = (prevValue-40) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+40;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Fourth\",\"color\":\"#ffc107\",\"settings\":{},\"_hash\":0.9430835931647599,\"funcBody\":\"var value = (prevValue-50) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+50;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"radius\":1,\"fontColor\":\"#545454\",\"fontSize\":10,\"decimals\":1,\"legend\":{\"show\":true,\"position\":\"nw\",\"labelBoxBorderColor\":\"#CCCCCC\",\"backgroundColor\":\"#F0F0F0\",\"backgroundOpacity\":0.85},\"innerRadius\":0,\"showLabels\":true,\"showPercentages\":true,\"stroke\":{\"width\":5},\"tilt\":1,\"animatedPie\":false},\"title\":\"Pie- Flot\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400}}" + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"First\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = (prevValue-50) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+50;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Second\",\"color\":\"#4caf50\",\"settings\":{},\"_hash\":0.6114638304362894,\"funcBody\":\"var value = (prevValue-20) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+20;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Third\",\"color\":\"#f44336\",\"settings\":{},\"_hash\":0.9955906536344441,\"funcBody\":\"var value = (prevValue-40) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+40;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Fourth\",\"color\":\"#ffc107\",\"settings\":{},\"_hash\":0.9430835931647599,\"funcBody\":\"var value = (prevValue-50) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+50;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"radius\":1,\"fontColor\":\"#545454\",\"fontSize\":10,\"decimals\":1,\"legend\":{\"show\":true,\"position\":\"nw\",\"labelBoxBorderColor\":\"#CCCCCC\",\"backgroundColor\":\"#F0F0F0\",\"backgroundOpacity\":0.85},\"innerRadius\":0,\"showLabels\":true,\"showPercentages\":true,\"stroke\":{\"width\":5},\"tilt\":1,\"animatedPie\":false},\"title\":\"Pie - Flot\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400}}" } }, { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.ts b/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.ts index 979d60bb5b..fef3e487e9 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.ts @@ -312,6 +312,7 @@ export class TbFlot { if (this.settings.stroke) { this.options.series.pie.stroke.color = this.settings.stroke.color || '#fff'; this.options.series.pie.stroke.width = this.settings.stroke.width || 0; + this.scalingPieRadius(); } if (this.options.series.pie.label.show) { @@ -690,6 +691,16 @@ export class TbFlot { } } + private scalingPieRadius() { + // if (this.options.series.pie.stroke?.color !== '#fff' && this.options.series.pie.stroke?.width !== 0) { + let scalingLine; + this.ctx.width > this.ctx.height ? scalingLine = this.ctx.height : scalingLine = this.ctx.width; + let changeRadius = this.options.series.pie.stroke.width / scalingLine; + this.options.series.pie.radius = changeRadius < 1 ? this.settings.radius - changeRadius : 0; + console.log(this.options.series.pie.radius); + // } + } + public resize() { if (this.resizeTimeoutHandle) { clearTimeout(this.resizeTimeoutHandle); @@ -698,10 +709,15 @@ export class TbFlot { if (this.plot && this.plotInited) { const width = this.$element.width(); const height = this.$element.height(); + // if (this.chartType === 'pie') { + // this.scalingPieRadius(); + // } if (width && height) { this.plot.resize(); if (this.chartType !== 'pie') { this.plot.setupGrid(); + } else { + this.scalingPieRadius(); } this.plot.draw(); } else { From 676a2b645ade72c30f537424397ac1b1f9e35344 Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Tue, 7 Jun 2022 13:26:04 +0300 Subject: [PATCH 35/37] deleteMinWidth --- .../date-range-navigator-panel.component.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/date-range-navigator/date-range-navigator-panel.component.scss b/ui-ngx/src/app/modules/home/components/widget/lib/date-range-navigator/date-range-navigator-panel.component.scss index 036398d48e..9ed640d33d 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/date-range-navigator/date-range-navigator-panel.component.scss +++ b/ui-ngx/src/app/modules/home/components/widget/lib/date-range-navigator/date-range-navigator-panel.component.scss @@ -29,7 +29,6 @@ .mat-padding { padding: 16px; - min-width: 560px; } - + } From 25f3cf640a3774ac7d5b62c05122c4a1e14d9c82 Mon Sep 17 00:00:00 2001 From: kalutkaz Date: Thu, 9 Jun 2022 13:25:19 +0300 Subject: [PATCH 36/37] updated scaling radius object --- .../home/components/widget/lib/flot-widget.ts | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.ts b/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.ts index fef3e487e9..3c93d03e84 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.ts @@ -312,7 +312,9 @@ export class TbFlot { if (this.settings.stroke) { this.options.series.pie.stroke.color = this.settings.stroke.color || '#fff'; this.options.series.pie.stroke.width = this.settings.stroke.width || 0; - this.scalingPieRadius(); + if (this.options.series.pie.stroke.width) { + this.scalingPieRadius(); + } } if (this.options.series.pie.label.show) { @@ -692,13 +694,10 @@ export class TbFlot { } private scalingPieRadius() { - // if (this.options.series.pie.stroke?.color !== '#fff' && this.options.series.pie.stroke?.width !== 0) { let scalingLine; this.ctx.width > this.ctx.height ? scalingLine = this.ctx.height : scalingLine = this.ctx.width; let changeRadius = this.options.series.pie.stroke.width / scalingLine; this.options.series.pie.radius = changeRadius < 1 ? this.settings.radius - changeRadius : 0; - console.log(this.options.series.pie.radius); - // } } public resize() { @@ -707,21 +706,21 @@ export class TbFlot { this.resizeTimeoutHandle = null; } if (this.plot && this.plotInited) { - const width = this.$element.width(); - const height = this.$element.height(); - // if (this.chartType === 'pie') { - // this.scalingPieRadius(); - // } - if (width && height) { - this.plot.resize(); - if (this.chartType !== 'pie') { - this.plot.setupGrid(); - } else { + if (this.chartType === 'pie' && this.settings.stroke?.width) { this.scalingPieRadius(); - } - this.plot.draw(); + this.redrawPlot(); } else { - this.resizeTimeoutHandle = setTimeout(this.resize.bind(this), 30); + const width = this.$element.width(); + const height = this.$element.height(); + if (width && height) { + this.plot.resize(); + if (this.chartType !== 'pie') { + this.plot.setupGrid(); + } + this.plot.draw(); + } else { + this.resizeTimeoutHandle = setTimeout(this.resize.bind(this), 30); + } } } } From fd53c24346f84d05b7114f918d7664afab4d0408 Mon Sep 17 00:00:00 2001 From: dlandiak Date: Fri, 10 Jun 2022 13:24:20 +0300 Subject: [PATCH 37/37] fixing slow queries logging --- .../server/dao/sql/query/DefaultEntityQueryRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java index f4fa052648..23b5b12d7c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/query/DefaultEntityQueryRepository.java @@ -369,7 +369,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { try { return jdbcTemplate.queryForObject(countQuery, ctx, Long.class); } finally { - queryLog.logQuery(ctx, ctx.getQuery(), System.currentTimeMillis() - startTs); + queryLog.logQuery(ctx, countQuery, System.currentTimeMillis() - startTs); } }); } @@ -481,7 +481,7 @@ public class DefaultEntityQueryRepository implements EntityQueryRepository { try { rows = jdbcTemplate.queryForList(dataQuery, ctx); } finally { - queryLog.logQuery(ctx, countQuery, System.currentTimeMillis() - startTs); + queryLog.logQuery(ctx, dataQuery, System.currentTimeMillis() - startTs); } return EntityDataAdapter.createEntityData(pageLink, selectionMapping, rows, totalElements); });