diff --git a/ui-ngx/src/app/core/utils.ts b/ui-ngx/src/app/core/utils.ts index b810689b69..012a64ea45 100644 --- a/ui-ngx/src/app/core/utils.ts +++ b/ui-ngx/src/app/core/utils.ts @@ -26,6 +26,7 @@ import { TranslateService } from '@ngx-translate/core'; import { serverErrorCodesTranslations } from '@shared/models/constants'; const varsRegex = /\${([^}]*)}/g; +export const noLeadTrailSpacesRegex: RegExp = /^(?! )[A-Za-z0-9 ]*(? { const scrollSubject = new Subject(); diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector-template-dialog.ts b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector-template-dialog.ts index 63f492519c..6ee2a7103f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector-template-dialog.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector-template-dialog.ts @@ -44,7 +44,7 @@ export class GatewayServiceRPCConnectorTemplateDialogComponent extends DialogCom super(store, router, dialogRef); this.config = this.data.config; this.templates = this.data.templates; - this.templateNameCtrl = this.fb.control('', [Validators.required]) + this.templateNameCtrl = this.fb.control('', [Validators.required]); } validateDuplicateName(c: UntypedFormControl) { @@ -57,6 +57,7 @@ export class GatewayServiceRPCConnectorTemplateDialogComponent extends DialogCom } save(): void { - this.dialogRef.close(this.templateNameCtrl.value); + this.templateNameCtrl.setValue(this.templateNameCtrl.value.trim()); + if (this.templateNameCtrl.valid) this.dialogRef.close(this.templateNameCtrl.value); } } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector.component.html index c706244c31..b5dbf3b822 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector.component.html @@ -22,7 +22,7 @@ - {{ 'gateway.rpc.method-filter' | translate }} + {{ 'gateway.rpc.methodFilter' | translate }} @@ -65,11 +65,15 @@ {{ 'gateway.rpc.functionCode' | translate }} - {{ code }} + {{ modbusCodesTranslate.get(code) | translate}} + + {{ 'gateway.rpc.value' | translate }} + +
{{ 'gateway.rpc.address' | translate }} @@ -233,11 +237,7 @@ {{ 'gateway.rpc.encoding' | translate }} - - - {{ encoding }} - - + {{ 'gateway.rpc.withResponse' | translate }} @@ -269,12 +269,15 @@ + + {{ 'gateway.rpc.withResponse' | translate }} +
{{ 'gateway.rpc.oids' | translate }}*
- +
- {{ 'gateway.rpc.HTTPMethod' | translate }} - + {{ 'gateway.rpc.httpMethod' | translate }} + {{ method }} @@ -476,7 +479,7 @@ - + {{ 'gateway.rpc.method' | translate }} @@ -485,9 +488,8 @@
- + - - {{'dsadas'}} {{ 'gateway.statistics.command' | translate }} diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector.component.scss b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector.component.scss index 65abdb50b3..0cd3c5c737 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector.component.scss +++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector.component.scss @@ -48,9 +48,9 @@ ::ng-deep .mat-mdc-form-field-subscript-wrapper { display: none; } - ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__leading, - ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__notch, - ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__trailing { + ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--invalid) .mdc-notched-outline__leading, + ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--invalid) .mdc-notched-outline__notch, + ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--invalid) .mdc-notched-outline__trailing { border-color: #e0e0e0; } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector.component.ts index 7a2f91907e..0cfc3d095b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector.component.ts @@ -34,7 +34,7 @@ import { CANByteOrders, ConnectorType, GatewayConnectorDefaultTypesTranslates, - HTTPMethods, + HTTPMethods, ModbusCodesTranslate, ModbusCommandTypes, RPCCommand, RPCTemplateConfig, @@ -50,7 +50,7 @@ import { JsonObjectEditDialogData } from '@shared/components/dialog/json-object-edit-dialog.component'; import { jsonRequired } from '@shared/components/json-object-edit.component'; -import { deepClone } from '@core/utils'; +import { deepClone, noLeadTrailSpacesRegex } from '@core/utils'; @Component({ selector: 'tb-gateway-service-rpc-connector', @@ -97,6 +97,7 @@ export class GatewayServiceRPCConnectorComponent implements OnInit, ControlValue SocketMethodProcessingsTranslates = SocketMethodProcessingsTranslates; SNMPMethodsTranslations = SNMPMethodsTranslations; gatewayConnectorDefaultTypesTranslates = GatewayConnectorDefaultTypesTranslates; + modbusCodesTranslate = ModbusCodesTranslate; urlPattern = new RegExp( '^(https?:\\/\\/)?' + // protocol @@ -139,7 +140,7 @@ export class GatewayServiceRPCConnectorComponent implements OnInit, ControlValue break; } if (this.commandForm.valid) { - this.propagateChange({...this.commandForm.value,...value}); + this.propagateChange({...this.commandForm.value, ...value}); } }) } @@ -150,126 +151,138 @@ export class GatewayServiceRPCConnectorComponent implements OnInit, ControlValue switch (type) { case ConnectorType.MQTT: formGroup = this.fb.group({ - methodFilter: [null, [Validators.required]], - requestTopicExpression: [null, [Validators.required]], - responseTopicExpression: [null, []], + methodFilter: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], + requestTopicExpression: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], + responseTopicExpression: [null, [Validators.pattern(noLeadTrailSpacesRegex)]], responseTimeout: [null, [Validators.min(10), Validators.pattern("^[0-9]*$")]], - valueExpression: [null, [Validators.required]], + valueExpression: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], }) break; case ConnectorType.MODBUS: formGroup = this.fb.group({ - tag: [null, [Validators.required]], + tag: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], type: [null, [Validators.required]], functionCode: [null, [Validators.required]], + value: [null, []], address: [null, [Validators.required, Validators.min(0), Validators.pattern("^[0-9]*$")]], objectsCount: [null, [Validators.required, Validators.min(0), Validators.pattern("^[0-9]*$")]] }) + const valueForm = formGroup.get('value'); + formGroup.get('functionCode').valueChanges.subscribe(value => { + if (value > 4) { + valueForm.addValidators([Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]); + } else { + valueForm.clearValidators(); + valueForm.setValue(null); + } + valueForm.updateValueAndValidity(); + }) break; case ConnectorType.BACNET: formGroup = this.fb.group({ - method: [null, [Validators.required]], - requestType: [null, [Validators.required]], + method: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], + requestType: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], requestTimeout: [null, [Validators.required, Validators.min(10), Validators.pattern("^[0-9]*$")]], objectType: [null, []], identifier: [null, [Validators.required, Validators.min(1), Validators.pattern("^[0-9]*$")]], - propertyId: [null, [Validators.required]] + propertyId: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]] }) break; case ConnectorType.BLE: formGroup = this.fb.group({ - methodRPC: [null, [Validators.required]], - characteristicUUID: [null, [Validators.required]], + methodRPC: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], + characteristicUUID: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], methodProcessing: [null, [Validators.required]], withResponse: [false, []] }) break; case ConnectorType.CAN: formGroup = this.fb.group({ - method: [null, [Validators.required]], + method: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], nodeID: [null, [Validators.required, Validators.min(0), Validators.pattern("^[0-9]*$")]], isExtendedID: [false, []], isFD: [false, []], bitrateSwitch: [false, []], dataLength: [null, [Validators.min(1), Validators.pattern("^[0-9]*$")]], dataByteorder: [null, []], - dataBefore: [null, []], - dataAfter: [null, []], - dataInHEX: [null, []], - dataExpression: [null, []] + dataBefore: [null, [Validators.pattern(noLeadTrailSpacesRegex), Validators.pattern(/^[0-9A-Fa-f]+$/)]], + dataAfter: [null, [Validators.pattern(noLeadTrailSpacesRegex), Validators.pattern(/^[0-9A-Fa-f]+$/)]], + dataInHEX: [null, [Validators.pattern(noLeadTrailSpacesRegex), Validators.pattern(/^[0-9A-Fa-f]+$/)]], + dataExpression: [null, [Validators.pattern(noLeadTrailSpacesRegex)]] }) break; case ConnectorType.FTP: formGroup = this.fb.group({ - methodFilter: [null, [Validators.required]], - valueExpression: [null, [Validators.required]] + methodFilter: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], + valueExpression: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]] }) break; case ConnectorType.OCPP: formGroup = this.fb.group({ - methodRPC: [null, [Validators.required]], - valueExpression: [null, [Validators.required]], + methodRPC: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], + valueExpression: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], withResponse: [false, []] }) break; case ConnectorType.SOCKET: formGroup = this.fb.group({ - methodRPC: [null, [Validators.required]], + methodRPC: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], methodProcessing: [null, [Validators.required]], - encoding: [null, [Validators.required]], + encoding: [SocketEncodings.UTF_8, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], withResponse: [false, []] }) break; case ConnectorType.XMPP: formGroup = this.fb.group({ - methodRPC: [null, [Validators.required]], - valueExpression: [null, [Validators.required]], + methodRPC: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], + valueExpression: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], withResponse: [false, []] }) break; case ConnectorType.SNMP: formGroup = this.fb.group({ - requestFilter: [null, [Validators.required]], + requestFilter: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], method: [null, [Validators.required]], + withResponse: [false, []], oid: this.fb.array([], [Validators.required]) }) break; case ConnectorType.REST: formGroup = this.fb.group({ - methodFilter: [null, [Validators.required]], - HTTPMethod: [null, [Validators.required]], + methodFilter: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], + httpMethod: [null, [Validators.required]], requestUrlExpression: [null, [Validators.required, Validators.pattern(this.urlPattern)]], responseTimeout: [null, [Validators.required, Validators.min(10), Validators.pattern("^[0-9]*$")]], timeout: [null, [Validators.required, Validators.min(10), Validators.pattern("^[0-9]*$")]], tries: [null, [Validators.required, Validators.min(1), Validators.pattern("^[0-9]*$")]], - valueExpression: [null, [Validators.required]], + valueExpression: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], httpHeaders: this.fb.array([]), security: this.fb.array([]) }) break; case ConnectorType.REQUEST: formGroup = this.fb.group({ - methodFilter: [null, [Validators.required]], + methodFilter: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], httpMethod: [null, [Validators.required]], requestUrlExpression: [null, [Validators.required, Validators.pattern(this.urlPattern)]], responseTimeout: [null, [Validators.required, Validators.min(10), Validators.pattern("^[0-9]*$")]], timeout: [null, [Validators.required, Validators.min(10), Validators.pattern("^[0-9]*$")]], tries: [null, [Validators.required, Validators.min(1), Validators.pattern("^[0-9]*$")]], - requestValueExpression: [null, [Validators.required]], - responseValueExpression: [null, []], + requestValueExpression: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], + responseValueExpression: [null, [Validators.pattern(noLeadTrailSpacesRegex)]], httpHeaders: this.fb.array([]), }) break; case ConnectorType.OPCUA: case ConnectorType.OPCUA_ASYNCIO: formGroup = this.fb.group({ - method: [null, [Validators.required]], + method: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], arguments: this.fb.array([]), }) break; default: formGroup = this.fb.group({ - command: [null, [Validators.required]], + command: [null, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], params: ['{}', [jsonRequired]], }) @@ -280,7 +293,7 @@ export class GatewayServiceRPCConnectorComponent implements OnInit, ControlValue addSNMPoid(value: string = null) { const oidsFA = this.commandForm.get('oid') as FormArray; if (oidsFA) { - oidsFA.push(this.fb.control(value, [Validators.required]), {emitEvent: false}); + oidsFA.push(this.fb.control(value, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]), {emitEvent: false}); } } @@ -292,8 +305,8 @@ export class GatewayServiceRPCConnectorComponent implements OnInit, ControlValue addHTTPHeader(value: { headerName: string, value: string } = {headerName: null, value: null}) { const headerFA = this.commandForm.get('httpHeaders') as FormArray; const formGroup = this.fb.group({ - headerName: [value.headerName, [Validators.required]], - value: [value.value, [Validators.required]] + headerName: [value.headerName, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], + value: [value.value, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]] }) if (headerFA) { headerFA.push(formGroup, {emitEvent: false}); @@ -308,8 +321,8 @@ export class GatewayServiceRPCConnectorComponent implements OnInit, ControlValue addHTTPSecurity(value: { securityName: string, value: string } = {securityName: null, value: null}) { const securityFA = this.commandForm.get('security') as FormArray; const formGroup = this.fb.group({ - securityName: [value.securityName, [Validators.required]], - value: [value.value, [Validators.required]] + securityName: [value.securityName, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]], + value: [value.value, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]] }) if (securityFA) { securityFA.push(formGroup, {emitEvent: false}); @@ -328,7 +341,7 @@ export class GatewayServiceRPCConnectorComponent implements OnInit, ControlValue addOCPUAArguments(value: string = null) { const oidsFA = this.commandForm.get('arguments') as FormArray; if (oidsFA) { - oidsFA.push(this.fb.control(value), {emitEvent: false}); + oidsFA.push(this.fb.control(value, [Validators.required, Validators.pattern(noLeadTrailSpacesRegex)]), {emitEvent: false}); } } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.ts index 484f8b16b5..50cfff408d 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc.component.ts @@ -170,29 +170,32 @@ export class GatewayServiceRPCComponent implements OnInit { data: {config: this.commandForm.value.params, templates: this.templates} }).afterClosed().subscribe( (res) => { - const templateAttribute: RPCTemplate = { - name: res, - config: this.commandForm.value.params - } - const templatesArray = this.templates; - const existingIndex = templatesArray.findIndex(template=>{ - return template.name == templateAttribute.name; - }) - if (existingIndex > -1 ){ - templatesArray.splice(existingIndex, 1) - } - templatesArray.push(templateAttribute) - const key = `${this.connectorType}_template`; - this.attributeService.saveEntityAttributes( - { - id: this.ctx.defaultSubscription.targetDeviceId, - entityType: EntityType.DEVICE + if (res) { + console.log(res); + const templateAttribute: RPCTemplate = { + name: res, + config: this.commandForm.value.params } - , AttributeScope.SERVER_SCOPE, [{ - key, - value: templatesArray - }]).subscribe(() => { - }) + const templatesArray = this.templates; + const existingIndex = templatesArray.findIndex(template => { + return template.name == templateAttribute.name; + }) + if (existingIndex > -1) { + templatesArray.splice(existingIndex, 1) + } + templatesArray.push(templateAttribute) + const key = `${this.connectorType}_template`; + this.attributeService.saveEntityAttributes( + { + id: this.ctx.defaultSubscription.targetDeviceId, + entityType: EntityType.DEVICE + } + , AttributeScope.SERVER_SCOPE, [{ + key, + value: templatesArray + }]).subscribe(() => { + }) + } } ); } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-widget.models.ts b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-widget.models.ts index b8f8c996b3..1d1c280053 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-widget.models.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-widget.models.ts @@ -172,6 +172,17 @@ export enum ModbusCommandTypes { Float64 = '64float' } +export const ModbusCodesTranslate = new Map([ + [1, 'gateway.rpc.read-coils'], + [2, 'gateway.rpc.read-discrete-inputs'], + [3, 'gateway.rpc.read-multiple-holding-registers'], + [4, 'gateway.rpc.read-input-registers'], + [5, 'gateway.rpc.write-single-coil'], + [6, 'gateway.rpc.write-single-holding-register'], + [15, 'gateway.rpc.write-multiple-coils'], + [16, 'gateway.rpc.write-multiple-holding-registers'] +]) + export enum BACnetRequestTypes { WriteProperty = 'writeProperty', ReadProperty = 'readProperty' 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 da5fbf824a..7937b197f3 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -203,117 +203,117 @@ "error-verification-url": "A domain name shouldn't contain symbols '/' and ':'. Example: thingsboard.io", "connection-settings": "Connection settings", "oauth2": { - "access-token-uri": "Access token URI", - "access-token-uri-required": "Access token URI is required.", - "activate-user": "Activate user", - "add-domain": "Add domain", - "delete-domain": "Delete domain", - "add-provider": "Add provider", - "delete-provider": "Delete provider", - "allow-user-creation": "Allow user creation", - "always-fullscreen": "Always fullscreen", - "authorization-uri": "Authorization URI", - "authorization-uri-required": "Authorization URI is required.", - "client-authentication-method": "Client authentication method", - "client-id": "Client ID", - "client-id-required": "Client ID is required.", - "client-id-max-length": "Client ID should be less than 256", - "client-secret": "Client secret", - "client-secret-required": "Client secret is required.", - "client-secret-max-length": "Client secret should be less than 2049", - "custom-setting": "Custom settings", - "customer-name-pattern": "Customer name pattern", - "customer-name-pattern-max-length": "Customer name pattern should be less than 256", - "default-dashboard-name": "Default dashboard name", - "default-dashboard-name-max-length": "Default dashboard name should be less than 256", - "delete-domain-text": "Be careful, after the confirmation a domain and all provider data will be unavailable.", - "delete-domain-title": "Are you sure you want to delete settings the domain '{{domainName}}'?", - "delete-registration-text": "Be careful, after the confirmation a provider data will be unavailable.", - "delete-registration-title": "Are you sure you want to delete the provider '{{name}}'?", - "email-attribute-key": "Email attribute key", - "email-attribute-key-required": "Email attribute key is required.", - "email-attribute-key-max-length": "Email attribute key should be less than 32", - "first-name-attribute-key": "First name attribute key", - "first-name-attribute-key-max-length": "First name attribute key should be less than 32", - "general": "General", - "jwk-set-uri": "JSON Web Key URI", - "last-name-attribute-key": "Last name attribute key", - "last-name-attribute-key-max-length": "Last name attribute key should be less than 32", - "login-button-icon": "Login button icon", - "login-button-label": "Provider label", - "login-button-label-placeholder": "Login with $(Provider label)", - "login-button-label-required": "Label is required.", - "login-provider": "Login provider", - "mapper": "Mapper", - "new-domain": "New domain", - "oauth2": "OAuth2", - "password-max-length": "Password should be less than 256", - "redirect-uri-template": "Redirect URI template", - "copy-redirect-uri": "Copy redirect URI", - "registration-id": "Registration ID", - "registration-id-required": "Registration ID is required.", - "registration-id-unique": "Registration ID need to unique for the system.", - "scope": "Scope", - "scope-required": "Scope is required.", - "tenant-name-pattern": "Tenant name pattern", - "tenant-name-pattern-required": "Tenant name pattern is required.", - "tenant-name-pattern-max-length": "Tenant name pattern ishould be less than 256", - "tenant-name-strategy": "Tenant name strategy", - "type": "Mapper type", - "uri-pattern-error": "Invalid URI format.", - "url": "URL", - "url-pattern": "Invalid URL format.", - "url-required": "URL is required.", - "url-max-length": "URL should be less than 256", - "user-info-uri": "User info URI", - "user-info-uri-required": "User info URI is required.", - "username-max-length": "User name should be less than 256", - "user-name-attribute-name": "User name attribute key", - "user-name-attribute-name-required": "User name attribute key is required", - "protocol": "Protocol", - "domain-schema-http": "HTTP", - "domain-schema-https": "HTTPS", - "domain-schema-mixed": "HTTP+HTTPS", - "enable": "Enable OAuth2 settings", - "domains": "Domains", - "mobile-apps": "Mobile applications", - "no-mobile-apps": "No applications configured", - "mobile-package": "Application package", - "mobile-package-placeholder": "Ex.: my.example.app", - "mobile-package-hint": "For Android: your own unique Application ID. For iOS: Product bundle identifier.", - "mobile-package-unique": "Application package must be unique.", - "mobile-app-secret": "Application secret", - "invalid-mobile-app-secret": "Application secret must contain only alphanumeric characters and must be between 16 and 2048 characters long.", - "copy-mobile-app-secret": "Copy application secret", - "add-mobile-app": "Add application", - "delete-mobile-app": "Delete application info", - "providers": "Providers", - "platform-web": "Web", - "platform-android": "Android", - "platform-ios": "iOS", - "all-platforms": "All platforms", - "smtp-provider": "SMTP provider", - "allowed-platforms": "Allowed platforms", - "authentication": "Authentication", - "basic": "Basic", - "provider": "Provider", - "redirect-url": "Redirect URI", - "domain-name": "Domain name", - "redirect-url-template": "Redirect URI template", - "microsoft-tenant-id": "Directory (tenant) Id", - "microsoft-tenant-id-required": "Directory (tenant) Id is required", - "token-uri": "Token URI", - "token-uri-required": "Token URI is required", - "redirect-uri": "Redirect URI", - "google-provider": "Google", - "microsoft-provider": "Office 365", - "sendgrid-provider": "Sendgrid", - "custom-provider": "Custom", - "generate-access-token": "Generate access token", - "update-access-token": "Update access token", - "access-token-status": "Access token status:", - "token-status-generated": "generated", - "token-status-not-generated": "not generated" + "access-token-uri": "Access token URI", + "access-token-uri-required": "Access token URI is required.", + "activate-user": "Activate user", + "add-domain": "Add domain", + "delete-domain": "Delete domain", + "add-provider": "Add provider", + "delete-provider": "Delete provider", + "allow-user-creation": "Allow user creation", + "always-fullscreen": "Always fullscreen", + "authorization-uri": "Authorization URI", + "authorization-uri-required": "Authorization URI is required.", + "client-authentication-method": "Client authentication method", + "client-id": "Client ID", + "client-id-required": "Client ID is required.", + "client-id-max-length": "Client ID should be less than 256", + "client-secret": "Client secret", + "client-secret-required": "Client secret is required.", + "client-secret-max-length": "Client secret should be less than 2049", + "custom-setting": "Custom settings", + "customer-name-pattern": "Customer name pattern", + "customer-name-pattern-max-length": "Customer name pattern should be less than 256", + "default-dashboard-name": "Default dashboard name", + "default-dashboard-name-max-length": "Default dashboard name should be less than 256", + "delete-domain-text": "Be careful, after the confirmation a domain and all provider data will be unavailable.", + "delete-domain-title": "Are you sure you want to delete settings the domain '{{domainName}}'?", + "delete-registration-text": "Be careful, after the confirmation a provider data will be unavailable.", + "delete-registration-title": "Are you sure you want to delete the provider '{{name}}'?", + "email-attribute-key": "Email attribute key", + "email-attribute-key-required": "Email attribute key is required.", + "email-attribute-key-max-length": "Email attribute key should be less than 32", + "first-name-attribute-key": "First name attribute key", + "first-name-attribute-key-max-length": "First name attribute key should be less than 32", + "general": "General", + "jwk-set-uri": "JSON Web Key URI", + "last-name-attribute-key": "Last name attribute key", + "last-name-attribute-key-max-length": "Last name attribute key should be less than 32", + "login-button-icon": "Login button icon", + "login-button-label": "Provider label", + "login-button-label-placeholder": "Login with $(Provider label)", + "login-button-label-required": "Label is required.", + "login-provider": "Login provider", + "mapper": "Mapper", + "new-domain": "New domain", + "oauth2": "OAuth2", + "password-max-length": "Password should be less than 256", + "redirect-uri-template": "Redirect URI template", + "copy-redirect-uri": "Copy redirect URI", + "registration-id": "Registration ID", + "registration-id-required": "Registration ID is required.", + "registration-id-unique": "Registration ID need to unique for the system.", + "scope": "Scope", + "scope-required": "Scope is required.", + "tenant-name-pattern": "Tenant name pattern", + "tenant-name-pattern-required": "Tenant name pattern is required.", + "tenant-name-pattern-max-length": "Tenant name pattern ishould be less than 256", + "tenant-name-strategy": "Tenant name strategy", + "type": "Mapper type", + "uri-pattern-error": "Invalid URI format.", + "url": "URL", + "url-pattern": "Invalid URL format.", + "url-required": "URL is required.", + "url-max-length": "URL should be less than 256", + "user-info-uri": "User info URI", + "user-info-uri-required": "User info URI is required.", + "username-max-length": "User name should be less than 256", + "user-name-attribute-name": "User name attribute key", + "user-name-attribute-name-required": "User name attribute key is required", + "protocol": "Protocol", + "domain-schema-http": "HTTP", + "domain-schema-https": "HTTPS", + "domain-schema-mixed": "HTTP+HTTPS", + "enable": "Enable OAuth2 settings", + "domains": "Domains", + "mobile-apps": "Mobile applications", + "no-mobile-apps": "No applications configured", + "mobile-package": "Application package", + "mobile-package-placeholder": "Ex.: my.example.app", + "mobile-package-hint": "For Android: your own unique Application ID. For iOS: Product bundle identifier.", + "mobile-package-unique": "Application package must be unique.", + "mobile-app-secret": "Application secret", + "invalid-mobile-app-secret": "Application secret must contain only alphanumeric characters and must be between 16 and 2048 characters long.", + "copy-mobile-app-secret": "Copy application secret", + "add-mobile-app": "Add application", + "delete-mobile-app": "Delete application info", + "providers": "Providers", + "platform-web": "Web", + "platform-android": "Android", + "platform-ios": "iOS", + "all-platforms": "All platforms", + "smtp-provider": "SMTP provider", + "allowed-platforms": "Allowed platforms", + "authentication": "Authentication", + "basic": "Basic", + "provider": "Provider", + "redirect-url": "Redirect URI", + "domain-name": "Domain name", + "redirect-url-template": "Redirect URI template", + "microsoft-tenant-id": "Directory (tenant) Id", + "microsoft-tenant-id-required": "Directory (tenant) Id is required", + "token-uri": "Token URI", + "token-uri-required": "Token URI is required", + "redirect-uri": "Redirect URI", + "google-provider": "Google", + "microsoft-provider": "Office 365", + "sendgrid-provider": "Sendgrid", + "custom-provider": "Custom", + "generate-access-token": "Generate access token", + "update-access-token": "Update access token", + "access-token-status": "Access token status:", + "token-status-generated": "generated", + "token-status-not-generated": "not generated" }, "smpp-provider": { "smpp-version": "SMPP version", @@ -410,7 +410,7 @@ "no-auto-commit-entities-prompt": "No entities configured for auto-commit", "delete-auto-commit-settings-title": "Are you sure you want to delete auto-commit settings?", "delete-auto-commit-settings-text": "Be careful, after the confirmation the auto-commit settings will be removed and auto-commit will be disabled for all entities.", - "2fa": { + "2fa": { "2fa": "Two-factor authentication", "available-providers": "Available providers", "issuer-name": "Issuer name", @@ -471,7 +471,7 @@ "slack-api-token": "Slack API token", "slack": "Slack", "slack-settings": "Slack settings" - }, + }, "alarm": { "alarm": "Alarm", "alarms": "Alarms", @@ -582,7 +582,7 @@ "oldest-first": "Oldest first", "newest-first": "Newest first", "activity": "Activity", - "export": "Export to CSV", + "export": "Export to CSV", "author": "Author", "created-date": "Created date", "edited-date": "Edited date", @@ -683,7 +683,7 @@ "assign-assets": "Assign assets", "assign-assets-text": "Assign { count, plural, =1 {1 asset} other {# assets} } to customer", "assign-asset-to-edge-title": "Assign Asset(s) To Edge", - "assign-asset-to-edge-text":"Please select the assets to assign to the edge", + "assign-asset-to-edge-text": "Please select the assets to assign to the edge", "delete-assets": "Delete assets", "unassign-assets": "Unassign assets", "unassign-assets-action-title": "Unassign { count, plural, =1 {1 asset} other {# assets} } from customer", @@ -1304,7 +1304,7 @@ "assign-device-to-customer": "Assign Device(s) To Customer", "assign-device-to-customer-text": "Please select the devices to assign to the customer", "assign-device-to-edge-title": "Assign Device(s) To Edge", - "assign-device-to-edge-text":"Please select the devices to assign to the edge", + "assign-device-to-edge-text": "Please select the devices to assign to the edge", "make-public": "Make device public", "make-private": "Make device private", "no-devices-text": "No devices found", @@ -1357,34 +1357,34 @@ "generate-password": "Generate Password", "generate-access-token": "Generate Access Token", "lwm2m-security-config": { - "identity": "Client Identity", - "identity-required": "Client Identity is required.", - "identity-tooltip": "The PSK identifier is an arbitrary PSK identifier up to 128 bytes, as described in the standard [RFC7925].\nThe PSK identifier MUST first be converted to a character string and then encoded into octets using UTF-8.", - "client-key": "Client Key", - "client-key-required": "Client Key is required.", - "client-key-tooltip-prk": "RPK public key or id must be in the standard [RFC7250] and encoded to Base64 format!", - "client-key-tooltip-psk": "PSK key must be in the standard [RFC4279] and HexDec format: 32, 64, 128 characters!", - "endpoint": "Endpoint Client Name", - "endpoint-required": "Endpoint Client Name is required.", - "client-public-key": "Client public key", - "client-public-key-hint": "If client public key is empty, the trusted certificate will be used", - "client-public-key-tooltip": "X509 public key must be in DER-encoded X509v3 format and support exclusively EC algorithm and then encoded to Base64 format!", - "mode": "Security config mode", - "client-tab": "Client Security Config", - "client-certificate": "Client certificate", - "bootstrap-tab": "Bootstrap Client", - "bootstrap-server": "Bootstrap Server", - "lwm2m-server": "LwM2M Server", - "client-publicKey-or-id": "Client Public Key or Id", - "client-publicKey-or-id-required": "Client Public Key or Id is required.", - "client-publicKey-or-id-tooltip-psk": "The PSK identifier is an arbitrary PSK identifier up to 128 bytes, as described in the standard [RFC7925].\nThe PSK identifier MUST first be converted to a character string and then encoded into octets using UTF-8.", - "client-publicKey-or-id-tooltip-rpk": "RPK public key or id must be in the standard [RFC7250] and encoded to Base64 format!", - "client-publicKey-or-id-tooltip-x509": "X509 public key must be in DER-encoded X509v3 format and support exclusively EC algorithm and then encoded to Base64 format", - "client-secret-key": "Client Secret Key", - "client-secret-key-required": "Client Secret Key is required.", - "client-secret-key-tooltip-psk": "PSK key must be in the standard [RFC4279] and HexDec format: 32, 64, 128 characters!", - "client-secret-key-tooltip-prk": "RPK secret key must be in PKCS_8 format (DER encoding, standard [RFC5958]) and then encoded to Base64 format!", - "client-secret-key-tooltip-x509": "X509 secret key must be in PKCS_8 format (DER encoding, standard [RFC5958]) and then encoded to Base64 format!" + "identity": "Client Identity", + "identity-required": "Client Identity is required.", + "identity-tooltip": "The PSK identifier is an arbitrary PSK identifier up to 128 bytes, as described in the standard [RFC7925].\nThe PSK identifier MUST first be converted to a character string and then encoded into octets using UTF-8.", + "client-key": "Client Key", + "client-key-required": "Client Key is required.", + "client-key-tooltip-prk": "RPK public key or id must be in the standard [RFC7250] and encoded to Base64 format!", + "client-key-tooltip-psk": "PSK key must be in the standard [RFC4279] and HexDec format: 32, 64, 128 characters!", + "endpoint": "Endpoint Client Name", + "endpoint-required": "Endpoint Client Name is required.", + "client-public-key": "Client public key", + "client-public-key-hint": "If client public key is empty, the trusted certificate will be used", + "client-public-key-tooltip": "X509 public key must be in DER-encoded X509v3 format and support exclusively EC algorithm and then encoded to Base64 format!", + "mode": "Security config mode", + "client-tab": "Client Security Config", + "client-certificate": "Client certificate", + "bootstrap-tab": "Bootstrap Client", + "bootstrap-server": "Bootstrap Server", + "lwm2m-server": "LwM2M Server", + "client-publicKey-or-id": "Client Public Key or Id", + "client-publicKey-or-id-required": "Client Public Key or Id is required.", + "client-publicKey-or-id-tooltip-psk": "The PSK identifier is an arbitrary PSK identifier up to 128 bytes, as described in the standard [RFC7925].\nThe PSK identifier MUST first be converted to a character string and then encoded into octets using UTF-8.", + "client-publicKey-or-id-tooltip-rpk": "RPK public key or id must be in the standard [RFC7250] and encoded to Base64 format!", + "client-publicKey-or-id-tooltip-x509": "X509 public key must be in DER-encoded X509v3 format and support exclusively EC algorithm and then encoded to Base64 format", + "client-secret-key": "Client Secret Key", + "client-secret-key-required": "Client Secret Key is required.", + "client-secret-key-tooltip-psk": "PSK key must be in the standard [RFC4279] and HexDec format: 32, 64, 128 characters!", + "client-secret-key-tooltip-prk": "RPK secret key must be in PKCS_8 format (DER encoding, standard [RFC5958]) and then encoded to Base64 format!", + "client-secret-key-tooltip-x509": "X509 secret key must be in PKCS_8 format (DER encoding, standard [RFC5958]) and then encoded to Base64 format!" }, "client-id": "Client ID", "client-id-pattern": "Contains invalid character.", @@ -1704,13 +1704,13 @@ "schedule-specific-time": "Active at a specific time", "schedule-custom": "Custom", "schedule-day": { - "monday": "Monday", - "tuesday": "Tuesday", - "wednesday": "Wednesday", - "thursday": "Thursday", - "friday": "Friday", - "saturday": "Saturday", - "sunday": "Sunday" + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday" }, "schedule-days": "Days", "schedule-time": "Time", @@ -2336,7 +2336,7 @@ "make-private-entity-view-title": "Are you sure you want to make the entity view '{{entityViewName}}' private?", "make-private-entity-view-text": "After the confirmation the entity view and all its data will be made private and won't be accessible by others.", "assign-entity-view-to-edge": "Assign Entity View(s) To Edge", - "assign-entity-view-to-edge-text":"Please select the entity views to assign to the edge", + "assign-entity-view-to-edge-text": "Please select the entity views to assign to the edge", "unassign-entity-view-from-edge-title": "Are you sure you want to unassign the entity view '{{entityViewName}}'?", "unassign-entity-view-from-edge-text": "After the confirmation the entity view will be unassigned and won't be accessible by the edge.", "unassign-entity-views-from-edge-action-title": "Unassign { count, plural, =1 {1 entity view} other {# entity views} } from edge", @@ -2550,105 +2550,105 @@ "invalid-file-error": "Invalid extension file" }, "feature": { - "advanced-features": "Advanced features" + "advanced-features": "Advanced features" }, "filter": { - "add": "Add filter", - "edit": "Edit filter", - "name": "Filter name", - "name-required": "Filter name is required.", - "duplicate-filter": "Filter with same name is already exists.", - "filters": "Filters", - "unable-delete-filter-title": "Unable to delete filter", - "unable-delete-filter-text": "Filter '{{filter}}' can't be deleted as it used by the following widget(s):
{{widgetsList}}", - "duplicate-filter-error": "Duplicate filter found '{{filter}}'.
Filters must be unique within the dashboard.", - "missing-key-filters-error": "Key filters is missing for filter '{{filter}}'.", - "filter": "Filter", - "editable": "Editable", - "no-filters-found": "No filters found.", - "no-filter-text": "No filter specified", - "add-filter-prompt": "Please add filter", - "no-filter-matching": "'{{filter}}' not found.", - "create-new-filter": "Create a new one!", - "create-new": "Create new", - "filter-required": "Filter is required.", - "operation": { - "operation": "Operation", - "equal": "equal", - "not-equal": "not equal", - "starts-with": "starts with", - "ends-with": "ends with", - "contains": "contains", - "not-contains": "not contains", - "greater": "greater than", - "less": "less than", - "greater-or-equal": "greater or equal", - "less-or-equal": "less or equal", - "and": "and", - "or": "or", - "in": "in", - "not-in": "not in" - }, - "ignore-case": "ignore case", - "value": "Value", - "remove-filter": "Remove filter", - "duplicate-filter-action": "Duplicate filter", - "preview": "Filter preview", - "no-filters": "No filters configured", - "add-filter": "Add filter", - "add-complex-filter": "Add complex filter", - "add-complex": "Add complex", - "complex-filter": "Complex filter", - "edit-complex-filter": "Edit complex filter", - "edit-filter-user-params": "Edit filter predicate user parameters", - "filter-user-params": "Filter predicate user parameters", - "user-parameters": "User parameters", - "display-label": "Label to display", - "autogenerated-label": "Auto generate label", - "order-priority": "Field order priority", - "key-filter": "Key filter", - "key-filters": "Key filters", - "key-name": "Key name", - "key-name-required": "Key name is required.", - "key-type": { - "key-type": "Key type", - "attribute": "Attribute", - "timeseries": "Timeseries", - "entity-field": "Entity field", - "constant": "Constant", - "client-attribute": "Client attribute", - "server-attribute": "Server attribute", - "shared-attribute": "Shared attribute" - }, - "value-type": { - "value-type": "Value type", - "string": "String", - "numeric": "Numeric", - "boolean": "Boolean", - "date-time": "Datetime" - }, - "value-type-required": "Key value type is required.", - "key-value-type-change-title": "Are you sure you want to change key value type?", - "key-value-type-change-message": "If you confirm new value type all entered key filters will be removed.", - "no-key-filters": "No key filters configured", - "add-key-filter": "Add key filter", - "remove-key-filter": "Remove key filter", - "edit-key-filter": "Edit key filter", - "date": "Date", - "time": "Time", - "current-tenant": "Current tenant", - "current-customer": "Current customer", - "current-user": "Current user", - "current-device": "Current device", - "default-value": "Default value", - "dynamic-source-type": "Dynamic source type", - "dynamic-value": "Dynamic value", - "no-dynamic-value": "No dynamic value", - "source-attribute": "Source attribute", - "switch-to-dynamic-value": "Switch to dynamic value", - "switch-to-default-value": "Switch to default value", - "inherit-owner": "Inherit from owner", - "source-attribute-not-set": "If source attribute isn't set" + "add": "Add filter", + "edit": "Edit filter", + "name": "Filter name", + "name-required": "Filter name is required.", + "duplicate-filter": "Filter with same name is already exists.", + "filters": "Filters", + "unable-delete-filter-title": "Unable to delete filter", + "unable-delete-filter-text": "Filter '{{filter}}' can't be deleted as it used by the following widget(s):
{{widgetsList}}", + "duplicate-filter-error": "Duplicate filter found '{{filter}}'.
Filters must be unique within the dashboard.", + "missing-key-filters-error": "Key filters is missing for filter '{{filter}}'.", + "filter": "Filter", + "editable": "Editable", + "no-filters-found": "No filters found.", + "no-filter-text": "No filter specified", + "add-filter-prompt": "Please add filter", + "no-filter-matching": "'{{filter}}' not found.", + "create-new-filter": "Create a new one!", + "create-new": "Create new", + "filter-required": "Filter is required.", + "operation": { + "operation": "Operation", + "equal": "equal", + "not-equal": "not equal", + "starts-with": "starts with", + "ends-with": "ends with", + "contains": "contains", + "not-contains": "not contains", + "greater": "greater than", + "less": "less than", + "greater-or-equal": "greater or equal", + "less-or-equal": "less or equal", + "and": "and", + "or": "or", + "in": "in", + "not-in": "not in" + }, + "ignore-case": "ignore case", + "value": "Value", + "remove-filter": "Remove filter", + "duplicate-filter-action": "Duplicate filter", + "preview": "Filter preview", + "no-filters": "No filters configured", + "add-filter": "Add filter", + "add-complex-filter": "Add complex filter", + "add-complex": "Add complex", + "complex-filter": "Complex filter", + "edit-complex-filter": "Edit complex filter", + "edit-filter-user-params": "Edit filter predicate user parameters", + "filter-user-params": "Filter predicate user parameters", + "user-parameters": "User parameters", + "display-label": "Label to display", + "autogenerated-label": "Auto generate label", + "order-priority": "Field order priority", + "key-filter": "Key filter", + "key-filters": "Key filters", + "key-name": "Key name", + "key-name-required": "Key name is required.", + "key-type": { + "key-type": "Key type", + "attribute": "Attribute", + "timeseries": "Timeseries", + "entity-field": "Entity field", + "constant": "Constant", + "client-attribute": "Client attribute", + "server-attribute": "Server attribute", + "shared-attribute": "Shared attribute" + }, + "value-type": { + "value-type": "Value type", + "string": "String", + "numeric": "Numeric", + "boolean": "Boolean", + "date-time": "Datetime" + }, + "value-type-required": "Key value type is required.", + "key-value-type-change-title": "Are you sure you want to change key value type?", + "key-value-type-change-message": "If you confirm new value type all entered key filters will be removed.", + "no-key-filters": "No key filters configured", + "add-key-filter": "Add key filter", + "remove-key-filter": "Remove key filter", + "edit-key-filter": "Edit key filter", + "date": "Date", + "time": "Time", + "current-tenant": "Current tenant", + "current-customer": "Current customer", + "current-user": "Current user", + "current-device": "Current device", + "default-value": "Default value", + "dynamic-source-type": "Dynamic source type", + "dynamic-value": "Dynamic value", + "no-dynamic-value": "No dynamic value", + "source-attribute": "Source attribute", + "switch-to-dynamic-value": "Switch to dynamic value", + "switch-to-default-value": "Switch to default value", + "inherit-owner": "Inherit from owner", + "source-attribute-not-set": "If source attribute isn't set" }, "fullscreen": { "expand": "Expand to fullscreen", @@ -2814,7 +2814,7 @@ "remove": "Remove", "requestFilter": "Request Filter", "requestUrlExpression": "Request URL Expression", - "HTTPMethod": "HTTP Method", + "httpMethod": "HTTP Method", "timeout": "Timeout", "tries": "Tries", "httpHeaders": "HTTP Headers", @@ -2847,9 +2847,17 @@ "save-template": "Save template", "template-name": "Template name", "template-name-required": "Template name is required.", - "template-name-duplicate": "The name is already used." - - + "template-name-duplicate": "Template with such name already exists, it will be updated.", + "command": "Command", + "params": "Params", + "read-coils": "01: Read Coils", + "read-discrete-inputs": "02: Read Discrete Inputs", + "read-multiple-holding-registers": "03: Read Multiple Holding Registers", + "read-input-registers": "04: Read Input Registers", + "write-single-coil": "05: Write Single Coil", + "write-single-holding-register": "06: Write Single Holding Register", + "write-multiple-coils": "15: Write Multiple Coils", + "write-multiple-holding-registers": "16: Write Multiple Holding Registers" }, "other": "Other", "save-tip": "Save configuration file", @@ -3057,22 +3065,22 @@ "access-token": "Access token", "x509": "X.509", "mqtt": { - "client-id": "MQTT client ID", - "user-name": "MQTT user name", - "password": "MQTT password" + "client-id": "MQTT client ID", + "user-name": "MQTT user name", + "password": "MQTT password" }, "lwm2m": { - "client-endpoint": "LwM2M endpoint client name", - "security-config-mode": "LwM2M security config mode", - "client-identity": "LwM2M client identity", - "client-key": "LwM2M client key", - "client-cert": "LwM2M client public key", - "bootstrap-server-security-mode": "LwM2M bootstrap server security mode", - "bootstrap-server-secret-key": "LwM2M bootstrap server secret key", - "bootstrap-server-public-key-id": "LwM2M bootstrap server public key or id", - "lwm2m-server-security-mode": "LwM2M server security mode", - "lwm2m-server-secret-key": "LwM2M server secret key", - "lwm2m-server-public-key-id": "LwM2M server public key or id" + "client-endpoint": "LwM2M endpoint client name", + "security-config-mode": "LwM2M security config mode", + "client-identity": "LwM2M client identity", + "client-key": "LwM2M client key", + "client-cert": "LwM2M client public key", + "bootstrap-server-security-mode": "LwM2M bootstrap server security mode", + "bootstrap-server-secret-key": "LwM2M bootstrap server secret key", + "bootstrap-server-public-key-id": "LwM2M bootstrap server public key or id", + "lwm2m-server-security-mode": "LwM2M server security mode", + "lwm2m-server-secret-key": "LwM2M server secret key", + "lwm2m-server-public-key-id": "LwM2M server public key or id" }, "snmp": { "host": "SNMP host", @@ -3086,7 +3094,7 @@ "routing-key": "Edge key", "secret": "Edge secret" }, - "stepper-text":{ + "stepper-text": { "select-file": "Select a file", "configuration": "Import configuration", "column-type": "Select columns type", @@ -3477,69 +3485,69 @@ } }, "ota-update": { - "add": "Add package", - "assign-firmware": "Assigned firmware", - "assign-firmware-required": "Assigned firmware is required", - "assign-software": "Assigned software", - "assign-software-required": "Assigned software is required", - "auto-generate-checksum": "Auto-generate checksum", - "checksum": "Checksum", - "checksum-hint": "If checksum is empty, it will be generated automatically", - "checksum-algorithm": "Checksum algorithm", - "checksum-copied-message": "Package checksum has been copied to clipboard", - "change-firmware": "Change of the firmware may cause update of { count, plural, =1 {1 device} other {# devices} }.", - "change-software": "Change of the software may cause update of { count, plural, =1 {1 device} other {# devices} }.", - "chose-compatible-device-profile": "The uploaded package will be available only for devices with the chosen profile.", - "chose-firmware-distributed-device": "Choose firmware that will be distributed to the devices", - "chose-software-distributed-device": "Choose software that will be distributed to the devices", - "content-type": "Content type", - "copy-checksum": "Copy checksum", - "copy-direct-url": "Copy direct URL", - "copyId": "Copy package Id", - "copied": "Copied!", - "delete": "Delete package", - "delete-ota-update-text": "Be careful, after the confirmation the OTA update will become unrecoverable.", - "delete-ota-update-title": "Are you sure you want to delete the OTA update '{{title}}'?", - "delete-ota-updates-text": "Be careful, after the confirmation all selected OTA updates will be removed.", - "delete-ota-updates-title": "Are you sure you want to delete { count, plural, =1 {1 OTA update} other {# OTA updates} }?", - "description": "Description", - "direct-url": "Direct URL", - "direct-url-copied-message": "Package direct URL has been copied to clipboard", - "direct-url-required": "Direct URL is required", - "download": "Download package", - "drop-file": "Drop a package file or click to select a file to upload.", - "drop-package-file-or": "Drag and drop a package file or", - "file-name": "File name", - "file-size": "File size", - "file-size-bytes": "File size in bytes", - "idCopiedMessage": "Package Id has been copied to clipboard", - "no-firmware-matching": "No compatible Firmware OTA Update packages matching '{{entity}}' were found.", - "no-firmware-text": "No compatible Firmware OTA Update packages provisioned.", - "no-packages-text": "No packages found", - "no-software-matching": "No compatible Software OTA Update packages matching '{{entity}}' were found.", - "no-software-text": "No compatible Software OTA Update packages provisioned.", - "ota-update": "OTA update", - "ota-update-details": "OTA update details", - "ota-updates": "OTA updates", - "package-type": "Package type", - "packages-repository": "Packages repository", - "search": "Search packages", - "selected-package": "{ count, plural, =1 {1 package} other {# packages} } selected", - "title": "Title", - "title-required": "Title is required.", - "title-max-length": "Title should be less than 256", - "types": { - "firmware": "Firmware", - "software": "Software" - }, - "upload-binary-file": "Upload binary file", - "use-external-url": "Use external URL", - "version": "Version", - "version-required": "Version is required.", - "version-tag": "Version tag", - "version-tag-hint": "Custom tag should match the package version reported by your device.", - "version-max-length": "Version should be less than 256", - "warning-after-save-no-edit": "Once the package is uploaded, you will not be able to modify title, version, device profile and package type." + "add": "Add package", + "assign-firmware": "Assigned firmware", + "assign-firmware-required": "Assigned firmware is required", + "assign-software": "Assigned software", + "assign-software-required": "Assigned software is required", + "auto-generate-checksum": "Auto-generate checksum", + "checksum": "Checksum", + "checksum-hint": "If checksum is empty, it will be generated automatically", + "checksum-algorithm": "Checksum algorithm", + "checksum-copied-message": "Package checksum has been copied to clipboard", + "change-firmware": "Change of the firmware may cause update of { count, plural, =1 {1 device} other {# devices} }.", + "change-software": "Change of the software may cause update of { count, plural, =1 {1 device} other {# devices} }.", + "chose-compatible-device-profile": "The uploaded package will be available only for devices with the chosen profile.", + "chose-firmware-distributed-device": "Choose firmware that will be distributed to the devices", + "chose-software-distributed-device": "Choose software that will be distributed to the devices", + "content-type": "Content type", + "copy-checksum": "Copy checksum", + "copy-direct-url": "Copy direct URL", + "copyId": "Copy package Id", + "copied": "Copied!", + "delete": "Delete package", + "delete-ota-update-text": "Be careful, after the confirmation the OTA update will become unrecoverable.", + "delete-ota-update-title": "Are you sure you want to delete the OTA update '{{title}}'?", + "delete-ota-updates-text": "Be careful, after the confirmation all selected OTA updates will be removed.", + "delete-ota-updates-title": "Are you sure you want to delete { count, plural, =1 {1 OTA update} other {# OTA updates} }?", + "description": "Description", + "direct-url": "Direct URL", + "direct-url-copied-message": "Package direct URL has been copied to clipboard", + "direct-url-required": "Direct URL is required", + "download": "Download package", + "drop-file": "Drop a package file or click to select a file to upload.", + "drop-package-file-or": "Drag and drop a package file or", + "file-name": "File name", + "file-size": "File size", + "file-size-bytes": "File size in bytes", + "idCopiedMessage": "Package Id has been copied to clipboard", + "no-firmware-matching": "No compatible Firmware OTA Update packages matching '{{entity}}' were found.", + "no-firmware-text": "No compatible Firmware OTA Update packages provisioned.", + "no-packages-text": "No packages found", + "no-software-matching": "No compatible Software OTA Update packages matching '{{entity}}' were found.", + "no-software-text": "No compatible Software OTA Update packages provisioned.", + "ota-update": "OTA update", + "ota-update-details": "OTA update details", + "ota-updates": "OTA updates", + "package-type": "Package type", + "packages-repository": "Packages repository", + "search": "Search packages", + "selected-package": "{ count, plural, =1 {1 package} other {# packages} } selected", + "title": "Title", + "title-required": "Title is required.", + "title-max-length": "Title should be less than 256", + "types": { + "firmware": "Firmware", + "software": "Software" + }, + "upload-binary-file": "Upload binary file", + "use-external-url": "Use external URL", + "version": "Version", + "version-required": "Version is required.", + "version-tag": "Version tag", + "version-tag-hint": "Custom tag should match the package version reported by your device.", + "version-max-length": "Version should be less than 256", + "warning-after-save-no-edit": "Once the package is uploaded, you will not be able to modify title, version, device profile and package type." }, "position": { "top": "Top", @@ -3860,11 +3868,11 @@ "test-with-this-message": "{{test}} with this message" }, "timezone": { - "timezone": "Timezone", - "select-timezone": "Select timezone", - "no-timezones-matching": "No timezones matching '{{timezone}}' were found.", - "timezone-required": "Timezone is required.", - "browser-time": "Browser Time" + "timezone": "Timezone", + "select-timezone": "Select timezone", + "no-timezones-matching": "No timezones matching '{{timezone}}' were found.", + "timezone-required": "Timezone is required.", + "browser-time": "Browser Time" }, "queue": { "queue-name": "Queue", @@ -3903,7 +3911,7 @@ "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", + "add": "Add queue", "details": "Queue details", "topic": "Topic", "submit-settings": "Submit settings", @@ -4198,30 +4206,30 @@ "seconds": "Seconds", "advanced": "Advanced", "predefined": { - "yesterday": "Yesterday", - "day-before-yesterday": "Day before yesterday", - "this-day-last-week": "This day last week", - "previous-week": "Previous week (Sun - Sat)", - "previous-week-iso": "Previous week (Mon - Sun)", - "previous-month": "Previous month", - "previous-quarter": "Previous quarter", - "previous-half-year": "Previous half year", - "previous-year": "Previous year", - "current-hour": "Current hour", - "current-day": "Current day", - "current-day-so-far": "Current day so far", - "current-week": "Current week (Sun - Sat)", - "current-week-iso": "Current week (Mon - Sun)", - "current-week-so-far": "Current week so far (Sun - Sat)", - "current-week-iso-so-far": "Current week so far (Mon - Sun)", - "current-month": "Current month", - "current-month-so-far": "Current month so far", - "current-quarter": "Current quarter", - "current-quarter-so-far": "Current quarter so far", - "current-half-year": "Current half year", - "current-half-year-so-far": "Current half year so far", - "current-year": "Current year", - "current-year-so-far": "Current year so far" + "yesterday": "Yesterday", + "day-before-yesterday": "Day before yesterday", + "this-day-last-week": "This day last week", + "previous-week": "Previous week (Sun - Sat)", + "previous-week-iso": "Previous week (Mon - Sun)", + "previous-month": "Previous month", + "previous-quarter": "Previous quarter", + "previous-half-year": "Previous half year", + "previous-year": "Previous year", + "current-hour": "Current hour", + "current-day": "Current day", + "current-day-so-far": "Current day so far", + "current-week": "Current week (Sun - Sat)", + "current-week-iso": "Current week (Mon - Sun)", + "current-week-so-far": "Current week so far (Sun - Sat)", + "current-week-iso-so-far": "Current week so far (Mon - Sun)", + "current-month": "Current month", + "current-month-so-far": "Current month so far", + "current-quarter": "Current quarter", + "current-quarter-so-far": "Current quarter so far", + "current-half-year": "Current half year", + "current-half-year-so-far": "Current half year so far", + "current-year": "Current year", + "current-year-so-far": "Current year so far" } }, "timeunit": { @@ -4990,16 +4998,16 @@ "popover-style": "Popover style", "open-new-browser-tab": "Open in a new browser tab", "mobile": { - "action-type": "Mobile action type", - "action-type-required": "Mobile action type is required", - "take-picture-from-gallery": "Take picture from gallery", - "take-photo": "Take photo", - "map-direction": "Open map directions", - "map-location": "Open map location", - "scan-qr-code": "Scan QR Code", - "make-phone-call": "Make phone call", - "get-location": "Get phone location", - "take-screenshot": "Take screenshot" + "action-type": "Mobile action type", + "action-type-required": "Mobile action type is required", + "take-picture-from-gallery": "Take picture from gallery", + "take-photo": "Take photo", + "map-direction": "Open map directions", + "map-location": "Open map location", + "scan-qr-code": "Scan QR Code", + "make-phone-call": "Make phone call", + "get-location": "Get phone location", + "take-screenshot": "Take screenshot" } }, "widgets-bundle": { @@ -6677,7 +6685,7 @@ "card-click": "On card click" } }, - "paginator" : { + "paginator": { "items-per-page": "Items per page:", "first-page-label": "First page", "last-page-label": "Last page",