,
private authService: AuthService,
public fb: FormBuilder,
diff --git a/ui-ngx/src/app/modules/login/pages/login/reset-password.component.html b/ui-ngx/src/app/modules/login/pages/login/reset-password.component.html
index 3e1923ef37..59d03d7a9a 100644
--- a/ui-ngx/src/app/modules/login/pages/login/reset-password.component.html
+++ b/ui-ngx/src/app/modules/login/pages/login/reset-password.component.html
@@ -35,11 +35,13 @@
login.new-password
lock
+
login.new-password-again
lock
+
diff --git a/ui-ngx/src/app/shared/components/button/toggle-password.component.html b/ui-ngx/src/app/shared/components/button/toggle-password.component.html
new file mode 100644
index 0000000000..69301ce644
--- /dev/null
+++ b/ui-ngx/src/app/shared/components/button/toggle-password.component.html
@@ -0,0 +1,20 @@
+
+
diff --git a/ui-ngx/src/app/shared/components/button/toggle-password.component.ts b/ui-ngx/src/app/shared/components/button/toggle-password.component.ts
new file mode 100644
index 0000000000..225f4ba023
--- /dev/null
+++ b/ui-ngx/src/app/shared/components/button/toggle-password.component.ts
@@ -0,0 +1,44 @@
+///
+/// Copyright © 2016-2021 The Thingsboard Authors
+///
+/// Licensed under the Apache License, Version 2.0 (the "License");
+/// you may not use this file except in compliance with the License.
+/// You may obtain a copy of the License at
+///
+/// http://www.apache.org/licenses/LICENSE-2.0
+///
+/// Unless required by applicable law or agreed to in writing, software
+/// distributed under the License is distributed on an "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+/// See the License for the specific language governing permissions and
+/// limitations under the License.
+///
+
+import { AfterViewInit, Component, ElementRef } from '@angular/core';
+
+@Component({
+ selector: 'tb-toggle-password',
+ templateUrl: 'toggle-password.component.html',
+ styleUrls: [],
+})
+export class TogglePasswordComponent implements AfterViewInit {
+ showPassword = false;
+ hideToggle = false;
+
+ private input: HTMLInputElement = null;
+
+ constructor(private hostElement: ElementRef) { }
+
+ togglePassword($event: Event) {
+ $event.stopPropagation();
+ this.showPassword = !this.showPassword;
+ this.input.type = this.showPassword ? 'text' : 'password';
+ }
+
+ ngAfterViewInit() {
+ this.input = this.hostElement.nativeElement.closest('mat-form-field').querySelector('input[type="password"]');
+ if (this.input === null) {
+ this.hideToggle = true;
+ }
+ }
+}
diff --git a/ui-ngx/src/app/shared/models/ace/widget-completion.models.ts b/ui-ngx/src/app/shared/models/ace/widget-completion.models.ts
index c2facf99db..fcbdd2d1ca 100644
--- a/ui-ngx/src/app/shared/models/ace/widget-completion.models.ts
+++ b/ui-ngx/src/app/shared/models/ace/widget-completion.models.ts
@@ -471,6 +471,12 @@ export const widgetContextCompletions: TbEditorCompletions = {
description: 'RPC request persistent',
type: 'boolean',
optional: true
+ },
+ {
+ name: 'persistentPollingInterval',
+ description: 'Polling interval in milliseconds to get persistent RPC command response',
+ type: 'number',
+ optional: true
}
],
return: {
@@ -504,6 +510,12 @@ export const widgetContextCompletions: TbEditorCompletions = {
description: 'RPC request persistent',
type: 'boolean',
optional: true
+ },
+ {
+ name: 'persistentPollingInterval',
+ description: 'Polling interval in milliseconds to get persistent RPC command response',
+ type: 'number',
+ optional: true
}
],
return: {
diff --git a/ui-ngx/src/app/shared/models/entity-type.models.ts b/ui-ngx/src/app/shared/models/entity-type.models.ts
index d088cbc88a..1d54b29fa9 100644
--- a/ui-ngx/src/app/shared/models/entity-type.models.ts
+++ b/ui-ngx/src/app/shared/models/entity-type.models.ts
@@ -35,7 +35,8 @@ export enum EntityType {
WIDGET_TYPE = 'WIDGET_TYPE',
API_USAGE_STATE = 'API_USAGE_STATE',
TB_RESOURCE = 'TB_RESOURCE',
- OTA_PACKAGE = 'OTA_PACKAGE'
+ OTA_PACKAGE = 'OTA_PACKAGE',
+ RPC = 'RPC'
}
export enum AliasEntityType {
diff --git a/ui-ngx/src/app/shared/models/id/public-api.ts b/ui-ngx/src/app/shared/models/id/public-api.ts
index 534b50b0f5..3b490a6c97 100644
--- a/ui-ngx/src/app/shared/models/id/public-api.ts
+++ b/ui-ngx/src/app/shared/models/id/public-api.ts
@@ -26,6 +26,8 @@ export * from './entity-id';
export * from './entity-view-id';
export * from './event-id';
export * from './has-uuid';
+export * from './ota-package-id';
+export * from './rpc-id';
export * from './rule-chain-id';
export * from './rule-node-id';
export * from './tenant-id';
diff --git a/ui-ngx/src/app/shared/models/id/rpc-id.ts b/ui-ngx/src/app/shared/models/id/rpc-id.ts
new file mode 100644
index 0000000000..8b3d0b07fd
--- /dev/null
+++ b/ui-ngx/src/app/shared/models/id/rpc-id.ts
@@ -0,0 +1,26 @@
+///
+/// Copyright © 2016-2021 The Thingsboard Authors
+///
+/// Licensed under the Apache License, Version 2.0 (the "License");
+/// you may not use this file except in compliance with the License.
+/// You may obtain a copy of the License at
+///
+/// http://www.apache.org/licenses/LICENSE-2.0
+///
+/// Unless required by applicable law or agreed to in writing, software
+/// distributed under the License is distributed on an "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+/// See the License for the specific language governing permissions and
+/// limitations under the License.
+///
+
+import { EntityId } from '@shared/models/id/entity-id';
+import { EntityType } from '@shared/models/entity-type.models';
+
+export class RpcId implements EntityId {
+ entityType = EntityType.RPC;
+ id: string;
+ constructor(id: string) {
+ this.id = id;
+ }
+}
diff --git a/ui-ngx/src/app/shared/models/lwm2m-security-config.models.ts b/ui-ngx/src/app/shared/models/lwm2m-security-config.models.ts
index 1eba707f08..5edb95e52b 100644
--- a/ui-ngx/src/app/shared/models/lwm2m-security-config.models.ts
+++ b/ui-ngx/src/app/shared/models/lwm2m-security-config.models.ts
@@ -14,7 +14,7 @@
/// limitations under the License.
///
-export const LEN_MAX_PSK = 64;
+export const LEN_MAX_PSK = 128;
export const LEN_MAX_PRIVATE_KEY = 134;
export const LEN_MAX_PUBLIC_KEY_RPK = 182;
export const LEN_MAX_PUBLIC_KEY_X509 = 3000;
diff --git a/ui-ngx/src/app/shared/models/public-api.ts b/ui-ngx/src/app/shared/models/public-api.ts
index fddcd55033..ddfba7b381 100644
--- a/ui-ngx/src/app/shared/models/public-api.ts
+++ b/ui-ngx/src/app/shared/models/public-api.ts
@@ -41,6 +41,7 @@ export * from './oauth2.models';
export * from './queue.models';
export * from './relation.models';
export * from './resource.models';
+export * from './rpc.models';
export * from './rule-chain.models';
export * from './rule-node.models';
export * from './settings.models';
diff --git a/ui-ngx/src/app/shared/models/rpc.models.ts b/ui-ngx/src/app/shared/models/rpc.models.ts
new file mode 100644
index 0000000000..75ac132394
--- /dev/null
+++ b/ui-ngx/src/app/shared/models/rpc.models.ts
@@ -0,0 +1,40 @@
+///
+/// Copyright © 2016-2021 The Thingsboard Authors
+///
+/// Licensed under the Apache License, Version 2.0 (the "License");
+/// you may not use this file except in compliance with the License.
+/// You may obtain a copy of the License at
+///
+/// http://www.apache.org/licenses/LICENSE-2.0
+///
+/// Unless required by applicable law or agreed to in writing, software
+/// distributed under the License is distributed on an "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+/// See the License for the specific language governing permissions and
+/// limitations under the License.
+///
+
+import { TenantId } from '@shared/models/id/tenant-id';
+import { RpcId } from '@shared/models/id/rpc-id';
+import { DeviceId } from '@shared/models/id/device-id';
+
+export enum RpcStatus {
+ QUEUED = 'QUEUED',
+ DELIVERED = 'DELIVERED',
+ SUCCESSFUL = 'SUCCESSFUL',
+ TIMEOUT = 'TIMEOUT',
+ FAILED = 'FAILED'
+}
+
+export interface PersistentRpc {
+ id: RpcId;
+ createdTime: number;
+ expirationTime: number;
+ status: RpcStatus;
+ response: any;
+ request: {
+ id: string;
+ };
+ deviceId: DeviceId;
+ tenantId: TenantId;
+}
diff --git a/ui-ngx/src/app/shared/models/settings.models.ts b/ui-ngx/src/app/shared/models/settings.models.ts
index 3877488671..8b2d4aac78 100644
--- a/ui-ngx/src/app/shared/models/settings.models.ts
+++ b/ui-ngx/src/app/shared/models/settings.models.ts
@@ -27,6 +27,7 @@ export interface AdminSettings {
export declare type SmtpProtocol = 'smtp' | 'smtps';
export interface MailServerSettings {
+ showChangePassword: boolean;
mailFrom: string;
smtpProtocol: SmtpProtocol;
smtpHost: string;
@@ -34,7 +35,8 @@ export interface MailServerSettings {
timeout: number;
enableTls: boolean;
username: string;
- password: string;
+ changePassword?: boolean;
+ password?: string;
enableProxy: boolean;
proxyHost: string;
proxyPort: number;
diff --git a/ui-ngx/src/app/shared/models/time/time.models.ts b/ui-ngx/src/app/shared/models/time/time.models.ts
index c9520f09df..561f3a30fc 100644
--- a/ui-ngx/src/app/shared/models/time/time.models.ts
+++ b/ui-ngx/src/app/shared/models/time/time.models.ts
@@ -812,8 +812,15 @@ export enum TimeUnit {
DAYS = 'DAYS'
}
-export const timeUnitTranslationMap = new Map(
+export enum TimeUnitMilli {
+ MILLISECONDS = 'MILLISECONDS'
+}
+
+export type FullTimeUnit = TimeUnit | TimeUnitMilli;
+
+export const timeUnitTranslationMap = new Map(
[
+ [TimeUnitMilli.MILLISECONDS, 'timeunit.milliseconds'],
[TimeUnit.SECONDS, 'timeunit.seconds'],
[TimeUnit.MINUTES, 'timeunit.minutes'],
[TimeUnit.HOURS, 'timeunit.hours'],
diff --git a/ui-ngx/src/app/shared/shared.module.ts b/ui-ngx/src/app/shared/shared.module.ts
index f2bcdc97a4..02c5824807 100644
--- a/ui-ngx/src/app/shared/shared.module.ts
+++ b/ui-ngx/src/app/shared/shared.module.ts
@@ -144,6 +144,7 @@ import { QuickTimeIntervalComponent } from '@shared/components/time/quick-time-i
import { OtaPackageAutocompleteComponent } from '@shared/components/ota-package/ota-package-autocomplete.component';
import { MAT_DATE_LOCALE } from '@angular/material/core';
import { CopyButtonComponent } from '@shared/components/button/copy-button.component';
+import { TogglePasswordComponent } from '@shared/components/button/toggle-password.component';
@NgModule({
providers: [
@@ -242,7 +243,8 @@ import { CopyButtonComponent } from '@shared/components/button/copy-button.compo
ContactComponent,
OtaPackageAutocompleteComponent,
WidgetsBundleSearchComponent,
- CopyButtonComponent
+ CopyButtonComponent,
+ TogglePasswordComponent
],
imports: [
CommonModule,
@@ -415,7 +417,8 @@ import { CopyButtonComponent } from '@shared/components/button/copy-button.compo
ContactComponent,
OtaPackageAutocompleteComponent,
WidgetsBundleSearchComponent,
- CopyButtonComponent
+ CopyButtonComponent,
+ TogglePasswordComponent
]
})
export class SharedModule { }
diff --git a/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json b/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json
index 3b96068406..b0fc26abe2 100644
--- a/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json
+++ b/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json
@@ -74,7 +74,7 @@
"admin": {
"general": "Obecné",
"general-settings": "Obecná nastavení",
- "home-settings": "Domácí nastavení",
+ "home-settings": "Nastavení",
"outgoing-mail": "Odchozí email",
"outgoing-mail-settings": "Nastavení odchozího emailu",
"system-settings": "Systémová nastavení",
@@ -953,7 +953,7 @@
"credentials-type": "Typ přístupových údajů",
"access-token": "Přístupový token",
"access-token-required": "Přístupový token je povinný.",
- "access-token-invalid": "Délka přístupového tokenu musí být od 1 do 20 znaků.",
+ "access-token-invalid": "Délka přístupového tokenu musí být od 1 do 32 znaků.",
"rsa-key": "RSA veřejný klíč",
"rsa-key-required": "RSA veřejný klíč je povinný.",
"lwm2m-security-config": {
@@ -1229,7 +1229,7 @@
"drx": "Přerušovaný přenos (DRX)",
"edrx": "Rozšířený přerušovaný přenos (eDRX)"
},
- "edrx-cycle": "eDRX cyklus v milisekudnách",
+ "edrx-cycle": "eDRX cyklus",
"edrx-cycle-required": "eDRX cyklus je povinný.",
"edrx-cycle-pattern": "eDRX cyklus musí být kladné číslo.",
"lwm2m": {
diff --git a/ui-ngx/src/assets/locale/locale.constant-de_DE.json b/ui-ngx/src/assets/locale/locale.constant-de_DE.json
index 0e303b260b..eee8d89fd7 100644
--- a/ui-ngx/src/assets/locale/locale.constant-de_DE.json
+++ b/ui-ngx/src/assets/locale/locale.constant-de_DE.json
@@ -686,7 +686,7 @@
"credentials-type": "Art der Zugangsdaten",
"access-token": "Zugangs-Token",
"access-token-required": "Zugangs-Token ist erforderlich.",
- "access-token-invalid": "Die Länge des Zugangs-Tokens muss zwischen 1 und 20 Zeichen betragen.",
+ "access-token-invalid": "Die Länge des Zugangs-Tokens muss zwischen 1 und 32 Zeichen betragen.",
"rsa-key": "RSA öffentlicher Schlüssel",
"rsa-key-required": "RSA öffentlicher Schlüssel ist erforderlich.",
"secret": "Geheimnis",
@@ -803,7 +803,7 @@
"rulechain-templates": "Regelkettenvorlagen",
"rulechains": "Rand Regelketten",
"search": "Kanten durchsuchen",
- "selected-edges": "{Anzahl, Plural, 1 {1 Kante} andere {# Kanten}} ausgewählt",
+ "selected-edges": "{count, plural, 1 {1 Rand} other {# Rand} } ausgewählt",
"any-edge": "Beliebige Kante",
"no-edge-types-matching": "Es wurden keine Kantentypen gefunden, die mit '{{entitySubtype}}' übereinstimmen.",
"edge-type-list-empty": "Keine Kantentypen ausgewählt.",
@@ -1452,7 +1452,7 @@
"unset-auto-assign-to-edge-text": "Nach der Bestätigung wird die Kantenregelkette bei der Erstellung nicht mehr automatisch den Kanten zugewiesen.",
"edge-template-root": "Vorlagenstamm",
"search": "Suchen Sie nach Regelketten",
- "selected-rulechains": "{count, plural, 1 {1 Regelkette} andere {# Regelketten}} ausgewählt",
+ "selected-rulechains": "{count, plural, 1 {1 Regelkette} other {# Regelketten} } ausgewählt",
"open-rulechain": "Regelkette öffnen",
"assign-to-edge": "Rand zuweisen",
"edge-rulechain": "Kantenregelkette"
diff --git a/ui-ngx/src/assets/locale/locale.constant-el_GR.json b/ui-ngx/src/assets/locale/locale.constant-el_GR.json
index d92b6e7884..153621e69a 100644
--- a/ui-ngx/src/assets/locale/locale.constant-el_GR.json
+++ b/ui-ngx/src/assets/locale/locale.constant-el_GR.json
@@ -798,7 +798,7 @@
"credentials-type": "Τύπος διαπιστευτηρίων",
"access-token": "Διακριτικό πρόσβασης",
"access-token-required": "Απαιτείται διακριτικό πρόσβασης.",
- "access-token-invalid": "Access token length must be from 1 to 20 characters.",
+ "access-token-invalid": "Access token length must be from 1 to 32 characters.",
"rsa-key": "RSA public key",
"rsa-key-required": "Απαιτείται RSA public key.",
"secret": "Secret",
diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json
index 854d99f603..211a1b5f78 100644
--- a/ui-ngx/src/assets/locale/locale.constant-en_US.json
+++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json
@@ -104,6 +104,7 @@
"proxy-port-range": "Proxy port should be in a range from 1 to 65535.",
"proxy-user": "Proxy user",
"proxy-password": "Proxy password",
+ "change-password": "Change password",
"send-test-mail": "Send test mail",
"sms-provider": "SMS provider",
"sms-provider-settings": "SMS provider settings",
@@ -956,7 +957,7 @@
"credentials-type": "Credentials type",
"access-token": "Access token",
"access-token-required": "Access token is required.",
- "access-token-invalid": "Access token length must be from 1 to 20 characters.",
+ "access-token-invalid": "Access token length must be from 1 to 32 characters.",
"rsa-key": "RSA public key",
"rsa-key-required": "RSA public key is required.",
"lwm2m-security-config": {
@@ -1232,15 +1233,18 @@
"drx": "Discontinuous Reception (DRX)",
"edrx": "Extended Discontinuous Reception (eDRX)"
},
- "edrx-cycle": "eDRX cycle in milliseconds",
+ "edrx-cycle": "eDRX cycle",
"edrx-cycle-required": "eDRX cycle is required.",
"edrx-cycle-pattern": "eDRX cycle must be a positive integer.",
- "paging-transmission-window": "Paging Transmission Window in milliseconds",
+ "edrx-cycle-min": "Minimum number of eDRX cycle is {{ min }} seconds.",
+ "paging-transmission-window": "Paging Transmission Window",
"paging-transmission-window-required": "Paging transmission window is required.",
"paging-transmission-window-pattern": "Paging transmission window must be a positive integer.",
- "psm-activity-timer": "PSM Activity Timer in milliseconds",
+ "paging-transmission-window-min": "Minimum number ofpPaging transmission window is {{ min }} seconds.",
+ "psm-activity-timer": "PSM Activity Timer",
"psm-activity-timer-required": "PSM activity timer is required.",
"psm-activity-timer-pattern": "PSM activity timer must be a positive integer.",
+ "psm-activity-timer-min": "Minimum number of PSM activity timer is {{ min }} seconds.",
"lwm2m": {
"object-list": "Object list",
"object-list-empty": "No objects selected.",
@@ -2757,6 +2761,7 @@
}
},
"timeunit": {
+ "milliseconds": "Milliseconds",
"seconds": "Seconds",
"minutes": "Minutes",
"hours": "Hours",
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 d762dd17a6..a782298bdc 100644
--- a/ui-ngx/src/assets/locale/locale.constant-es_ES.json
+++ b/ui-ngx/src/assets/locale/locale.constant-es_ES.json
@@ -413,8 +413,8 @@
"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-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."
},
"attribute": {
@@ -893,7 +893,7 @@
"credentials-type": "Tipo de credencial",
"access-token": "Tóken de acceso",
"access-token-required": "Access token requerido.",
- "access-token-invalid": "Access token debe tener entre 1 a 20 caracteres.",
+ "access-token-invalid": "Access token debe tener entre 1 a 32 caracteres.",
"rsa-key": "Clave pública RSA",
"rsa-key-required": "Clave pública RSA requerida.",
"client-id": "ID Cliente",
@@ -950,7 +950,7 @@
"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-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."
},
"device-profile": {
@@ -1123,7 +1123,7 @@
"delete": "Eliminar borde",
"delete-edge-title": "¿Está seguro de que desea eliminar el borde '{{edgeName}}'?",
"delete-edge-text": "Tenga cuidado, después de la confirmación, el borde y todos los datos relacionados serán irrecuperables",
- "delete-edges-title": "¿Está seguro de que desea edge {count, plural, 1 {1 borde} other {# bordes}}?",
+ "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",
@@ -1156,7 +1156,7 @@
"unassign-from-customer": "Anular asignación del cliente",
"unassign-edge-title": "¿Está seguro de que desea desasignar el borde '{{edgeName}}'?",
"unassign-edge-text": "Después de la confirmación, el borde quedará sin asignar y el cliente no podrá acceder a él",
- "unassign-edges-title": "¿Está seguro de que desea anular la asignación de {count, plural, 1 {1 borde} other {# bordes}}?",
+ "unassign-edges-title": "¿Está seguro de que desea anular la asignación de {count, plural, 1 {1 borde} other {# bordes} }?",
"unassign-edges-text": "Después de la confirmación de todos los bordes seleccionados, se anulará la asignación y el cliente no podrá acceder a ellos.",
"make-public": "Hacer público el borde",
"make-public-edge-title": "¿Estás seguro de que quieres hacer público el edge '{{edgeName}}'?",
@@ -1189,14 +1189,14 @@
"rulechain-templates": "Plantillas, de cadena de reglas",
"rulechains": "Cadenas de regla de borde",
"search": "Bordes de búsqueda",
- "selected-edges": "{count, plural, 1 {1 borde} other {# bordes}} seleccionados",
+ "selected-edges": "{count, plural, 1 {1 borde} other {# bordes} } seleccionadas",
"any-edge": "Cualquier bordee",
"no-edge-types-matching": "No se encontraron tipos de aristas que coincidan con '{{entitySubtype}}'.",
"edge-type-list-empty": "No se seleccionó ningún tipo de borde.",
"edge-types": "Tipos de bordes",
"enter-edge-type": "Ingrese el tipo de borde",
"deployed": "Desplegada",
- "pending": "Pending",
+ "pending": "Pendiente",
"downlinks": "Enlaces descendentes",
"no-downlinks-prompt": "No se encontraron enlaces descendentes",
"sync-process-started-successfully": "¡El proceso de sincronización se inició correctamente!",
@@ -1356,7 +1356,7 @@
"type-api-usage-state": "Estado de uso de la API",
"type-edge": "Borde",
"type-edges": "Bordes",
- "list-of-edges": "{cuenta, plural, 1 {Un borde} other {Lista de # bordes}}",
+ "list-of-edges": "{count, plural, 1 {Un borde} other {Lista de # bordes} }",
"edge-name-starts-with": "Bordes cuyos nombres comienzan con '{{prefijo}}'"
},
"entity-field": {
@@ -1481,9 +1481,9 @@
"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}}'?",
"unassign-entity-view-from-edge-text": "Después de la confirmación, la vista de entidad quedará sin asignar y el borde no podrá acceder a ella",
- "unassign-entity-views-from-edge-action-title": "Anular asignación {recuento, plural, 1 {1 vista de entidad} otras {# vistas de entidad}} del borde",
+ "unassign-entity-views-from-edge-action-title": "Anular asignación {count, plural, 1 {1 vista de entidad} other {# vistas de entidad} } del borde",
"unassign-entity-view-from-edge": "Anular asignación de vista de entidad",
- "unassign-entity-views-from-edge-title": "¿Está seguro de que desea desasignar {count, plural, 1 {1 vista de entidad} other {# vistas de entidad}}?",
+ "unassign-entity-views-from-edge-title": "¿Está seguro de que desea desasignar {count, plural, 1 {1 vista de entidad} other {# vistas de entidad} }?",
"unassign-entity-views-from-edge-text": "Después de la confirmación, todas las vistas de entidad seleccionadas no serán asignadas y el borde no podrá acceder a ellas"
},
"event": {
@@ -2074,9 +2074,9 @@
"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 '{{ruleChainTitle}}'?",
+ "unassign-rulechain-title": "¿Está seguro de que desea desasignar la cadena de reglas '{{ruleChainName}}'?",
"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-action-title": "Anular asignación {count, plural, 1 {1 cadena de reglas} other {# cadenas de reglas} } des bordes",
"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",
diff --git a/ui-ngx/src/assets/locale/locale.constant-fa_IR.json b/ui-ngx/src/assets/locale/locale.constant-fa_IR.json
index 90a10f765c..8b74ce6f79 100644
--- a/ui-ngx/src/assets/locale/locale.constant-fa_IR.json
+++ b/ui-ngx/src/assets/locale/locale.constant-fa_IR.json
@@ -640,7 +640,7 @@
"credentials-type": "نوع اعتبارنامه ها",
"access-token": "شناسه دسترسي",
"access-token-required": ".شناسه دسترسي مورد نياز است",
- "access-token-invalid": ".طول شناسه دسترسي بايد از 1 تا 20 حرف باشد",
+ "access-token-invalid": ".طول شناسه دسترسي بايد از 1 تا 32 حرف باشد",
"rsa-key": "RSA کليد عمومي",
"rsa-key-required": ".مورد نياز است RSA کليد عمومي",
"secret": "محرمانه",
diff --git a/ui-ngx/src/assets/locale/locale.constant-fr_FR.json b/ui-ngx/src/assets/locale/locale.constant-fr_FR.json
index 00f9c95b83..facf0f8534 100644
--- a/ui-ngx/src/assets/locale/locale.constant-fr_FR.json
+++ b/ui-ngx/src/assets/locale/locale.constant-fr_FR.json
@@ -639,7 +639,7 @@
},
"device": {
"access-token": "Jeton d'accès",
- "access-token-invalid": "La longueur du jeton d'accès doit être comprise entre 1 et 20 caractéres.",
+ "access-token-invalid": "La longueur du jeton d'accès doit être comprise entre 1 et 32 caractéres.",
"access-token-required": "Le jeton d'accès est requis.",
"accessTokenCopiedMessage": "Le jeton d'accès au dispositif a été copié dans le presse-papier",
"add": "Ajouter un dispositif",
@@ -736,7 +736,7 @@
"assign-device-to-edge-text":"Veuillez sélectionner la bordure pour attribuer le ou les dispositifs",
"unassign-device-from-edge-title": "Êtes-vous sûr de vouloir annuler l'affection du dispositif {{deviceName}} '?",
"unassign-device-from-edge-text": "Après la confirmation, dispositif sera non attribué et ne sera pas accessible a la bordure.",
- "unassign-devices-from-edge-title": "Voulez-vous vraiment annuler l'affectation de {count, plural, 1 {1 device} other {# devices}}?",
+ "unassign-devices-from-edge-title": "Voulez-vous vraiment annuler l'affectation de {count, plural, 1 {1 device} other {# devices} }?",
"unassign-devices-from-edge-text": "Après la confirmation, tous les dispositifs sélectionnés ne seront pas attribues et ne seront pas accessibles par la bordure."
},
"dialog": {
@@ -755,7 +755,7 @@
"delete": "Supprimer la bordure",
"delete-edge-title": "Êtes-vous sûr de vouloir supprimer la bordure '{{edgeName}}'?",
"delete-edge-text": "Faites attention, après la confirmation, la bordure et toutes les données associées deviendront irrécupérables",
- "delete-edges-title": "Êtes-vous sûr de vouloir supprimer {count, plural, 1 {1 bordure} other {# bordure}}?",
+ "delete-edges-title": "Êtes-vous sûr de vouloir supprimer {count, plural, 1 {1 bordure} other {# bordure} }?",
"delete-edges-text": "Faites attention, après la confirmation, tous les bordures sélectionnés seront supprimés et toutes les données associées deviendront irrécupérables.",
"name": "Nom",
"name-starts-with": "Le nom du bord commence par",
@@ -788,7 +788,7 @@
"unassign-from-customer": "Retirer du client",
"unassign-edge-title": "Êtes-vous sûr de vouloir annuler l'affection du dispositif {{edgeName}}",
"unassign-edge-text": "Après la confirmation, le dispositif ne sera pas attribué et ne sera pas accessible au client",
- "unassign-edges-title": "Voulez-vous vraiment annuler l'attribution de {count, plural, 1 {1 bordure} other {# bordures}}?",
+ "unassign-edges-title": "Voulez-vous vraiment annuler l'attribution de {count, plural, 1 {1 bordure} other {# bordures} }?",
"unassign-edges-text": "Après la confirmation, tous les bordures sélectionnés ne seront plus attribués et ne seront pas accessibles par le client.",
"make-public": "Make edge public",
"make-public-edge-title": "Are you sure you want to make the edge '{{edgeName}}' public?",
@@ -821,7 +821,7 @@
"rulechain-templates": "Modèles de chaîne de règles",
"rulechains": "Chaînes de règles de la bordure",
"search": "Rechercher les bords",
- "selected-edges": "{count, plural, 1 {1 edge} other {# bords}} sélectionné",
+ "selected-edges": "{count, plural, 1 {1 bordure} other {# bords} } sélectionné",
"any-edge": "Tout bord",
"no-edge-types-matching": "Aucun type d'arête correspondant à \"{{entitySubtype}}\" n'a été trouvé.",
"edge-type-list-empty": "Aucun type d'arête sélectionné.",
@@ -1479,9 +1479,9 @@
"delete-rulechains": "Supprimer une chaînes de règles",
"unassign-rulechain": "Retirer chaîne de règles",
"unassign-rulechains": "Retirer chaînes de règles",
- "unassign-rulechain-title": "AÊtes-vous sûr de vouloir retirer l'attribution de chaînes de règles '{{ruleChainTitle}}'?",
+ "unassign-rulechain-title": "AÊtes-vous sûr de vouloir retirer l'attribution de chaînes de règles '{{ruleChainName}}'?",
"unassign-rulechain-from-edge-text": "Après la confirmation, l'actif sera non attribué et ne sera pas accessible a la bordure.",
- "unassign-rulechains-from-edge-action-title": "Retirer {count, plural, 1 {1 chaîne de règles} other {# chaînes de règles}} de la bordure",
+ "unassign-rulechains-from-edge-action-title": "Retirer {count, plural, 1 {1 chaîne de règles} other {# chaînes de règles} } de la bordure",
"unassign-rulechains-from-edge-text": "Après la confirmation, tous les chaînes de règles sélectionnés ne seront pas attribués et ne seront pas accessibles a la bordure.",
"assign-rulechain-to-edge-title": "Attribuer les chaînes de règles a la bordure",
"assign-rulechain-to-edge-text": "Veuillez sélectionner la bordure pour attribuer le ou les chaînes de règles",
@@ -1497,11 +1497,11 @@
"unset-auto-assign-to-edge-text": "Après la confirmation, la chaîne de règles d'arêtes ne sera plus automatiquement affectée aux arêtes lors de la création.",
"edge-template-root": "Racine du modèle",
"search": "Rechercher des chaînes de règles",
- "selected-rulechains": "{count, plural, 1 {1 rule chain} other {# rule chains}} sélectionné",
+ "selected-rulechains": "{count, plural, 1 {1 rule chain} other {# rule chains} } sélectionné",
"open-rulechain": "Chaîne de règles ouverte",
- "assign-to-edge": "Attribuer à Edge",
- "edge-rulechain": "Chaîne de règles Edge",
- "unassign-rulechains-from-edge-title": "Voulez-vous vraiment annuler l'attribution de {count, plural, 1 {1 rulechain} other {# rulechains}}?"
+ "assign-to-edge": "Attribuer à Bordure",
+ "edge-rulechain": "Chaîne de règles Bordure",
+ "unassign-rulechains-from-edge-title": "Voulez-vous vraiment annuler l'attribution de {count, plural, 1 {1 rulechain} other {# rulechains} }?"
},
"rulenode": {
"add": "Ajouter un noeud de règle",
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 4050e48ad7..2e5ace98a7 100644
--- a/ui-ngx/src/assets/locale/locale.constant-it_IT.json
+++ b/ui-ngx/src/assets/locale/locale.constant-it_IT.json
@@ -665,7 +665,7 @@
"credentials-type": "Tipo credenziali",
"access-token": "Token di accesso",
"access-token-required": "Token di accesso obbligatorio.",
- "access-token-invalid": "Il token di accesso deve avere una lunghezza compresa tra 1 e 20 caratteri.",
+ "access-token-invalid": "Il token di accesso deve avere una lunghezza compresa tra 1 e 32 caratteri.",
"rsa-key": "Chiave pubblica RSA",
"rsa-key-required": "Chiave pubblica RSA obbligatoria.",
"secret": "Secret",
diff --git a/ui-ngx/src/assets/locale/locale.constant-ja_JA.json b/ui-ngx/src/assets/locale/locale.constant-ja_JA.json
index f3696e9a23..4b9da9e41f 100644
--- a/ui-ngx/src/assets/locale/locale.constant-ja_JA.json
+++ b/ui-ngx/src/assets/locale/locale.constant-ja_JA.json
@@ -623,7 +623,7 @@
"credentials-type": "資格情報タイプ",
"access-token": "アクセストークン",
"access-token-required": "アクセストークンが必要です。",
- "access-token-invalid": "アクセストークンの長さは、1〜20文字でなければなりません。",
+ "access-token-invalid": "アクセストークンの長さは、1〜32文字でなければなりません。",
"rsa-key": "RSA公開鍵",
"rsa-key-required": "RSA公開鍵が必要です。",
"secret": "秘密",
diff --git a/ui-ngx/src/assets/locale/locale.constant-ka_GE.json b/ui-ngx/src/assets/locale/locale.constant-ka_GE.json
index 6f5ba73674..f18d62cad2 100644
--- a/ui-ngx/src/assets/locale/locale.constant-ka_GE.json
+++ b/ui-ngx/src/assets/locale/locale.constant-ka_GE.json
@@ -683,7 +683,7 @@
"credentials-type": "მომხმარებლის ჩანაწერი",
"access-token": "ტოკენი",
"access-token-required": "ტოკენი სავალდებულოა",
- "access-token-invalid": "ტოკენის სიგრძე უნდა იყოს 1 დან 20 სიმბოლომდე",
+ "access-token-invalid": "ტოკენის სიგრძე უნდა იყოს 1 დან 32 სიმბოლომდე",
"rsa-key": "ღია გასაღები RSA",
"rsa-key-required": "ღია გასაღები RSA აუცილებელია",
"secret": "საიდუმლო",
diff --git a/ui-ngx/src/assets/locale/locale.constant-ko_KR.json b/ui-ngx/src/assets/locale/locale.constant-ko_KR.json
index f966203fbf..56ae7d0fc3 100644
--- a/ui-ngx/src/assets/locale/locale.constant-ko_KR.json
+++ b/ui-ngx/src/assets/locale/locale.constant-ko_KR.json
@@ -869,7 +869,7 @@
"credentials-type": "크리덴셜 타입",
"access-token": "억세스 토큰",
"access-token-required": "액세스 토큰을 입력하세요.",
- "access-token-invalid": "액세스 토큰 길이는 1 - 20 자 여야합니다.",
+ "access-token-invalid": "액세스 토큰 길이는 1 - 32 자 여야합니다.",
"rsa-key": "RSA public key",
"rsa-key-required": "RSA public key 를 입력하세요.",
"client-id": "클라이언트 ID",
diff --git a/ui-ngx/src/assets/locale/locale.constant-lv_LV.json b/ui-ngx/src/assets/locale/locale.constant-lv_LV.json
index c2b7ce6e79..7daa8e5802 100644
--- a/ui-ngx/src/assets/locale/locale.constant-lv_LV.json
+++ b/ui-ngx/src/assets/locale/locale.constant-lv_LV.json
@@ -641,7 +641,7 @@
"credentials-type": "Akreditācijas datu tips",
"access-token": "Piekļuves tokens",
"access-token-required": "Piekļuves tokens ir nepieciešams.",
- "access-token-invalid": "Piekļuves tokena garumam ir jābūt no 1 līdz 20 rakstzīmēm.",
+ "access-token-invalid": "Piekļuves tokena garumam ir jābūt no 1 līdz 32 rakstzīmēm.",
"rsa-key": "RSA publiskā atslēga",
"rsa-key-required": "RSA publiskā atslēga ir nepieciešama.",
"secret": "Noslēpums",
diff --git a/ui-ngx/src/assets/locale/locale.constant-pt_BR.json b/ui-ngx/src/assets/locale/locale.constant-pt_BR.json
index 7f5c7ce239..7c8e1e7449 100644
--- a/ui-ngx/src/assets/locale/locale.constant-pt_BR.json
+++ b/ui-ngx/src/assets/locale/locale.constant-pt_BR.json
@@ -715,7 +715,7 @@
"credentials-type": "Tipo de credencial",
"access-token": "Token de acesso",
"access-token-required": "O token de acesso é obrigatório.",
- "access-token-invalid": "O token de acesso deve ter de 1 a 20 caracteres.",
+ "access-token-invalid": "O token de acesso deve ter de 1 a 32 caracteres.",
"rsa-key": "Chave pública RSA",
"rsa-key-required": "A chave pública RSA é obrigatória.",
"secret": "Segredo",
diff --git a/ui-ngx/src/assets/locale/locale.constant-ro_RO.json b/ui-ngx/src/assets/locale/locale.constant-ro_RO.json
index 80c9941f2a..9e86bd1a84 100644
--- a/ui-ngx/src/assets/locale/locale.constant-ro_RO.json
+++ b/ui-ngx/src/assets/locale/locale.constant-ro_RO.json
@@ -674,7 +674,7 @@
"credentials-type": "Tip Credențiale",
"access-token": "Token Acces",
"access-token-required": "Tokenul de acces este necesar",
- "access-token-invalid": "Dimensiunea tokenului de acces trebuie să fie de 1-20 caractere",
+ "access-token-invalid": "Dimensiunea tokenului de acces trebuie să fie de 1-32 caractere",
"rsa-key": "Cheie RSA publică",
"rsa-key-required": "Cheia RSA publică key este necesară",
"secret": "Cod Secret",
@@ -1797,4 +1797,4 @@
"language": {
"language": "Limba"
}
-}
\ No newline at end of file
+}
diff --git a/ui-ngx/src/assets/locale/locale.constant-ru_RU.json b/ui-ngx/src/assets/locale/locale.constant-ru_RU.json
index ba1a8e1a7b..9ba75064db 100644
--- a/ui-ngx/src/assets/locale/locale.constant-ru_RU.json
+++ b/ui-ngx/src/assets/locale/locale.constant-ru_RU.json
@@ -677,7 +677,7 @@
"credentials-type": "Тип учетных данных",
"access-token": "Токен",
"access-token-required": "Токен обязателен.",
- "access-token-invalid": "Длина токена должна быть от 1 до 20 символов.",
+ "access-token-invalid": "Длина токена должна быть от 1 до 32 символов.",
"rsa-key": "Открытый ключ RSA",
"rsa-key-required": "Открытый ключ RSA обязателен.",
"secret": "Секрет",
diff --git a/ui-ngx/src/assets/locale/locale.constant-sl_SI.json b/ui-ngx/src/assets/locale/locale.constant-sl_SI.json
index e57ee78e87..8016988f8d 100644
--- a/ui-ngx/src/assets/locale/locale.constant-sl_SI.json
+++ b/ui-ngx/src/assets/locale/locale.constant-sl_SI.json
@@ -869,7 +869,7 @@
"credentials-type": "Vrsta poverilnic",
"access-token": "Dostopni žeton",
"access-token-required": "Zahtevan je žeton za dostop.",
- "access-token-invalid": "Dolžina žetona za dostop mora biti od 1 do 20 znakov.",
+ "access-token-invalid": "Dolžina žetona za dostop mora biti od 1 do 32 znakov.",
"rsa-key": "Javni ključ RSA",
"rsa-key-required": "Potreben je javni ključ RSA.",
"client-id": "Client ID",
diff --git a/ui-ngx/src/assets/locale/locale.constant-tr_TR.json b/ui-ngx/src/assets/locale/locale.constant-tr_TR.json
index dfe3dbbaef..bb27e3b89e 100644
--- a/ui-ngx/src/assets/locale/locale.constant-tr_TR.json
+++ b/ui-ngx/src/assets/locale/locale.constant-tr_TR.json
@@ -667,7 +667,7 @@
"credentials-type": "Kimlik Bilgi Türü",
"access-token": "Erişim şifresi",
"access-token-required": "Erişim şifresi gerekli.",
- "access-token-invalid": "Erişim şifresi uzunluğu 1 ile 20 karakter arasında olmalıdır.",
+ "access-token-invalid": "Erişim şifresi uzunluğu 1 ile 32 karakter arasında olmalıdır.",
"rsa-key": "RSA açık anahtarı",
"rsa-key-required": "RSA açık anahtarı gerekli.",
"secret": "Secret",
diff --git a/ui-ngx/src/assets/locale/locale.constant-uk_UA.json b/ui-ngx/src/assets/locale/locale.constant-uk_UA.json
index 5d4a917335..23bb56cf29 100644
--- a/ui-ngx/src/assets/locale/locale.constant-uk_UA.json
+++ b/ui-ngx/src/assets/locale/locale.constant-uk_UA.json
@@ -794,7 +794,7 @@
"credentials-type": "Тип авторизаційних даних",
"access-token": "Маркер доступу",
"access-token-required": "Необхідно вказати маркер доступу.",
- "access-token-invalid": "Маркер доступу має бути від 1 до 20 символів.",
+ "access-token-invalid": "Маркер доступу має бути від 1 до 32 символів.",
"rsa-key": "Публічний ключ RSA",
"rsa-key-required": "Необхідно вказати публічний ключ RSA.",
"secret": "Секрет",
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 cc23f5fc78..cb135a221a 100644
--- a/ui-ngx/src/assets/locale/locale.constant-zh_CN.json
+++ b/ui-ngx/src/assets/locale/locale.constant-zh_CN.json
@@ -996,7 +996,7 @@
},
"device": {
"access-token": "访问令牌",
- "access-token-invalid": "访问令牌长度必须为1到20个字符。",
+ "access-token-invalid": "访问令牌长度必须为1到32个字符。",
"access-token-required": "访问令牌必填",
"accessTokenCopiedMessage": "设备访问令牌已复制到剪贴板",
"add": "添加设备",
diff --git a/ui-ngx/src/assets/locale/locale.constant-zh_TW.json b/ui-ngx/src/assets/locale/locale.constant-zh_TW.json
index bc8374a1c1..59bceb7b26 100644
--- a/ui-ngx/src/assets/locale/locale.constant-zh_TW.json
+++ b/ui-ngx/src/assets/locale/locale.constant-zh_TW.json
@@ -624,7 +624,7 @@
"credentials-type": "憑據類型",
"access-token": "存取令牌",
"access-token-required": "需要存取令牌",
- "access-token-invalid": "存取令牌長度必須為1到20個字符。",
+ "access-token-invalid": "存取令牌長度必須為1到32個字符。",
"rsa-key": "RSA公鑰",
"rsa-key-required": "需要RSA公鑰",
"secret": "密鑰",