Browse Source

Merge pull request #14588 from thingsboard/lts-4.2

Lts 4.2
pull/14592/head
Viacheslav Klimov 8 months ago
committed by GitHub
parent
commit
a6889ecedc
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java
  2. 7
      application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldManagerMessageProcessor.java
  3. 2
      application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldStateRestoreMsg.java
  4. 25
      application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java
  5. 8
      application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldStateService.java
  6. 36
      application/src/main/java/org/thingsboard/server/service/cf/ctx/state/KafkaCalculatedFieldStateService.java
  7. 18
      application/src/main/java/org/thingsboard/server/service/cf/ctx/state/RocksDBCalculatedFieldStateService.java
  8. 3
      application/src/main/java/org/thingsboard/server/service/device/DeviceBulkImportService.java
  9. 2
      application/src/main/resources/thingsboard.yml
  10. 5
      application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/AbstractOtaLwM2MIntegrationTest.java
  11. 14
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/Lwm2mDeviceProfileTransportConfiguration.java
  12. 29
      common/queue/src/main/java/org/thingsboard/server/queue/kafka/KafkaAdmin.java
  13. 1
      common/queue/src/main/java/org/thingsboard/server/queue/kafka/TbKafkaSettings.java
  14. 25
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClientContextImpl.java
  15. 58
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/ota/DefaultLwM2MOtaUpdateService.java
  16. 13
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/TbLwM2mRedisRegistrationStore.java
  17. 22
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/uplink/DefaultLwM2mUplinkMsgHandler.java
  18. 2
      edqs/src/main/resources/edqs.yml
  19. 2
      msa/edqs/docker/Dockerfile
  20. 2
      msa/monitoring/docker/Dockerfile
  21. 1
      msa/pom.xml
  22. 2
      msa/tb-node/docker/Dockerfile
  23. 2
      msa/transport/coap/docker/Dockerfile
  24. 2
      msa/transport/http/docker/Dockerfile
  25. 2
      msa/transport/lwm2m/docker/Dockerfile
  26. 2
      msa/transport/mqtt/docker/Dockerfile
  27. 2
      msa/transport/snmp/docker/Dockerfile
  28. 2
      msa/vc-executor-docker/docker/Dockerfile
  29. 2
      msa/vc-executor/src/main/resources/tb-vc-executor.yml
  30. 8
      packaging/java/build.gradle
  31. 2
      transport/coap/src/main/resources/tb-coap-transport.yml
  32. 2
      transport/http/src/main/resources/tb-http-transport.yml
  33. 2
      transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml
  34. 2
      transport/mqtt/src/main/resources/tb-mqtt-transport.yml
  35. 2
      transport/snmp/src/main/resources/tb-snmp-transport.yml
  36. 4
      ui-ngx/src/app/modules/home/models/entity/entities-table-config.models.ts
  37. 2
      ui-ngx/src/app/modules/home/models/entity/entity-table-component.models.ts
  38. 2
      ui-ngx/src/app/modules/home/pages/asset/asset.component.ts
  39. 2
      ui-ngx/src/app/modules/home/pages/device/device.component.ts
  40. 2
      ui-ngx/src/app/modules/home/pages/tenant/tenant.component.ts
  41. 515
      ui-ngx/src/assets/locale/locale.constant-da_DK.json
  42. 365
      ui-ngx/src/assets/locale/locale.constant-de_DE.json
  43. 681
      ui-ngx/src/assets/locale/locale.constant-el_GR.json
  44. 1449
      ui-ngx/src/assets/locale/locale.constant-fr_FR.json
  45. 1084
      ui-ngx/src/assets/locale/locale.constant-it_IT.json
  46. 1515
      ui-ngx/src/assets/locale/locale.constant-nl_NL.json

1
application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldEntityMessageProcessor.java

@ -112,6 +112,7 @@ public class CalculatedFieldEntityMessageProcessor extends AbstractContextAwareM
} else { } else {
states.remove(cfId); states.remove(cfId);
} }
msg.getCallback().onSuccess();
} }
public void process(EntityInitCalculatedFieldMsg msg) throws CalculatedFieldException { public void process(EntityInitCalculatedFieldMsg msg) throws CalculatedFieldException {

7
application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldManagerMessageProcessor.java

@ -125,10 +125,13 @@ public class CalculatedFieldManagerMessageProcessor extends AbstractContextAware
if (msg.getState() != null) { if (msg.getState() != null) {
msg.getState().setRequiredArguments(calculatedField.getArgNames()); msg.getState().setRequiredArguments(calculatedField.getArgNames());
} }
log.debug("Pushing CF state restore msg to specific actor [{}]", msg.getId().entityId()); log.debug("[{}] Pushing CF state restore msg to specific actor [{}]", tenantId, msg.getId().entityId());
getOrCreateActor(msg.getId().entityId()).tell(msg); getOrCreateActor(msg.getId().entityId()).tell(msg);
} else { } else if (msg.getState() != null) {
log.debug("[{}] Received CF state restore msg for non-existing CF [{}]. Removing state", tenantId, cfId);
cfStateService.removeState(msg.getId(), msg.getCallback()); cfStateService.removeState(msg.getId(), msg.getCallback());
} else {
msg.getCallback().onSuccess();
} }
} }

2
application/src/main/java/org/thingsboard/server/actors/calculatedField/CalculatedFieldStateRestoreMsg.java

@ -19,6 +19,7 @@ import lombok.Data;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.msg.MsgType; import org.thingsboard.server.common.msg.MsgType;
import org.thingsboard.server.common.msg.ToCalculatedFieldSystemMsg; import org.thingsboard.server.common.msg.ToCalculatedFieldSystemMsg;
import org.thingsboard.server.common.msg.queue.TbCallback;
import org.thingsboard.server.service.cf.ctx.CalculatedFieldEntityCtxId; import org.thingsboard.server.service.cf.ctx.CalculatedFieldEntityCtxId;
import org.thingsboard.server.service.cf.ctx.state.CalculatedFieldState; import org.thingsboard.server.service.cf.ctx.state.CalculatedFieldState;
@ -27,6 +28,7 @@ public class CalculatedFieldStateRestoreMsg implements ToCalculatedFieldSystemMs
private final CalculatedFieldEntityCtxId id; private final CalculatedFieldEntityCtxId id;
private final CalculatedFieldState state; private final CalculatedFieldState state;
private final TbCallback callback;
@Override @Override
public MsgType getMsgType() { public MsgType getMsgType() {

25
application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java

@ -43,7 +43,6 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChain;
import org.thingsboard.server.common.data.rule.RuleChainType; import org.thingsboard.server.common.data.rule.RuleChainType;
import org.thingsboard.server.common.msg.MsgType;
import org.thingsboard.server.common.msg.TbActorMsg; import org.thingsboard.server.common.msg.TbActorMsg;
import org.thingsboard.server.common.msg.TbActorStopReason; import org.thingsboard.server.common.msg.TbActorStopReason;
import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsg;
@ -138,13 +137,22 @@ public class TenantActor extends RuleChainManagerActor {
@Override @Override
protected boolean doProcess(TbActorMsg msg) { protected boolean doProcess(TbActorMsg msg) {
if (cantFindTenant) { if (cantFindTenant) {
log.info("[{}] Processing missing Tenant msg: {}", tenantId, msg); log.debug("[{}] Processing message for non-existing tenant: {}", tenantId, msg);
if (msg.getMsgType().equals(MsgType.QUEUE_TO_RULE_ENGINE_MSG)) { switch (msg.getMsgType()) {
QueueToRuleEngineMsg queueMsg = (QueueToRuleEngineMsg) msg; case QUEUE_TO_RULE_ENGINE_MSG -> {
queueMsg.getMsg().getCallback().onSuccess(); ((QueueToRuleEngineMsg) msg).getMsg().getCallback().onSuccess();
} else if (msg.getMsgType().equals(MsgType.TRANSPORT_TO_DEVICE_ACTOR_MSG)) { }
TransportToDeviceActorMsgWrapper transportMsg = (TransportToDeviceActorMsgWrapper) msg; case TRANSPORT_TO_DEVICE_ACTOR_MSG -> {
transportMsg.getCallback().onSuccess(); ((TransportToDeviceActorMsgWrapper) msg).getCallback().onSuccess();
}
case CF_STATE_RESTORE_MSG -> {
((CalculatedFieldStateRestoreMsg) msg).getCallback().onSuccess();
}
default -> {
if (!log.isDebugEnabled()) {
log.info("[{}] Processing message for non-existing tenant: {}", tenantId, msg);
}
}
} }
return true; return true;
} }
@ -390,6 +398,7 @@ public class TenantActor extends RuleChainManagerActor {
public TbActor createActor() { public TbActor createActor() {
return new TenantActor(context, tenantId); return new TenantActor(context, tenantId);
} }
} }
} }

8
application/src/main/java/org/thingsboard/server/service/cf/AbstractCalculatedFieldStateService.java

@ -62,14 +62,14 @@ public abstract class AbstractCalculatedFieldStateService implements CalculatedF
protected abstract void doRemove(CalculatedFieldEntityCtxId stateId, TbCallback callback); protected abstract void doRemove(CalculatedFieldEntityCtxId stateId, TbCallback callback);
protected void processRestoredState(CalculatedFieldStateProto stateMsg) { protected void processRestoredState(CalculatedFieldStateProto stateMsg, TbCallback callback) {
var id = fromProto(stateMsg.getId()); var id = fromProto(stateMsg.getId());
var state = fromProto(stateMsg); var state = fromProto(stateMsg);
processRestoredState(id, state); processRestoredState(id, state, callback);
} }
protected void processRestoredState(CalculatedFieldEntityCtxId id, CalculatedFieldState state) { protected void processRestoredState(CalculatedFieldEntityCtxId id, CalculatedFieldState state, TbCallback callback) {
actorSystemContext.tell(new CalculatedFieldStateRestoreMsg(id, state)); actorSystemContext.tell(new CalculatedFieldStateRestoreMsg(id, state, callback));
} }
@Override @Override

36
application/src/main/java/org/thingsboard/server/service/cf/ctx/state/KafkaCalculatedFieldStateService.java

@ -43,6 +43,8 @@ import org.thingsboard.server.queue.provider.TbRuleEngineQueueFactory;
import org.thingsboard.server.service.cf.AbstractCalculatedFieldStateService; import org.thingsboard.server.service.cf.AbstractCalculatedFieldStateService;
import org.thingsboard.server.service.cf.ctx.CalculatedFieldEntityCtxId; import org.thingsboard.server.service.cf.ctx.CalculatedFieldEntityCtxId;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import static org.thingsboard.server.queue.common.AbstractTbQueueTemplate.bytesToString; import static org.thingsboard.server.queue.common.AbstractTbQueueTemplate.bytesToString;
@ -61,6 +63,8 @@ public class KafkaCalculatedFieldStateService extends AbstractCalculatedFieldSta
@Value("${queue.calculated_fields.poll_interval:25}") @Value("${queue.calculated_fields.poll_interval:25}")
private long pollInterval; private long pollInterval;
@Value("${queue.calculated_fields.pack_processing_timeout:60000}")
private long packProcessingTimeout;
private TbKafkaProducerTemplate<TbProtoQueueMsg<CalculatedFieldStateProto>> stateProducer; private TbKafkaProducerTemplate<TbProtoQueueMsg<CalculatedFieldStateProto>> stateProducer;
@ -74,21 +78,39 @@ public class KafkaCalculatedFieldStateService extends AbstractCalculatedFieldSta
.topic(partitionService.getTopic(queueKey)) .topic(partitionService.getTopic(queueKey))
.pollInterval(pollInterval) .pollInterval(pollInterval)
.msgPackProcessor((msgs, consumer, consumerKey, config) -> { .msgPackProcessor((msgs, consumer, consumerKey, config) -> {
CountDownLatch completionLatch = new CountDownLatch(msgs.size());
for (TbProtoQueueMsg<CalculatedFieldStateProto> msg : msgs) { for (TbProtoQueueMsg<CalculatedFieldStateProto> msg : msgs) {
TbCallback callback = new TbCallback() {
@Override
public void onSuccess() {
int processedMsgCount = counter.incrementAndGet();
if (processedMsgCount % 10000 == 0) {
log.info("Processed {} CF state messages", processedMsgCount);
}
completionLatch.countDown();
}
@Override
public void onFailure(Throwable t) {
log.error("Failed to process CF state message: {}", msg, t);
completionLatch.countDown();
}
};
try { try {
if (msg.getValue() != null) { if (msg.getValue() != null) {
processRestoredState(msg.getValue()); processRestoredState(msg.getValue(), callback);
} else { } else {
processRestoredState(getStateId(msg.getHeaders()), null); processRestoredState(getStateId(msg.getHeaders()), null, callback);
} }
} catch (Throwable t) { } catch (Throwable t) {
log.error("Failed to process state message: {}", msg, t); callback.onFailure(t);
} }
}
int processedMsgCount = counter.incrementAndGet(); boolean success = completionLatch.await(packProcessingTimeout, TimeUnit.MILLISECONDS);
if (processedMsgCount % 10000 == 0) { if (!success) {
log.info("Processed {} calculated field state msgs", processedMsgCount); log.error("Timeout to process CF state messages pack of size {}", msgs.size());
}
} }
}) })
.consumerCreator((queueConfig, tpi) -> queueFactory.createCalculatedFieldStateConsumer()) .consumerCreator((queueConfig, tpi) -> queueFactory.createCalculatedFieldStateConsumer())

18
application/src/main/java/org/thingsboard/server/service/cf/ctx/state/RocksDBCalculatedFieldStateService.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.service.cf.ctx.state; package org.thingsboard.server.service.cf.ctx.state;
import com.google.protobuf.InvalidProtocolBufferException;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
@ -63,11 +62,22 @@ public class RocksDBCalculatedFieldStateService extends AbstractCalculatedFieldS
public void restore(QueueKey queueKey, Set<TopicPartitionInfo> partitions) { public void restore(QueueKey queueKey, Set<TopicPartitionInfo> partitions) {
if (stateService.getPartitions().isEmpty()) { if (stateService.getPartitions().isEmpty()) {
cfRocksDb.forEach((key, value) -> { cfRocksDb.forEach((key, value) -> {
CalculatedFieldStateProto stateMsg;
try { try {
processRestoredState(CalculatedFieldStateProto.parseFrom(value)); stateMsg = CalculatedFieldStateProto.parseFrom(value);
} catch (InvalidProtocolBufferException e) { } catch (Exception e) {
log.error("[{}] Failed to process restored state", key, e); log.error("Failed to parse CalculatedFieldStateProto for key {}", key, e);
return;
} }
processRestoredState(stateMsg, new TbCallback() {
@Override
public void onSuccess() {}
@Override
public void onFailure(Throwable t) {
log.error("Failed to process CF state message: {}", stateMsg, t);
}
});
}); });
} }
super.restore(queueKey, partitions); super.restore(queueKey, partitions);

3
application/src/main/java/org/thingsboard/server/service/device/DeviceBulkImportService.java

@ -258,8 +258,7 @@ public class DeviceBulkImportService extends AbstractBulkImportService<Device> {
Lwm2mDeviceProfileTransportConfiguration transportConfiguration = new Lwm2mDeviceProfileTransportConfiguration(); Lwm2mDeviceProfileTransportConfiguration transportConfiguration = new Lwm2mDeviceProfileTransportConfiguration();
transportConfiguration.setBootstrap(Collections.emptyList()); transportConfiguration.setBootstrap(Collections.emptyList());
transportConfiguration.setClientLwM2mSettings(new OtherConfiguration(false,1, 1, 1, PowerMode.DRX, null, null, null, null, null, V1_0.toString())); transportConfiguration.setClientLwM2mSettings(new OtherConfiguration());
transportConfiguration.setObserveAttr(new TelemetryMappingConfiguration(Collections.emptyMap(), Collections.emptySet(), Collections.emptySet(), Collections.emptySet(), Collections.emptyMap(), SINGLE));
DeviceProfileData deviceProfileData = new DeviceProfileData(); DeviceProfileData deviceProfileData = new DeviceProfileData();
DefaultDeviceProfileConfiguration configuration = new DefaultDeviceProfileConfiguration(); DefaultDeviceProfileConfiguration configuration = new DefaultDeviceProfileConfiguration();

2
application/src/main/resources/thingsboard.yml

@ -1720,6 +1720,8 @@ queue:
print-interval-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_MIN_PRINT_INTERVAL_MS:60000}" print-interval-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_MIN_PRINT_INTERVAL_MS:60000}"
# Time to wait for the stats-loading requests to Kafka to finish # Time to wait for the stats-loading requests to Kafka to finish
kafka-response-timeout-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_RESPONSE_TIMEOUT_MS:1000}" kafka-response-timeout-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_RESPONSE_TIMEOUT_MS:1000}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions: partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256 hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256
transport_api: transport_api:

5
application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/AbstractOtaLwM2MIntegrationTest.java

@ -37,8 +37,10 @@ import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static org.awaitility.Awaitility.await;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.thingsboard.rest.client.utils.RestJsonConverter.toTimeseries; import static org.thingsboard.rest.client.utils.RestJsonConverter.toTimeseries;
@ -249,6 +251,9 @@ public abstract class AbstractOtaLwM2MIntegrationTest extends AbstractLwM2MInteg
} }
protected void resultReadOtaParams_19(String resourceIdVer, OtaPackageInfo otaPackageInfo) throws Exception { protected void resultReadOtaParams_19(String resourceIdVer, OtaPackageInfo otaPackageInfo) throws Exception {
await("await on Read")
.atMost(TIMEOUT*2, TimeUnit.SECONDS)
.until(() -> Boolean.valueOf(sendRPCById(resourceIdVer)));
String actualResult = sendRPCById(resourceIdVer); String actualResult = sendRPCById(resourceIdVer);
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class);
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText()); assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText());

14
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/Lwm2mDeviceProfileTransportConfiguration.java

@ -17,10 +17,15 @@ package org.thingsboard.server.common.data.device.profile;
import lombok.Data; import lombok.Data;
import org.thingsboard.server.common.data.DeviceTransportType; import org.thingsboard.server.common.data.DeviceTransportType;
import org.thingsboard.server.common.data.device.data.PowerMode;
import org.thingsboard.server.common.data.device.profile.lwm2m.OtherConfiguration; import org.thingsboard.server.common.data.device.profile.lwm2m.OtherConfiguration;
import org.thingsboard.server.common.data.device.profile.lwm2m.TelemetryMappingConfiguration; import org.thingsboard.server.common.data.device.profile.lwm2m.TelemetryMappingConfiguration;
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MBootstrapServerCredential; import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MBootstrapServerCredential;
import static org.eclipse.leshan.core.LwM2m.Version.V1_0;
import static org.thingsboard.server.common.data.device.profile.lwm2m.TelemetryObserveStrategy.SINGLE;
import java.util.Collections;
import java.util.List; import java.util.List;
@Data @Data
@ -33,9 +38,18 @@ public class Lwm2mDeviceProfileTransportConfiguration implements DeviceProfileTr
private List<LwM2MBootstrapServerCredential> bootstrap; private List<LwM2MBootstrapServerCredential> bootstrap;
private OtherConfiguration clientLwM2mSettings; private OtherConfiguration clientLwM2mSettings;
public Lwm2mDeviceProfileTransportConfiguration() {
updateDefault();
}
@Override @Override
public DeviceTransportType getType() { public DeviceTransportType getType() {
return DeviceTransportType.LWM2M; return DeviceTransportType.LWM2M;
} }
private void updateDefault(){
this.setBootstrap(Collections.emptyList());
this.setClientLwM2mSettings(new OtherConfiguration(false,1, 1, 1, PowerMode.DRX, null, null, null, null, null, V1_0.toString()));
this.setObserveAttr(new TelemetryMappingConfiguration(Collections.emptyMap(), Collections.emptySet(), Collections.emptySet(), Collections.emptySet(), Collections.emptyMap(), SINGLE));
}
} }

29
common/queue/src/main/java/org/thingsboard/server/queue/kafka/KafkaAdmin.java

@ -58,15 +58,12 @@ public class KafkaAdmin {
private final TbKafkaSettings settings; private final TbKafkaSettings settings;
@Value("${queue.kafka.request.timeout.ms:30000}")
private int requestTimeoutMs;
@Value("${queue.kafka.topics_cache_ttl_ms:300000}") // 5 minutes by default
private int topicsCacheTtlMs;
private final LazyInitializer<AdminClient> adminClient; private final LazyInitializer<AdminClient> adminClient;
private final CachedValue<Set<String>> topics; private final CachedValue<Set<String>> topics;
public KafkaAdmin(@Lazy TbKafkaSettings settings) { public KafkaAdmin(@Lazy TbKafkaSettings settings,
@Value("${queue.kafka.topics_cache_ttl_ms:300000}")
int topicsCacheTtlMs) {
this.settings = settings; this.settings = settings;
this.adminClient = LazyInitializer.<AdminClient>builder() this.adminClient = LazyInitializer.<AdminClient>builder()
.setInitializer(() -> AdminClient.create(settings.toAdminProps())) .setInitializer(() -> AdminClient.create(settings.toAdminProps()))
@ -91,7 +88,7 @@ public class KafkaAdmin {
NewTopic newTopic = new NewTopic(topic, partitions, settings.getReplicationFactor()).configs(properties); NewTopic newTopic = new NewTopic(topic, partitions, settings.getReplicationFactor()).configs(properties);
try { try {
getClient().createTopics(List.of(newTopic)).all().get(requestTimeoutMs, TimeUnit.MILLISECONDS); getClient().createTopics(List.of(newTopic)).all().get(settings.getRequestTimeoutMs(), TimeUnit.MILLISECONDS);
topics.add(topic); topics.add(topic);
} catch (ExecutionException ee) { } catch (ExecutionException ee) {
log.trace("Failed to create topic {} with properties {}", topic, properties, ee); log.trace("Failed to create topic {} with properties {}", topic, properties, ee);
@ -110,7 +107,7 @@ public class KafkaAdmin {
public void deleteTopic(String topic) { public void deleteTopic(String topic) {
log.debug("Deleting topic {}", topic); log.debug("Deleting topic {}", topic);
try { try {
getClient().deleteTopics(List.of(topic)).all().get(requestTimeoutMs, TimeUnit.MILLISECONDS); getClient().deleteTopics(List.of(topic)).all().get(settings.getRequestTimeoutMs(), TimeUnit.MILLISECONDS);
} catch (Exception e) { } catch (Exception e) {
log.error("Failed to delete kafka topic [{}].", topic, e); log.error("Failed to delete kafka topic [{}].", topic, e);
} }
@ -122,7 +119,7 @@ public class KafkaAdmin {
public Set<String> listTopics() { public Set<String> listTopics() {
try { try {
Set<String> topics = getClient().listTopics().names().get(requestTimeoutMs, TimeUnit.MILLISECONDS); Set<String> topics = getClient().listTopics().names().get(settings.getRequestTimeoutMs(), TimeUnit.MILLISECONDS);
log.trace("Listed topics: {}", topics); log.trace("Listed topics: {}", topics);
return topics; return topics;
} catch (Exception e) { } catch (Exception e) {
@ -150,7 +147,7 @@ public class KafkaAdmin {
.collect(Collectors.toMap(tp -> tp, tp -> OffsetSpec.latest())); .collect(Collectors.toMap(tp -> tp, tp -> OffsetSpec.latest()));
Map<TopicPartition, ListOffsetsResult.ListOffsetsResultInfo> endOffsets = Map<TopicPartition, ListOffsetsResult.ListOffsetsResultInfo> endOffsets =
getClient().listOffsets(latestOffsetsSpec).all().get(requestTimeoutMs, TimeUnit.MILLISECONDS); getClient().listOffsets(latestOffsetsSpec).all().get(settings.getRequestTimeoutMs(), TimeUnit.MILLISECONDS);
return committedOffsets.entrySet().stream() return committedOffsets.entrySet().stream()
.mapToLong(entry -> { .mapToLong(entry -> {
@ -169,7 +166,7 @@ public class KafkaAdmin {
@SneakyThrows @SneakyThrows
public Map<TopicPartition, OffsetAndMetadata> getConsumerGroupOffsets(String groupId) { public Map<TopicPartition, OffsetAndMetadata> getConsumerGroupOffsets(String groupId) {
return getClient().listConsumerGroupOffsets(groupId).partitionsToOffsetAndMetadata().get(requestTimeoutMs, TimeUnit.MILLISECONDS); return getClient().listConsumerGroupOffsets(groupId).partitionsToOffsetAndMetadata().get(settings.getRequestTimeoutMs(), TimeUnit.MILLISECONDS);
} }
/** /**
@ -212,7 +209,7 @@ public class KafkaAdmin {
} else { } else {
log.info("[{}] SHOULD alter topic offset [{}] less than old node group offset [{}]", tp, existingOffset.offset(), om.offset()); log.info("[{}] SHOULD alter topic offset [{}] less than old node group offset [{}]", tp, existingOffset.offset(), om.offset());
} }
getClient().alterConsumerGroupOffsets(newGroupId, Map.of(tp, om)).all().get(requestTimeoutMs, TimeUnit.MILLISECONDS); getClient().alterConsumerGroupOffsets(newGroupId, Map.of(tp, om)).all().get(settings.getRequestTimeoutMs(), TimeUnit.MILLISECONDS);
log.info("[{}] altered new consumer groupId {}", tp, newGroupId); log.info("[{}] altered new consumer groupId {}", tp, newGroupId);
break; break;
} }
@ -229,7 +226,7 @@ public class KafkaAdmin {
return true; return true;
} }
List<TopicPartition> allPartitions = getClient().describeTopics(existingTopics).allTopicNames().get(requestTimeoutMs, TimeUnit.MILLISECONDS) List<TopicPartition> allPartitions = getClient().describeTopics(existingTopics).allTopicNames().get(settings.getRequestTimeoutMs(), TimeUnit.MILLISECONDS)
.entrySet().stream() .entrySet().stream()
.flatMap(entry -> { .flatMap(entry -> {
String topic = entry.getKey(); String topic = entry.getKey();
@ -239,9 +236,9 @@ public class KafkaAdmin {
.toList(); .toList();
Map<TopicPartition, ListOffsetsResult.ListOffsetsResultInfo> beginningOffsets = getClient().listOffsets(allPartitions.stream() Map<TopicPartition, ListOffsetsResult.ListOffsetsResultInfo> beginningOffsets = getClient().listOffsets(allPartitions.stream()
.collect(Collectors.toMap(partition -> partition, partition -> OffsetSpec.earliest()))).all().get(requestTimeoutMs, TimeUnit.MILLISECONDS); .collect(Collectors.toMap(partition -> partition, partition -> OffsetSpec.earliest()))).all().get(settings.getRequestTimeoutMs(), TimeUnit.MILLISECONDS);
Map<TopicPartition, ListOffsetsResult.ListOffsetsResultInfo> endOffsets = getClient().listOffsets(allPartitions.stream() Map<TopicPartition, ListOffsetsResult.ListOffsetsResultInfo> endOffsets = getClient().listOffsets(allPartitions.stream()
.collect(Collectors.toMap(partition -> partition, partition -> OffsetSpec.latest()))).all().get(requestTimeoutMs, TimeUnit.MILLISECONDS); .collect(Collectors.toMap(partition -> partition, partition -> OffsetSpec.latest()))).all().get(settings.getRequestTimeoutMs(), TimeUnit.MILLISECONDS);
for (TopicPartition partition : allPartitions) { for (TopicPartition partition : allPartitions) {
long beginningOffset = beginningOffsets.get(partition).offset(); long beginningOffset = beginningOffsets.get(partition).offset();
@ -261,7 +258,7 @@ public class KafkaAdmin {
public void deleteConsumerGroup(String consumerGroupId) { public void deleteConsumerGroup(String consumerGroupId) {
try { try {
getClient().deleteConsumerGroups(List.of(consumerGroupId)).all().get(requestTimeoutMs, TimeUnit.MILLISECONDS); getClient().deleteConsumerGroups(List.of(consumerGroupId)).all().get(settings.getRequestTimeoutMs(), TimeUnit.MILLISECONDS);
} catch (Exception e) { } catch (Exception e) {
log.warn("Failed to delete consumer group {}", consumerGroupId, e); log.warn("Failed to delete consumer group {}", consumerGroupId, e);
} }

1
common/queue/src/main/java/org/thingsboard/server/queue/kafka/TbKafkaSettings.java

@ -112,6 +112,7 @@ public class TbKafkaSettings {
@Value("${queue.kafka.fetch_max_bytes:134217728}") @Value("${queue.kafka.fetch_max_bytes:134217728}")
private int fetchMaxBytes; private int fetchMaxBytes;
@Getter
@Value("${queue.kafka.request.timeout.ms:30000}") @Value("${queue.kafka.request.timeout.ms:30000}")
private int requestTimeoutMs; private int requestTimeoutMs;

25
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClientContextImpl.java

@ -360,20 +360,25 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
@Override @Override
public Lwm2mDeviceProfileTransportConfiguration getProfile(Registration registration) { public Lwm2mDeviceProfileTransportConfiguration getProfile(Registration registration) {
UUID profileId = getClientByEndpoint(registration.getEndpoint()).getProfileId(); UUID profileId = getClientByEndpoint(registration.getEndpoint()).getProfileId();
return doGetAndCache(profileId); return profileId != null ? doGetAndCache(profileId) : null;
} }
private Lwm2mDeviceProfileTransportConfiguration doGetAndCache(UUID profileId) { private Lwm2mDeviceProfileTransportConfiguration doGetAndCache(UUID profileId) {
Lwm2mDeviceProfileTransportConfiguration result;
Lwm2mDeviceProfileTransportConfiguration result = profiles.get(profileId); if (profileId != null) {
if (result == null) { result = profiles.get(profileId);
log.debug("Fetching profile [{}]", profileId); if (result == null) {
DeviceProfile deviceProfile = deviceProfileCache.get(new DeviceProfileId(profileId)); log.debug("Fetching profile [{}]", profileId);
if (deviceProfile != null) { DeviceProfile deviceProfile = deviceProfileCache.get(new DeviceProfileId(profileId));
result = profileUpdate(deviceProfile); if (deviceProfile != null) {
} else { result = profileUpdate(deviceProfile);
log.warn("Device profile was not found! Most probably device profile [{}] has been removed from the database.", profileId); } else {
log.warn("Device profile was not found! Most probably device profile [{}] has been removed from the database.", profileId);
}
} }
} else {
log.warn("Device profile not found! The device profile ID is null. Return Lwm2mDeviceProfileTransportConfiguration with default.");
result = new Lwm2mDeviceProfileTransportConfiguration();
} }
return result; return result;
} }

58
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/ota/DefaultLwM2MOtaUpdateService.java

@ -201,35 +201,39 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
} }
var clientSettings = clientContext.getProfile(client.getRegistration()).getClientLwM2mSettings(); var clientSettings = clientContext.getProfile(client.getRegistration()).getClientLwM2mSettings();
initFwStrategy(client, clientSettings); if (clientSettings != null) {
initSwStrategy(client, clientSettings); initFwStrategy(client, clientSettings);
initSwStrategy(client, clientSettings);
if (!attributesToFetch.isEmpty()) {
var future = attributesService.getSharedAttributes(client, attributesToFetch);
DonAsynchron.withCallback(future, attrs -> { if (!attributesToFetch.isEmpty()) {
if (fwInfo.isSupported()) { var future = attributesService.getSharedAttributes(client, attributesToFetch);
Optional<String> newFwTitle = getAttributeValue(attrs, FIRMWARE_TITLE); DonAsynchron.withCallback(future, attrs -> {
Optional<String> newFwVersion = getAttributeValue(attrs, FIRMWARE_VERSION); if (fwInfo.isSupported()) {
Optional<String> newFwTag = getAttributeValue(attrs, FIRMWARE_TAG); Optional<String> newFwTitle = getAttributeValue(attrs, FIRMWARE_TITLE);
Optional<String> newFwUrl = getAttributeValue(attrs, FIRMWARE_URL); Optional<String> newFwVersion = getAttributeValue(attrs, FIRMWARE_VERSION);
if (newFwTitle.isPresent() && newFwVersion.isPresent() && !isOtaDownloading(client) && !UPDATING.equals(fwInfo.status)) { Optional<String> newFwTag = getAttributeValue(attrs, FIRMWARE_TAG);
onTargetFirmwareUpdate(client, newFwTitle.get(), newFwVersion.get(), newFwUrl, newFwTag); Optional<String> newFwUrl = getAttributeValue(attrs, FIRMWARE_URL);
if (newFwTitle.isPresent() && newFwVersion.isPresent() && !isOtaDownloading(client) && !UPDATING.equals(fwInfo.status)) {
onTargetFirmwareUpdate(client, newFwTitle.get(), newFwVersion.get(), newFwUrl, newFwTag);
}
} }
} if (swInfo.isSupported()) {
if (swInfo.isSupported()) { Optional<String> newSwTitle = getAttributeValue(attrs, SOFTWARE_TITLE);
Optional<String> newSwTitle = getAttributeValue(attrs, SOFTWARE_TITLE); Optional<String> newSwVersion = getAttributeValue(attrs, SOFTWARE_VERSION);
Optional<String> newSwVersion = getAttributeValue(attrs, SOFTWARE_VERSION); Optional<String> newSwTag = getAttributeValue(attrs, SOFTWARE_TAG);
Optional<String> newSwTag = getAttributeValue(attrs, SOFTWARE_TAG); Optional<String> newSwUrl = getAttributeValue(attrs, SOFTWARE_URL);
Optional<String> newSwUrl = getAttributeValue(attrs, SOFTWARE_URL); if (newSwTitle.isPresent() && newSwVersion.isPresent()) {
if (newSwTitle.isPresent() && newSwVersion.isPresent()) { onTargetSoftwareUpdate(client, newSwTitle.get(), newSwVersion.get(), newSwUrl, newSwTag);
onTargetSoftwareUpdate(client, newSwTitle.get(), newSwVersion.get(), newSwUrl, newSwTag); }
} }
}
}, throwable -> { }, throwable -> {
if (fwInfo.isSupported()) { if (fwInfo.isSupported()) {
update(fwInfo); update(fwInfo);
} }
}, executor); }, executor);
}
} }
} }

13
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/TbLwM2mRedisRegistrationStore.java

@ -750,11 +750,14 @@ public class TbLwM2mRedisRegistrationStore implements RegistrationStore, Startab
System.currentTimeMillis(), 0, cleanLimit); System.currentTimeMillis(), 0, cleanLimit);
for (byte[] endpoint : endpointsExpired) { for (byte[] endpoint : endpointsExpired) {
Registration r = deserializeReg(connection.get(toEndpointKey(endpoint))); byte[] data = connection.get(toEndpointKey(endpoint));
if (!r.isAlive(gracePeriod)) { if (data != null && data.length > 0) {
Deregistration dereg = removeRegistration(connection, r.getId(), true); Registration r = deserializeReg(data);
if (dereg != null) if (!r.isAlive(gracePeriod)) {
expirationListener.registrationExpired(dereg.getRegistration(), dereg.getObservations()); Deregistration dereg = removeRegistration(connection, r.getId(), true);
if (dereg != null)
expirationListener.registrationExpired(dereg.getRegistration(), dereg.getObservations());
}
} }
} }
} catch (Exception e) { } catch (Exception e) {

22
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/uplink/DefaultLwM2mUplinkMsgHandler.java

@ -484,13 +484,18 @@ public class DefaultLwM2mUplinkMsgHandler extends LwM2MExecutorAwareService impl
*/ */
private void initClientTelemetry(LwM2mClient lwM2MClient) { private void initClientTelemetry(LwM2mClient lwM2MClient) {
Lwm2mDeviceProfileTransportConfiguration profile = clientContext.getProfile(lwM2MClient.getRegistration()); Lwm2mDeviceProfileTransportConfiguration profile = clientContext.getProfile(lwM2MClient.getRegistration());
Set<String> supportedObjects = clientContext.getSupportedIdVerInClient(lwM2MClient); if (profile != null) {
if (supportedObjects != null && supportedObjects.size() > 0) { Set<String> supportedObjects = clientContext.getSupportedIdVerInClient(lwM2MClient);
this.sendReadRequests(lwM2MClient, profile, supportedObjects); if (supportedObjects != null && !supportedObjects.isEmpty()) {
this.sendInitObserveRequests(lwM2MClient, profile, supportedObjects); this.sendInitObserveRequests(lwM2MClient, profile, supportedObjects);
this.sendWriteAttributeRequests(lwM2MClient, profile, supportedObjects); this.sendReadRequests(lwM2MClient, profile, supportedObjects);
this.sendWriteAttributeRequests(lwM2MClient, profile, supportedObjects);
// Removed. Used only for debug. // Removed. Used only for debug.
// this.sendDiscoverRequests(lwM2MClient, profile, supportedObjects); // this.sendDiscoverRequests(lwM2MClient, profile, supportedObjects);
}
} else {
log.warn("[{}] Failed to process initClientTelemetry! Profile is null. Update procedure may not have completed after reboot yet", lwM2MClient.getEndpoint());
logService.log(lwM2MClient, "Failed to process initClientTelemetry. Profile is null. Update procedure may not have completed after reboot yet");
} }
} }
@ -1016,7 +1021,7 @@ public class DefaultLwM2mUplinkMsgHandler extends LwM2MExecutorAwareService impl
}); });
} }
private void updateValueOta(List<LwM2mClient> clients, Lwm2mDeviceProfileTransportConfiguration oldProfile, Lwm2mDeviceProfileTransportConfiguration newProfile) { private void updateValueOta(List<LwM2mClient> clients, Lwm2mDeviceProfileTransportConfiguration newProfile, Lwm2mDeviceProfileTransportConfiguration oldProfile) {
OtherConfiguration newLwM2mSettings = newProfile.getClientLwM2mSettings(); OtherConfiguration newLwM2mSettings = newProfile.getClientLwM2mSettings();
OtherConfiguration oldLwM2mSettings = oldProfile.getClientLwM2mSettings(); OtherConfiguration oldLwM2mSettings = oldProfile.getClientLwM2mSettings();
if (!newLwM2mSettings.getFwUpdateStrategy().equals(oldLwM2mSettings.getFwUpdateStrategy()) if (!newLwM2mSettings.getFwUpdateStrategy().equals(oldLwM2mSettings.getFwUpdateStrategy())
@ -1098,6 +1103,9 @@ public class DefaultLwM2mUplinkMsgHandler extends LwM2MExecutorAwareService impl
v -> attributesService.onAttributesUpdate(lwM2MClient, v, logFailedUpdateOfNonChangedValue), v -> attributesService.onAttributesUpdate(lwM2MClient, v, logFailedUpdateOfNonChangedValue),
t -> log.error("[{}] Failed to get attributes", lwM2MClient.getEndpoint(), t), t -> log.error("[{}] Failed to get attributes", lwM2MClient.getEndpoint(), t),
executor); executor);
} else {
log.warn("[{}] Failed to process initAttributes! Profile is null. Update procedure may not have completed after reboot yet", lwM2MClient.getEndpoint());
logService.log(lwM2MClient, "Failed to process initAttributes. Profile is null. Update procedure may not have completed after reboot yet");
} }
} }
@ -1107,7 +1115,7 @@ public class DefaultLwM2mUplinkMsgHandler extends LwM2MExecutorAwareService impl
private Map<String, String> getNamesFromProfileForSharedAttributes(LwM2mClient lwM2MClient) { private Map<String, String> getNamesFromProfileForSharedAttributes(LwM2mClient lwM2MClient) {
Lwm2mDeviceProfileTransportConfiguration profile = clientContext.getProfile(lwM2MClient.getRegistration()); Lwm2mDeviceProfileTransportConfiguration profile = clientContext.getProfile(lwM2MClient.getRegistration());
return profile.getObserveAttr().getKeyName(); return profile != null ? profile.getObserveAttr().getKeyName() : Collections.emptyMap();
} }
public LwM2MTransportServerConfig getConfig() { public LwM2MTransportServerConfig getConfig() {

2
edqs/src/main/resources/edqs.yml

@ -177,6 +177,8 @@ queue:
print-interval-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_MIN_PRINT_INTERVAL_MS:60000}" print-interval-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_MIN_PRINT_INTERVAL_MS:60000}"
# Time to wait for the stats-loading requests to Kafka to finish # Time to wait for the stats-loading requests to Kafka to finish
kafka-response-timeout-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_RESPONSE_TIMEOUT_MS:1000}" kafka-response-timeout-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_RESPONSE_TIMEOUT_MS:1000}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions: partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256 hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256

2
msa/edqs/docker/Dockerfile

@ -14,7 +14,7 @@
# limitations under the License. # limitations under the License.
# #
FROM thingsboard/openjdk17:bookworm-slim FROM ${docker.base.image}
COPY start-tb-edqs.sh ${pkg.name}.deb /tmp/ COPY start-tb-edqs.sh ${pkg.name}.deb /tmp/

2
msa/monitoring/docker/Dockerfile

@ -14,7 +14,7 @@
# limitations under the License. # limitations under the License.
# #
FROM thingsboard/openjdk17:bookworm-slim FROM ${docker.base.image}
COPY start-tb-monitoring.sh ${pkg.name}.deb /tmp/ COPY start-tb-monitoring.sh ${pkg.name}.deb /tmp/

1
msa/pom.xml

@ -32,6 +32,7 @@
<properties> <properties>
<main.dir>${basedir}/..</main.dir> <main.dir>${basedir}/..</main.dir>
<docker.repo>thingsboard</docker.repo> <docker.repo>thingsboard</docker.repo>
<docker.base.image>thingsboard/openjdk17:bookworm-slim</docker.base.image>
<dockerfile.skip>true</dockerfile.skip> <dockerfile.skip>true</dockerfile.skip>
<blackBoxTests.skip>true</blackBoxTests.skip> <blackBoxTests.skip>true</blackBoxTests.skip>
<dockerfile-maven.version>1.4.13</dockerfile-maven.version> <dockerfile-maven.version>1.4.13</dockerfile-maven.version>

2
msa/tb-node/docker/Dockerfile

@ -14,7 +14,7 @@
# limitations under the License. # limitations under the License.
# #
FROM thingsboard/openjdk17:bookworm-slim FROM ${docker.base.image}
COPY logback.xml start-tb-node.sh ${pkg.name}.deb /tmp/ COPY logback.xml start-tb-node.sh ${pkg.name}.deb /tmp/

2
msa/transport/coap/docker/Dockerfile

@ -14,7 +14,7 @@
# limitations under the License. # limitations under the License.
# #
FROM thingsboard/openjdk17:bookworm-slim FROM ${docker.base.image}
COPY start-tb-coap-transport.sh ${pkg.name}.deb /tmp/ COPY start-tb-coap-transport.sh ${pkg.name}.deb /tmp/

2
msa/transport/http/docker/Dockerfile

@ -14,7 +14,7 @@
# limitations under the License. # limitations under the License.
# #
FROM thingsboard/openjdk17:bookworm-slim FROM ${docker.base.image}
COPY start-tb-http-transport.sh ${pkg.name}.deb /tmp/ COPY start-tb-http-transport.sh ${pkg.name}.deb /tmp/

2
msa/transport/lwm2m/docker/Dockerfile

@ -14,7 +14,7 @@
# limitations under the License. # limitations under the License.
# #
FROM thingsboard/openjdk17:bookworm-slim FROM ${docker.base.image}
COPY start-tb-lwm2m-transport.sh ${pkg.name}.deb /tmp/ COPY start-tb-lwm2m-transport.sh ${pkg.name}.deb /tmp/

2
msa/transport/mqtt/docker/Dockerfile

@ -14,7 +14,7 @@
# limitations under the License. # limitations under the License.
# #
FROM thingsboard/openjdk17:bookworm-slim FROM ${docker.base.image}
COPY start-tb-mqtt-transport.sh ${pkg.name}.deb /tmp/ COPY start-tb-mqtt-transport.sh ${pkg.name}.deb /tmp/

2
msa/transport/snmp/docker/Dockerfile

@ -14,7 +14,7 @@
# limitations under the License. # limitations under the License.
# #
FROM thingsboard/openjdk17:bookworm-slim FROM ${docker.base.image}
COPY start-tb-snmp-transport.sh ${pkg.name}.deb /tmp/ COPY start-tb-snmp-transport.sh ${pkg.name}.deb /tmp/

2
msa/vc-executor-docker/docker/Dockerfile

@ -14,7 +14,7 @@
# limitations under the License. # limitations under the License.
# #
FROM thingsboard/openjdk17:bookworm-slim FROM ${docker.base.image}
ENV DEBIAN_FRONTEND=noninteractive ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \ RUN apt-get update \

2
msa/vc-executor/src/main/resources/tb-vc-executor.yml

@ -151,6 +151,8 @@ queue:
print-interval-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_MIN_PRINT_INTERVAL_MS:60000}" print-interval-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_MIN_PRINT_INTERVAL_MS:60000}"
# Time to wait for the stats-loading requests to Kafka to finis # Time to wait for the stats-loading requests to Kafka to finis
kafka-response-timeout-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_RESPONSE_TIMEOUT_MS:1000}" kafka-response-timeout-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_RESPONSE_TIMEOUT_MS:1000}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions: partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256 hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256
core: core:

8
packaging/java/build.gradle

@ -92,7 +92,11 @@ buildRpm {
archiveVersion = projectVersion.replace('-', '') archiveVersion = projectVersion.replace('-', '')
archiveFileName = "${pkgName}.rpm" archiveFileName = "${pkgName}.rpm"
requires("(java-17 or java-17-headless or jre-17 or jre-17-headless)") // .or() notation does work in RPM plugin // Support Java 17 (existing), plus Java 21 and Java 25 for RPM-based distros
// Keep using RPM boolean expression syntax since .or() chaining is for DEB only
requires("(java-17 or java-17-headless or jre-17 or jre-17-headless or " +
"java-21 or java-21-headless or jre-21 or jre-21-headless or " +
"java-25 or java-25-headless or jre-25 or jre-25-headless)")
from("${buildDir}/conf") { from("${buildDir}/conf") {
include "${pkgName}.conf" include "${pkgName}.conf"
@ -132,6 +136,8 @@ buildDeb {
archiveFileName = "${pkgName}.deb" archiveFileName = "${pkgName}.deb"
requires("openjdk-17-jre").or("java17-runtime").or("oracle-java17-installer").or("openjdk-17-jre-headless") requires("openjdk-17-jre").or("java17-runtime").or("oracle-java17-installer").or("openjdk-17-jre-headless")
.or("openjdk-21-jre").or("java21-runtime").or("oracle-java21-installer").or("openjdk-21-jre-headless")
.or("openjdk-25-jre").or("java25-runtime").or("oracle-java25-installer").or("openjdk-25-jre-headless")
from("${buildDir}/conf") { from("${buildDir}/conf") {
include "${pkgName}.conf" include "${pkgName}.conf"

2
transport/coap/src/main/resources/tb-coap-transport.yml

@ -332,6 +332,8 @@ queue:
notifications: "${TB_QUEUE_KAFKA_NOTIFICATIONS_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:1;min.insync.replicas:1}" notifications: "${TB_QUEUE_KAFKA_NOTIFICATIONS_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:1;min.insync.replicas:1}"
# Kafka properties for Housekeeper tasks topic # Kafka properties for Housekeeper tasks topic
housekeeper: "${TB_QUEUE_KAFKA_HOUSEKEEPER_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:10;min.insync.replicas:1}" housekeeper: "${TB_QUEUE_KAFKA_HOUSEKEEPER_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:10;min.insync.replicas:1}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions: partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256 hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256
transport_api: transport_api:

2
transport/http/src/main/resources/tb-http-transport.yml

@ -281,6 +281,8 @@ queue:
notifications: "${TB_QUEUE_KAFKA_NOTIFICATIONS_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:1;min.insync.replicas:1}" notifications: "${TB_QUEUE_KAFKA_NOTIFICATIONS_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:1;min.insync.replicas:1}"
# Kafka properties for Housekeeper tasks topic # Kafka properties for Housekeeper tasks topic
housekeeper: "${TB_QUEUE_KAFKA_HOUSEKEEPER_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:10;min.insync.replicas:1}" housekeeper: "${TB_QUEUE_KAFKA_HOUSEKEEPER_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:10;min.insync.replicas:1}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions: partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256 hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256
transport_api: transport_api:

2
transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml

@ -382,6 +382,8 @@ queue:
notifications: "${TB_QUEUE_KAFKA_NOTIFICATIONS_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:1;min.insync.replicas:1}" notifications: "${TB_QUEUE_KAFKA_NOTIFICATIONS_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:1;min.insync.replicas:1}"
# Kafka properties for Housekeeper tasks topic # Kafka properties for Housekeeper tasks topic
housekeeper: "${TB_QUEUE_KAFKA_HOUSEKEEPER_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:10;min.insync.replicas:1}" housekeeper: "${TB_QUEUE_KAFKA_HOUSEKEEPER_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:10;min.insync.replicas:1}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions: partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256 hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256
transport_api: transport_api:

2
transport/mqtt/src/main/resources/tb-mqtt-transport.yml

@ -315,6 +315,8 @@ queue:
notifications: "${TB_QUEUE_KAFKA_NOTIFICATIONS_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:1;min.insync.replicas:1}" notifications: "${TB_QUEUE_KAFKA_NOTIFICATIONS_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:1;min.insync.replicas:1}"
# Kafka properties for Housekeeper tasks topic # Kafka properties for Housekeeper tasks topic
housekeeper: "${TB_QUEUE_KAFKA_HOUSEKEEPER_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:10;min.insync.replicas:1}" housekeeper: "${TB_QUEUE_KAFKA_HOUSEKEEPER_TOPIC_PROPERTIES:retention.ms:604800000;segment.bytes:52428800;retention.bytes:1048576000;partitions:10;min.insync.replicas:1}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions: partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256 hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256
transport_api: transport_api:

2
transport/snmp/src/main/resources/tb-snmp-transport.yml

@ -270,6 +270,8 @@ queue:
print-interval-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_MIN_PRINT_INTERVAL_MS:60000}" print-interval-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_MIN_PRINT_INTERVAL_MS:60000}"
# Time to wait for the stats-loading requests to Kafka to finis # Time to wait for the stats-loading requests to Kafka to finis
kafka-response-timeout-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_RESPONSE_TIMEOUT_MS:1000}" kafka-response-timeout-ms: "${TB_QUEUE_KAFKA_CONSUMER_STATS_RESPONSE_TIMEOUT_MS:1000}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions: partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256 hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256
transport_api: transport_api:

4
ui-ngx/src/app/modules/home/models/entity/entities-table-config.models.ts

@ -236,9 +236,9 @@ export class EntityTableConfig<T extends BaseData<HasId>, P extends PageLink = P
this.table = null; this.table = null;
} }
updateData(closeDetails = false) { updateData(closeDetails = false, reloadEntity = true) {
if (this.table) { if (this.table) {
this.table.updateData(closeDetails); this.table.updateData(closeDetails, reloadEntity);
} else if (this.entityDetailsPage) { } else if (this.entityDetailsPage) {
this.entityDetailsPage.reload(); this.entityDetailsPage.reload();
} }

2
ui-ngx/src/app/modules/home/models/entity/entity-table-component.models.ts

@ -68,7 +68,7 @@ export interface IEntitiesTableComponent {
addEnabled(): boolean; addEnabled(): boolean;
clearSelection(): void; clearSelection(): void;
updateData(closeDetails?: boolean): void; updateData(closeDetails?: boolean, reloadEntity?: boolean): void;
onRowClick($event: Event, entity): void; onRowClick($event: Event, entity): void;
toggleEntityDetails($event: Event, entity); toggleEntityDetails($event: Event, entity);
addEntity($event: Event): void; addEntity($event: Event): void;

2
ui-ngx/src/app/modules/home/pages/asset/asset.component.ts

@ -100,6 +100,6 @@ export class AssetComponent extends EntityComponent<AssetInfo> {
} }
onAssetProfileUpdated() { onAssetProfileUpdated() {
this.entitiesTableConfig.updateData(false); this.entitiesTableConfig.updateData(false, false);
} }
} }

2
ui-ngx/src/app/modules/home/pages/device/device.component.ts

@ -142,7 +142,7 @@ export class DeviceComponent extends EntityComponent<DeviceInfo> {
} }
onDeviceProfileUpdated() { onDeviceProfileUpdated() {
this.entitiesTableConfig.updateData(false); this.entitiesTableConfig.updateData(false, false);
} }
onDeviceProfileChanged(deviceProfile: DeviceProfileInfo) { onDeviceProfileChanged(deviceProfile: DeviceProfileInfo) {

2
ui-ngx/src/app/modules/home/pages/tenant/tenant.component.ts

@ -101,6 +101,6 @@ export class TenantComponent extends ContactBasedComponent<TenantInfo> {
} }
onTenantProfileUpdated() { onTenantProfileUpdated() {
this.entitiesTableConfig.updateData(false); this.entitiesTableConfig.updateData(false, false);
} }
} }

515
ui-ngx/src/assets/locale/locale.constant-da_DK.json

@ -875,14 +875,14 @@
"data-points-storage-days": "Opbevaringsdage for datapunkter", "data-points-storage-days": "Opbevaringsdage for datapunkter",
"device-api": "Enheds-API", "device-api": "Enheds-API",
"email": "E-mail", "email": "E-mail",
"email-messages": "E-mailbeskeder", "email-messages": "E-mail-beskeder",
"email-messages-daily-activity": "Daglig aktivitet for e-mailbeskeder", "email-messages-daily-activity": "Daglig aktivitet for e-mail-beskeder",
"email-messages-monthly-activity": "Månedlig aktivitet for e-mailbeskeder", "email-messages-monthly-activity": "Månedlig aktivitet for e-mail-beskeder",
"executions": "Udførelser", "executions": "Udførelser",
"scripts": "Scripts", "scripts": "Scripts",
"scripts-hourly-activity": "Timebaseret aktivitet for scripts", "scripts-hourly-activity": "Scriptaktivitet pr. time",
"scripts-daily-activity": "Daglig aktivitet for scripts", "scripts-daily-activity": "Scriptaktivitet pr. dag",
"scripts-monthly-activity": "Månedlig aktivitet for scripts", "scripts-monthly-activity": "Scriptaktivitet pr. måned",
"javascript": "JavaScript", "javascript": "JavaScript",
"javascript-executions": "JavaScript-udførelser", "javascript-executions": "JavaScript-udførelser",
"tbel": "TBEL", "tbel": "TBEL",
@ -1002,15 +1002,15 @@
"type-sms-sent": "SMS sendt" "type-sms-sent": "SMS sendt"
}, },
"debug-settings": { "debug-settings": {
"label": "Fejlsøgningskonfiguration", "label": "Fejlfindingskonfiguration",
"on-failure": "Kun fejl (24/7)", "on-failure": "Kun fejl (24/7)",
"all-messages": "Alle beskeder ({{time}})", "all-messages": "Alle beskeder ({{time}})",
"failures": "Fejl", "failures": "Fejl",
"entity": "enhed", "entity": "enhed",
"hint": { "hint": {
"main-limited": "Alle {{entity}} fejlsøgningsbeskeder vil blive hastighedsbegrænset, med maksimalt {{msg}} beskeder tilladt pr. {{time}}.", "main-limited": "Der vil blive logget højst {{msg}} {{entity}} fejlfindingsbeskeder pr. {{time}}.",
"on-failure": "Gem alle fejlsøgningshændelser uden tidsbegrænsning.", "on-failure": "Log kun fejlbeskeder.",
"all-messages": "Gem alle fejlsøgningshændelser i en tidsbegrænset periode." "all-messages": "Log alle fejlfindingsbeskeder."
} }
}, },
"calculated-fields": { "calculated-fields": {
@ -1111,13 +1111,15 @@
"mistral-ai": "Mistral AI", "mistral-ai": "Mistral AI",
"anthropic": "Anthropic", "anthropic": "Anthropic",
"amazon-bedrock": "Amazon Bedrock", "amazon-bedrock": "Amazon Bedrock",
"github-models": "GitHub-modeller" "github-models": "GitHub-modeller",
"ollama": "Ollama"
}, },
"name-required": "Navn er påkrævet.", "name-required": "Navn er påkrævet.",
"name-max-length": "Navn må højst være 255 tegn.", "name-max-length": "Navn må højst være 255 tegn.",
"provider": "Udbyder", "provider": "Udbyder",
"api-key": "API-nøgle", "api-key": "API-nøgle",
"api-key-required": "API-nøgle er påkrævet.", "api-key-required": "API-nøgle er påkrævet.",
"api-key-open-ai-required": "API-nøgle er påkrævet ved brug af den officielle OpenAI API.",
"project-id": "Projekt-ID", "project-id": "Projekt-ID",
"project-id-required": "Projekt-ID er påkrævet", "project-id-required": "Projekt-ID er påkrævet",
"location": "Placering", "location": "Placering",
@ -1152,19 +1154,36 @@
"presence-penalty": "Tilstedeværelsesstraf", "presence-penalty": "Tilstedeværelsesstraf",
"presence-penalty-hint": "Påfører en fast straf på sandsynligheden for et token, hvis det allerede er optrådt i teksten.", "presence-penalty-hint": "Påfører en fast straf på sandsynligheden for et token, hvis det allerede er optrådt i teksten.",
"frequency-penalty": "Frekvensstraf", "frequency-penalty": "Frekvensstraf",
"frequency-penalty-hint": "Påfører en straf på et tokens sandsynlighed, som stiger baseret på dets hyppighed i teksten.", "frequency-penalty-hint": "Anvender en straf på sandsynligheden for et token, som stiger afhængigt af dets hyppighed i teksten.",
"max-output-tokens": "Maksimalt outputtokens", "max-output-tokens": "Maksimalt antal output-tokens",
"max-output-tokens-min": "Skal være større end 0.", "max-output-tokens-hint": "Angiver det maksimale antal tokens, som \nmodellen kan generere i ét svar.",
"max-output-tokens-hint": "Angiver det maksimale antal tokens, som modellen kan generere i ét svar.", "context-length": "Kontekstens længde",
"context-length-hint": "Definerer størrelsen på kontekstvinduet i tokens. Denne værdi angiver den samlede hukommelsesgrænse for modellen, inklusiv både brugerens input og det genererede svar.",
"endpoint": "Endpoint", "endpoint": "Endpoint",
"endpoint-required": "Endpoint er påkrævet.", "endpoint-required": "Endpoint er påkrævet.",
"baseurl": "Base-URL",
"baseurl-required": "Base-URL er påkrævet.",
"service-version": "Serviceversion", "service-version": "Serviceversion",
"check-connectivity": "Tjek forbindelsen", "check-connectivity": "Tjek forbindelsen",
"check-connectivity-success": "Testanmodningen var vellykket", "check-connectivity-success": "Testanmodningen blev gennemført med succes",
"check-connectivity-failed": "Testanmodningen mislykkedes", "check-connectivity-failed": "Testanmodningen mislykkedes",
"no-model-matching": "Ingen modeller, der matcher '{{entity}}', blev fundet.", "no-model-matching": "Ingen modeller, der matcher '{{entity}}', blev fundet.",
"model-required": "Model er påkrævet.", "model-required": "Model er påkrævet.",
"no-model-text": "Ingen modeller fundet." "no-model-text": "Ingen modeller fundet.",
"authentication": "Godkendelse",
"authentication-basic-hint": "Bruger standard HTTP Basic-godkendelse. Brugernavn og adgangskode kombineres, Base64-kodes og sendes i en \"Authorization\"-header med hver anmodning til Ollama-serveren.",
"authentication-token-hint": "Bruger Bearer-token-godkendelse. Det angivne token sendes direkte i en \"Authorization\"-header med hver anmodning til Ollama-serveren.",
"authentication-type": {
"none": "Ingen",
"basic": "Basic",
"token": "Token"
},
"username": "Brugernavn",
"username-required": "Brugernavn er påkrævet.",
"password": "Adgangskode",
"password-required": "Adgangskode er påkrævet.",
"token": "Token",
"token-required": "Token er påkrævet."
}, },
"confirm-on-exit": { "confirm-on-exit": {
"message": "Du har ikke gemte ændringer. Er du sikker på, at du vil forlade denne side?", "message": "Du har ikke gemte ændringer. Er du sikker på, at du vil forlade denne side?",
@ -2237,12 +2256,12 @@
"tqs": "TQS: Både TCP og SMS aktive; TCP i køtilstand, SMS i standardtilstand (ikke understøttet fra LWM2M 1.1)", "tqs": "TQS: Både TCP og SMS aktive; TCP i køtilstand, SMS i standardtilstand (ikke understøttet fra LWM2M 1.1)",
"sq": "SQ: SMS i køtilstand (ikke understøttet fra LWM2M 1.1)" "sq": "SQ: SMS i køtilstand (ikke understøttet fra LWM2M 1.1)"
}, },
"binding-tooltip": "Angiver understøttede bindingstyper i klienten (/1/x/7). Bør matche værdien i “Supported Binding and Modes” i enhedsobjektet (/3/0/16). Kun én transportbinding kan bruges per session.", "binding-tooltip": "Dette er listen i \"binding\"-ressourcen for LwM2M-serverobjektet – /1/x/7.\nAngiver de understøttede bindingstilstande i LwM2M-klienten.\nDenne værdi BØR være den samme som værdien i ressourcen \"Supported Binding and Modes\" i enhedsobjektet (/3/0/16).\nSelvom flere transportmetoder understøttes, kan kun én transportbinding anvendes under hele transportsessionen.\nFor eksempel, når både UDP og SMS understøttes, kan LwM2M-klienten og LwM2M-serveren vælge at kommunikere enten via UDP eller SMS under hele transportsessionen.",
"bootstrap-server": "Bootstrap-server", "bootstrap-server": "Bootstrap-server",
"lwm2m-server": "LwM2M-server", "lwm2m-server": "LwM2M-server",
"include-bootstrap-server": "Inkluder Bootstrap Server-opdateringer", "include-bootstrap-server": "Inkludér opdateringer til Bootstrap-server",
"bootstrap-update-title": "Du har allerede konfigureret Bootstrap-server. Er du sikker på, at du vil udelukke opdateringerne?", "bootstrap-update-title": "Du har allerede konfigureret en Bootstrap-server. Er du sikker på, at du vil udelukke opdateringerne?",
"bootstrap-update-text": "Vær forsigtig, efter bekræftelse vil Bootstrap Server-konfigurationen ikke kunne gendannes.", "bootstrap-update-text": "Vær opmærksom på, at efter bekræftelse vil konfigurationsdataene for Bootstrap-serveren ikke kunne gendannes.",
"server-host": "Host", "server-host": "Host",
"server-host-required": "Host er påkrævet.", "server-host-required": "Host er påkrævet.",
"server-port": "Port", "server-port": "Port",
@ -4308,8 +4327,8 @@
"current-password": "Nuværende adgangskode", "current-password": "Nuværende adgangskode",
"copy-jwt-token": "Kopiér JWT-token", "copy-jwt-token": "Kopiér JWT-token",
"jwt-token": "JWT-token", "jwt-token": "JWT-token",
"token-valid-till": "Token er gyldig til", "token-valid-till": "Token er gyldig indtil",
"tokenCopiedSuccessMessage": "JWT-token er kopieret til udklipsholderen", "tokenCopiedSuccessMessage": "JWT-token er blevet kopieret til udklipsholderen",
"tokenCopiedWarnMessage": "JWT-token er udløbet! Opdater venligst siden." "tokenCopiedWarnMessage": "JWT-token er udløbet! Opdater venligst siden."
}, },
"profiles": { "profiles": {
@ -4476,17 +4495,23 @@
"title-max-length": "Titel skal være mindre end 256 tegn", "title-max-length": "Titel skal være mindre end 256 tegn",
"type": { "type": {
"jks": "JKS", "jks": "JKS",
"js-module": "JS modul", "js-module": "JS-modul",
"lwm2m-model": "LWM2M model", "lwm2m-model": "LWM2M-model",
"pkcs-12": "PKCS #12" "pkcs-12": "PKCS #12",
"general": "Generelt"
}, },
"resource-sub-type": "Undertype", "resource-sub-type": "Undertype",
"sub-type": { "sub-type": {
"image": "billede", "image": "billede",
"scada-symbol": "Scada symbol", "scada-symbol": "SCADA-symbol",
"extension": "Udvidelse", "extension": "Udvidelse",
"module": "Modul" "module": "Modul"
} },
"resource-is-in-use": "Ressourcen bruges af andre entiteter",
"resources-are-in-use": "Ressourcerne bruges af andre entiteter",
"resource-is-in-use-text": "Ressourcen <b>'{{title}}'</b> blev ikke slettet, fordi den bruges af følgende entiteter:",
"resources-are-in-use-text": "Ikke alle ressourcer blev slettet, fordi de bruges af andre entiteter.</br>Du kan se de refererede entiteter ved at klikke på knappen <b>Referencer</b> i den tilsvarende ressource-række.</br>Hvis du stadig ønsker at slette disse ressourcer, skal du vælge dem i tabellen nedenfor og klikke på knappen <b>Slet valgte</b>.",
"delete-resource-in-use-text": "Hvis du stadig ønsker at slette ressourcen, skal du klikke på knappen <b>Slet alligevel</b>."
}, },
"javascript": { "javascript": {
"add": "Tilføj JavaScript-ressource", "add": "Tilføj JavaScript-ressource",
@ -4700,13 +4725,13 @@
"customer-cache-expiration-hint": "Angiver maksimumsinterval for gemte kundedata. 0 = aldrig udløber.", "customer-cache-expiration-hint": "Angiver maksimumsinterval for gemte kundedata. 0 = aldrig udløber.",
"customer-cache-expiration-required": "Cache udløbstid for kunder er påkrævet.", "customer-cache-expiration-required": "Cache udløbstid for kunder er påkrævet.",
"customer-cache-expiration-range": "Udløbstiden skal være ≥ 0.", "customer-cache-expiration-range": "Udløbstiden skal være ≥ 0.",
"interval-start": "Interval start", "interval-start": "Start af interval",
"interval-end": "Interval slut", "interval-end": "Intervalslut",
"time-unit": "Tidsenhed", "time-unit": "Tidsenhed",
"fetch-mode": "Hentetilstand", "fetch-mode": "Hentemåde",
"order-by-timestamp": "Sorter efter tidsstempel", "order-by-timestamp": "Sorter efter tidsstempel",
"limit": "Grænse", "limit": "Grænse",
"limit-hint": "Min: 2, maks: 1000. Vælg 'First' eller 'Last' for én post.", "limit-hint": "Min. grænseværdi er 2, maks. 1000. Hvis du vil hente én enkelt post, skal du vælge hentemåde 'Første' eller 'Sidste'.",
"limit-required": "Grænse er påkrævet.", "limit-required": "Grænse er påkrævet.",
"limit-range": "Grænsen skal være mellem 2 og 1000.", "limit-range": "Grænsen skal være mellem 2 og 1000.",
"time-unit-milliseconds": "Millisekunder", "time-unit-milliseconds": "Millisekunder",
@ -4714,9 +4739,9 @@
"time-unit-minutes": "Minutter", "time-unit-minutes": "Minutter",
"time-unit-hours": "Timer", "time-unit-hours": "Timer",
"time-unit-days": "Dage", "time-unit-days": "Dage",
"time-value-range": "Værdien skal være mellem 1 og 2147483647.", "time-value-range": "Tilladt område er fra 1 til 2147483647.",
"start-interval-value-required": "Interval start er påkrævet.", "start-interval-value-required": "Intervalstart er påkrævet.",
"end-interval-value-required": "Interval slut er påkrævet.", "end-interval-value-required": "Intervalslut er påkrævet.",
"filter": "Filter", "filter": "Filter",
"switch": "Skift", "switch": "Skift",
"math-templatization-tooltip": "Understøtter templatisering via $[messageKey] og ${metadataKey}.", "math-templatization-tooltip": "Understøtter templatisering via $[messageKey] og ${metadataKey}.",
@ -4759,7 +4784,7 @@
"copy-from": "Kopiér fra", "copy-from": "Kopiér fra",
"data-to-metadata": "Data til metadata", "data-to-metadata": "Data til metadata",
"metadata-to-data": "Metadata til data", "metadata-to-data": "Metadata til data",
"use-regular-expression-hint": "Brug regulært udtryk for at kopiere nøgler efter mønster.\n\nTips:\nTryk 'Enter' for at bekræfte feltinput.\nTryk 'Backspace' for at slette felt. Flere felter understøttes.", "use-regular-expression-hint": "Brug regulært udtryk til at kopiere nøgler efter mønster.\n\nTips og tricks:\nTryk på 'Enter' for at fuldføre indtastning af feltnavn.\nTryk på 'Backspace' for at slette feltnavn. Flere feltnavne understøttes.",
"interval": "Interval", "interval": "Interval",
"interval-required": "Interval er påkrævet", "interval-required": "Interval er påkrævet",
"interval-hint": "Dedupliceringsinterval i sekunder.", "interval-hint": "Dedupliceringsinterval i sekunder.",
@ -4812,7 +4837,7 @@
"latest-telemetry": "Seneste telemetri", "latest-telemetry": "Seneste telemetri",
"add-telemetry-key": "Tilføj telemetrinøgle", "add-telemetry-key": "Tilføj telemetrinøgle",
"delete-from": "Slet fra", "delete-from": "Slet fra",
"use-regular-expression-delete-hint": "Brug regulært udtryk til sletning efter mønster.\n\nTips:\nTryk 'Enter' for at bekræfte.\nTryk 'Backspace' for at slette.", "use-regular-expression-delete-hint": "Brug regulært udtryk til at slette nøgler efter mønster.\n\nTips og tricks:\nTryk på 'Enter' for at afslutte feltindtastning.\nTryk på 'Backspace' for at slette feltnavn.\nFlere feltnavne understøttes.",
"fetch-into": "Hent til", "fetch-into": "Hent til",
"attr-mapping": "Attributmapping:", "attr-mapping": "Attributmapping:",
"source-attribute": "Kildeattribut", "source-attribute": "Kildeattribut",
@ -4823,11 +4848,11 @@
"target-key-required": "Målnøgle er påkrævet.", "target-key-required": "Målnøgle er påkrævet.",
"attr-mapping-required": "Mindst én mapping skal angives.", "attr-mapping-required": "Mindst én mapping skal angives.",
"fields-mapping": "Feltermapping", "fields-mapping": "Feltermapping",
"fields-mapping-hint": "Brug $entityId for at gemme afsenderens id.", "fields-mapping-hint": "Hvis beskedfeltet er sat til $entityId, vil oprindelses-id for beskeden blive gemt i den angivne tabelkolonne.",
"relations-query-config-direction-suffix": "afsender", "relations-query-config-direction-suffix": "afsender",
"profile-name": "Profilnavn", "profile-name": "Profilnavn",
"fetch-circle-parameter-info-from-metadata-hint": "Metadatafelt '{{perimeterKeyName}}' skal være i formatet: {\"latitude\":48.196, \"longitude\":24.6532, \"radius\":100.0, \"radiusUnit\":\"METER\"}", "fetch-circle-parameter-info-from-metadata-hint": "Metadatafeltet '{{perimeterKeyName}}' skal være i følgende format: {\"latitude\":48.196, \"longitude\":24.6532, \"radius\":100.0, \"radiusUnit\":\"METER\"}",
"fetch-poligon-parameter-info-from-metadata-hint": "Metadatafelt '{{perimeterKeyName}}' skal være i formatet: [[48.19736,24.65235],...]", "fetch-poligon-parameter-info-from-metadata-hint": "Metadatafeltet '{{perimeterKeyName}}' skal være i følgende format: [[48.19736,24.65235],[48.19800,24.65060],...,[48.19849,24.65420]]",
"short-templatization-tooltip": "Brug $[messageKey] og ${metadataKey} til at hente værdier.", "short-templatization-tooltip": "Brug $[messageKey] og ${metadataKey} til at hente værdier.",
"fields-mapping-required": "Mindst én feltmapping er påkrævet.", "fields-mapping-required": "Mindst én feltmapping er påkrævet.",
"at-least-one-field-required": "Mindst ét inputfelt skal have en værdi.", "at-least-one-field-required": "Mindst ét inputfelt skal have en værdi.",
@ -4918,8 +4943,8 @@
"mail-body-type": "Indholdstype", "mail-body-type": "Indholdstype",
"body-type-template": "Indholdstypemønster", "body-type-template": "Indholdstypemønster",
"reply-routing-configuration": "Svarrute-konfiguration", "reply-routing-configuration": "Svarrute-konfiguration",
"rpc-reply-routing-configuration-hint": "Konfiguration for at identificere tjeneste, session og anmodning i metadata.", "rpc-reply-routing-configuration-hint": "Disse konfigurationsparametre angiver metadata-nøglenavne, der bruges til at identificere tjenesten, sessionen og anmodningen til at sende et svar tilbage.",
"reply-routing-configuration-hint": "Konfiguration for at identificere tjeneste og anmodning i metadata.", "reply-routing-configuration-hint": "Disse konfigurationsparametre angiver metadata-nøglenavne, der bruges til at identificere tjenesten og anmodningen til at sende et svar tilbage.",
"request-id-metadata-attribute": "Anmodnings-id", "request-id-metadata-attribute": "Anmodnings-id",
"service-id-metadata-attribute": "Tjeneste-id", "service-id-metadata-attribute": "Tjeneste-id",
"session-id-metadata-attribute": "Session-id", "session-id-metadata-attribute": "Session-id",
@ -4947,7 +4972,7 @@
"value-required": "Værdi er påkrævet", "value-required": "Værdi er påkrævet",
"topic-pattern": "Emnemønster", "topic-pattern": "Emnemønster",
"key-pattern": "Nøglemønster", "key-pattern": "Nøglemønster",
"key-pattern-hint": "Valgfri. Angiv partition eller nøgle til brug ved sending.", "key-pattern-hint": "Valgfrit. Hvis et gyldigt partitionsnummer er angivet, vil det blive brugt ved afsendelse af posten. Hvis ingen partition er angivet, vil nøglen blive brugt i stedet. Hvis ingen af delene er angivet, tildeles en partition i en round-robin-rækkefølge.",
"topic-pattern-required": "Emnemønster er påkrævet", "topic-pattern-required": "Emnemønster er påkrævet",
"topic": "Emne", "topic": "Emne",
"topic-required": "Emne er påkrævet", "topic-required": "Emne er påkrævet",
@ -4956,18 +4981,18 @@
"other-properties": "Andre egenskaber", "other-properties": "Andre egenskaber",
"key": "Nøgle", "key": "Nøgle",
"key-required": "Nøgle er påkrævet", "key-required": "Nøgle er påkrævet",
"retries": "Antal genforsøg ved fejl", "retries": "Antal automatiske forsøg ved fejl",
"min-retries-message": "Kun 0 genforsøg tilladt som minimum", "min-retries-message": "Kun 0 som minimumsantal forsøg er tilladt.",
"batch-size-bytes": "Batchstørrelse i bytes", "batch-size-bytes": "Batchstørrelse ved afsendelse (i bytes)",
"min-batch-size-bytes-message": "Minimum batchstørrelse er 0", "min-batch-size-bytes-message": "Kun 0 som minimum batchstørrelse er tilladt.",
"linger-ms": "Buffer-tid lokalt (ms)", "linger-ms": "Tidsbuffer lokalt (ms)",
"min-linger-ms-message": "Minimum 0 ms tilladt", "min-linger-ms-message": "Kun 0 ms som minimumværdi er tilladt.",
"buffer-memory-bytes": "Maks. bufferstørrelse (bytes)", "buffer-memory-bytes": "Maksimal klientbufferstørrelse (i bytes)",
"min-buffer-memory-message": "Minimum bufferstørrelse er 0", "min-buffer-memory-message": "Kun 0 som minimum bufferstørrelse er tilladt.",
"memory-buffer-size-range": "Bufferstørrelse skal være mellem 0 og {{max}} KB", "memory-buffer-size-range": "Bufferstørrelsen skal være mellem 0 og {{max}} KB",
"acks": "Antal kvitteringer", "acks": "Antal bekræftelser",
"topic-arn-pattern": "ARN-emnemønster", "topic-arn-pattern": "Emne-ARN-mønster",
"topic-arn-pattern-required": "ARN-emnemønster er påkrævet", "topic-arn-pattern-required": "Emne-ARN-mønster er påkrævet",
"aws-access-key-id": "AWS Access Key ID", "aws-access-key-id": "AWS Access Key ID",
"aws-access-key-id-required": "AWS Access Key ID er påkrævet", "aws-access-key-id-required": "AWS Access Key ID er påkrævet",
"aws-secret-access-key": "AWS Secret Access Key", "aws-secret-access-key": "AWS Secret Access Key",
@ -4987,35 +5012,35 @@
"password": "Adgangskode", "password": "Adgangskode",
"automatic-recovery": "Automatisk gendannelse", "automatic-recovery": "Automatisk gendannelse",
"connection-timeout-ms": "Forbindelsestimeout (ms)", "connection-timeout-ms": "Forbindelsestimeout (ms)",
"min-connection-timeout-ms-message": "Minimum værdi er 0 ms", "min-connection-timeout-ms-message": "Kun 0 ms som minimumværdi er tilladt.",
"handshake-timeout-ms": "Handshake-timeout (ms)", "handshake-timeout-ms": "Tidsgrænse for håndtryk (ms)",
"min-handshake-timeout-ms-message": "Minimum værdi er 0 ms", "min-handshake-timeout-ms-message": "Kun 0 ms som minimumværdi er tilladt.",
"client-properties": "Klientegenskaber", "client-properties": "Klientegenskaber",
"queue-url-pattern": "Kø-URL mønster", "queue-url-pattern": "Køens URL-mønster",
"queue-url-pattern-required": "Kø-URL mønster er påkrævet", "queue-url-pattern-required": "Køens URL-mønster er påkrævet",
"delay-seconds": "Forsinkelse (sekunder)", "delay-seconds": "Forsinkelse (sekunder)",
"min-delay-seconds-message": "Minimum forsinkelse er 0 sekunder", "min-delay-seconds-message": "Kun 0 sekunder som minimumværdi er tilladt.",
"max-delay-seconds-message": "Maksimal forsinkelse er 900 sekunder", "max-delay-seconds-message": "Maksimum tilladt værdi er 900 sekunder.",
"name": "Navn", "name": "Navn",
"name-required": "Navn er påkrævet", "name-required": "Navn er påkrævet.",
"queue-type": "Køtype", "queue-type": "Køtype",
"sqs-queue-standard": "Standard", "sqs-queue-standard": "Standard",
"sqs-queue-fifo": "FIFO", "sqs-queue-fifo": "FIFO",
"gcp-project-id": "GCP-projekt-ID", "gcp-project-id": "GCP-projekt-ID",
"gcp-project-id-required": "GCP-projekt-ID er påkrævet", "gcp-project-id-required": "GCP-projekt-ID er påkrævet",
"gcp-service-account-key": "GCP servicekonto-nøglefil", "gcp-service-account-key": "GCP-servicekonto-nøglefil",
"gcp-service-account-key-required": "GCP servicekonto-nøglefil er påkrævet", "gcp-service-account-key-required": "GCP-servicekonto-nøglefil er påkrævet",
"pubsub-topic-name": "Emnenavn", "pubsub-topic-name": "Emnenavn",
"pubsub-topic-name-required": "Emnenavn er påkrævet", "pubsub-topic-name-required": "Emnenavn er påkrævet",
"message-attributes": "Beskedattributter", "message-attributes": "Beskedattributter",
"message-attributes-hint": "Brug <code><span style=\"color: #000;\">$&#123;</span>metadataKey<span style=\"color: #000000;\">&#125;</span></code> for værdi fra metadata, <code><span style=\"color: #000;\">$[</span>messageKey<span style=\"color: #000;\">]</span></code> for værdi fra meddelelsesindhold i navn-/værdifelter", "message-attributes-hint": "Brug <code><span style=\"color: #000;\">$&#123;</span>metadataKey<span style=\"color: #000000;\">&#125;</span></code> for værdi fra metadata, <code><span style=\"color: #000;\">$[</span>messageKey<span style=\"color: #000;\">]</span></code> for værdi fra beskedens indhold i felterne navn/værdi.",
"connect-timeout": "Forbindelsestimeout (sek)", "connect-timeout": "Forbindelsestidsgrænse (sek.)",
"connect-timeout-required": "Forbindelsestimeout er påkrævet.", "connect-timeout-required": "Forbindelsestidsgrænse er påkrævet.",
"connect-timeout-range": "Timeout skal være mellem 1 og 200.", "connect-timeout-range": "Forbindelsestidsgrænsen skal være mellem 1 og 200.",
"client-id": "Klient-ID", "client-id": "Klient-ID",
"client-id-hint": "Valgfri. Lad være tomt for automatisk generering. For at undgå konflikter i mikrotjenester, brug unikke ID’er.", "client-id-hint": "Valgfrit. Lad stå tomt for automatisk genereret Klient-ID. Vær forsigtig ved angivelse af Klient-ID. De fleste MQTT-brokere tillader ikke flere forbindelser med samme Klient-ID. Hvis du forbinder til sådanne brokere, skal din MQTT Klient-ID være unik. Når platformen kører i mikroservicetilstand, startes en kopi af regelnoden i hver mikroservice. Dette vil automatisk føre til flere MQTT-klienter med samme ID og kan forårsage fejl i regelnoden. For at undgå sådanne fejl skal du aktivere \"Tilføj Service-ID som suffiks til Klient-ID\" nedenfor.",
"append-client-id-suffix": "Tilføj service-ID som suffix til klient-ID", "append-client-id-suffix": "Tilføj Service-ID som suffiks til Klient-ID",
"client-id-suffix-hint": "Valgfrit. Anvendes når \"Client ID\" er angivet eksplicit. Hvis valgt, tilføjes Service ID som et suffiks til Client ID. Hjælper med at undgå fejl, når platformen kører i microservices-tilstand.", "client-id-suffix-hint": "Valgfrit. Anvendes når \"Klient-ID\" er angivet manuelt. Hvis valgt, tilføjes Service-ID som suffiks til Klient-ID. Hjælper med at undgå fejl, når platformen kører i mikroservicetilstand.",
"device-id": "Enheds-ID", "device-id": "Enheds-ID",
"device-id-required": "Enheds-ID er påkrævet.", "device-id-required": "Enheds-ID er påkrævet.",
"clean-session": "Ren session", "clean-session": "Ren session",
@ -5043,23 +5068,23 @@
"private-key-password": "Adgangskode til privat nøgle", "private-key-password": "Adgangskode til privat nøgle",
"use-system-smtp-settings": "Brug systemets SMTP-indstillinger", "use-system-smtp-settings": "Brug systemets SMTP-indstillinger",
"use-metadata-dynamic-interval": "Brug dynamisk interval", "use-metadata-dynamic-interval": "Brug dynamisk interval",
"metadata-dynamic-interval-hint": "Intervalstart og -slut felterne understøtter skabeloner. Brug $[messageKey] eller ${metadataKey}.", "metadata-dynamic-interval-hint": "Indtastningsfelterne for intervalstart og -slut understøtter skabelonbrug. Bemærk, at den indsatte skabelonværdi skal være angivet i millisekunder. Brug $[messageKey] for at hente værdi fra beskeden og ${metadataKey} for at hente værdi fra metadata.",
"use-metadata-interval-patterns-hint": "Hvis valgt, bruges mønstre fra metadata eller data til interval.", "use-metadata-interval-patterns-hint": "Hvis valgt, bruger regelnoden start- og slutmønstre for interval fra beskedens metadata eller data, forudsat at intervallerne er i millisekunder.",
"use-message-alarm-data": "Brug alarmdata fra besked", "use-message-alarm-data": "Brug alarmdata fra besked",
"overwrite-alarm-details": "Overskriv alarmdetaljer", "overwrite-alarm-details": "Overskriv alarmdetaljer",
"use-alarm-severity-pattern": "Brug mønster for alarmens alvorlighed", "use-alarm-severity-pattern": "Brug mønster for alarmens alvorlighedsgrad",
"check-all-keys": "Tjek at alle specificerede felter er til stede", "check-all-keys": "Tjek, at alle angivne felter er til stede",
"check-all-keys-hint": "Tjekker at alle nøgler findes i data og metadata.", "check-all-keys-hint": "Hvis valgt, kontrolleres det, at alle angivne nøgler er til stede i beskeddata og metadata.",
"check-relation-to-specific-entity": "Tjek relation til specifik enhed", "check-relation-to-specific-entity": "Tjek relation til specifik entitet",
"check-relation-to-specific-entity-tooltip": "Tjekker om relation eksisterer til en specifik eller hvilken som helst enhed baseret på type og retning.", "check-relation-to-specific-entity-tooltip": "Hvis aktiveret, kontrolleres tilstedeværelsen af relation til en specifik entitet. Ellers kontrolleres tilstedeværelsen af relation til en vilkårlig entitet. I begge tilfælde foretages relationsopslag baseret på konfigureret retning og type.",
"check-relation-hint": "Tjek for relation til bestemt eller vilkårlig enhed.", "check-relation-hint": "Kontrollerer eksistensen af relation til en specifik eller vilkårlig entitet baseret på retning og relationstype.",
"delete-relation-with-specific-entity": "Slet relation med specifik enhed", "delete-relation-with-specific-entity": "Slet relation til specifik entitet",
"delete-relation-with-specific-entity-hint": "Sletter relation med en bestemt enhed. Ellers slettes alle matchende relationer.", "delete-relation-with-specific-entity-hint": "Hvis aktiveret, slettes kun relationen til én specifik entitet. Ellers fjernes relationer til alle matchende entiteter.",
"delete-relation-hint": "Sletter relation fra oprindelsen til den angivne enhed eller liste af enheder.", "delete-relation-hint": "Sletter relation fra afsenderen af den indgående besked til den angivne entitet eller entitetsliste baseret på retning og type.",
"remove-current-relations": "Fjern nuværende relationer", "remove-current-relations": "Fjern nuværende relationer",
"remove-current-relations-hint": "Fjerner nuværende relationer baseret på type og retning.", "remove-current-relations-hint": "Fjerner nuværende relationer fra afsenderen af den indgående besked baseret på retning og type.",
"change-originator-to-related-entity": "Skift oprindelse til relateret enhed", "change-originator-to-related-entity": "Skift afsender til relateret entitet",
"change-originator-to-related-entity-hint": "Behandler beskeden som om den kommer fra en anden enhed.", "change-originator-to-related-entity-hint": "Anvendes til at behandle en besked som om den kommer fra en anden entitet.",
"start-interval": "Interval start", "start-interval": "Interval start",
"end-interval": "Interval slut", "end-interval": "Interval slut",
"start-interval-required": "Interval start er påkrævet.", "start-interval-required": "Interval start er påkrævet.",
@ -5119,31 +5144,31 @@
"email-sender": "Email afsender", "email-sender": "Email afsender",
"fields-to-check": "Felter der skal kontrolleres", "fields-to-check": "Felter der skal kontrolleres",
"add-detail": "Tilføj detalje", "add-detail": "Tilføj detalje",
"check-all-keys-tooltip": "Kontrollerer, at alle angivne felter findes i besked og metadata.", "check-all-keys-tooltip": "Hvis aktiveret, kontrolleres tilstedeværelsen af alle felter, der er angivet i besked- og metadatafeltnavne, i den indgående besked og dens metadata.",
"fields-to-check-hint": "Tryk på \"Enter\" for at afslutte. Flere felter understøttes.", "fields-to-check-hint": "Tryk på \"Enter\" for at afslutte indtastning af feltnavn. Flere feltnavne understøttes.",
"entity-details-list-empty": "Mindst én detalje skal vælges.", "entity-details-list-empty": "Mindst ét detaljefelt skal vælges.",
"alarm-status": "Alarmstatus", "alarm-status": "Alarmstatus",
"alarm-required": "Mindst én alarmstatus skal vælges.", "alarm-required": "Mindst én alarmstatus skal vælges.",
"no-entity-details-matching": "Ingen tilsvarende entitetsdetaljer fundet.", "no-entity-details-matching": "Ingen matchende entitetsdetaljer blev fundet.",
"custom-table-name": "Brugertabelnavn", "custom-table-name": "Brugertilpasset tabelnavn",
"custom-table-name-required": "Tabelnavn er påkrævet", "custom-table-name-required": "Tabelnavn er påkrævet",
"custom-table-hint": "Skal starte med 'cs_tb_'. Angiv uden præfikset.", "custom-table-hint": "Tabellen skal være oprettet i din Cassandra-klynge, og dens navn skal starte med præfikset 'cs_tb_' for at undgå indsættelse af data i de fælles TB-tabeller. Indtast tabelnavnet her uden 'cs_tb_'-præfikset.",
"message-field": "Beskedfelt", "message-field": "Beskedfelt",
"message-field-required": "Beskedfelt er påkrævet.", "message-field-required": "Beskedfelt er påkrævet.",
"table-col": "Tabelkolonne", "table-col": "Tabelkolonne",
"table-col-required": "Tabelkolonne er påkrævet.", "table-col-required": "Tabelkolonne er påkrævet.",
"latitude-field-name": "Navn på breddegradsfelt", "latitude-field-name": "Feltnavn for breddegrad",
"longitude-field-name": "Navn på længdegradsfelt", "longitude-field-name": "Feltnavn for længdegrad",
"latitude-field-name-required": "Navn på breddegradsfelt er påkrævet.", "latitude-field-name-required": "Feltnavn for breddegrad er påkrævet.",
"longitude-field-name-required": "Navn på længdegradsfelt er påkrævet.", "longitude-field-name-required": "Feltnavn for længdegrad er påkrævet.",
"fetch-perimeter-info-from-metadata": "Hent perimeteroplysninger fra metadata", "fetch-perimeter-info-from-metadata": "Hent perimeterinformation fra metadata",
"fetch-perimeter-info-from-metadata-tooltip": "Parser metadatafelt for cirkel eller polygon afhængigt af perimeter-typen.", "fetch-perimeter-info-from-metadata-tooltip": "Hvis perimeter-typen er sat til 'Polygon', vil værdien af metadatafeltet '{{perimeterKeyName}}' blive brugt direkte som definitionsværdi uden yderligere parsing. Hvis perimeter-typen er sat til 'Circle', vil værdien af '{{perimeterKeyName}}'-metadatafeltet blive parseret for at udtrække felterne 'latitude', 'longitude', 'radius', og 'radiusUnit', som bruges til at definere cirkelperimeteren.",
"perimeter-key-name": "Perimeter nøgle navn", "perimeter-key-name": "Perimeter-nøgle",
"perimeter-key-name-hint": "Metadata felt med perimeter info.", "perimeter-key-name-hint": "Navn på metadatafelt, der indeholder perimeterinformation.",
"perimeter-key-name-required": "Perimeter nøgle navn er påkrævet.", "perimeter-key-name-required": "Perimeter-nøgle er påkrævet.",
"perimeter-circle": "Cirkel", "perimeter-circle": "Cirkel",
"perimeter-polygon": "Polygon", "perimeter-polygon": "Polygon",
"perimeter-type": "Perimeter type", "perimeter-type": "Perimeter-type",
"circle-center-latitude": "Cirkelens center breddegrad", "circle-center-latitude": "Cirkelens center breddegrad",
"circle-center-latitude-required": "Center breddegrad er påkrævet.", "circle-center-latitude-required": "Center breddegrad er påkrævet.",
"circle-center-longitude": "Cirkelens center længdegrad", "circle-center-longitude": "Cirkelens center længdegrad",
@ -5155,25 +5180,25 @@
"range-unit-nautical-mile": "Sømil", "range-unit-nautical-mile": "Sømil",
"range-units": "Afstandsenheder", "range-units": "Afstandsenheder",
"range-units-required": "Afstandsenheder er påkrævet.", "range-units-required": "Afstandsenheder er påkrævet.",
"range": "Rækkevidde", "range": "Interval",
"range-required": "Rækkevidde er påkrævet.", "range-required": "Interval er påkrævet.",
"polygon-definition": "Polygondefinition", "polygon-definition": "Polygondefinition",
"polygon-definition-required": "Polygondefinition er påkrævet.", "polygon-definition-required": "Polygondefinition er påkrævet.",
"polygon-definition-hint": "Format: [[lat1,lon1],[lat2,lon2],...,[latN,lonN]].", "polygon-definition-hint": "Brug følgende format til manuel definition af polygon: [[lat1,lon1],[lat2,lon2], ... ,[latN,lonN]].",
"min-inside-duration": "Minimal varighed indenfor", "min-inside-duration": "Minimal varighed indenfor",
"min-inside-duration-value-required": "Værdi er påkrævet", "min-inside-duration-value-required": "Minimal varighed indenfor er påkrævet",
"min-inside-duration-time-unit": "Tidsenhed for minimal varighed indenfor", "min-inside-duration-time-unit": "Tidsenhed for minimal varighed indenfor",
"min-outside-duration": "Minimal varighed udenfor", "min-outside-duration": "Minimal varighed udenfor",
"min-outside-duration-value-required": "Værdi er påkrævet", "min-outside-duration-value-required": "Minimal varighed udenfor er påkrævet",
"min-outside-duration-time-unit": "Tidsenhed for minimal varighed udenfor", "min-outside-duration-time-unit": "Tidsenhed for minimal varighed udenfor",
"tell-failure-if-absent": "Rapporter fejl ved fravær", "tell-failure-if-absent": "Rapportér fejl",
"tell-failure-if-absent-hint": "Hvis mindst én af de valgte nøgler ikke findes, vil udgående besked rapportere \"Fejl\".", "tell-failure-if-absent-hint": "Hvis mindst én valgt nøgle ikke findes, vil den udgående besked rapportere \"Fejl\".",
"get-latest-value-with-ts": "Hent tidsstempel for de seneste telemetriværdier", "get-latest-value-with-ts": "Hent tidsstempel for seneste telemetriværdier",
"get-latest-value-with-ts-hint": "Hvis valgt, vil de seneste telemetriværdier også inkludere tidsstempel, f.eks.: \"temp\": \"&#123;\"ts\":1574329385897, \"value\":42&#125;\"", "get-latest-value-with-ts-hint": "Hvis valgt, vil de seneste telemetriværdier også inkludere tidsstempel, f.eks.: \"temp\": \"&#123;\"ts\":1574329385897, \"value\":42&#125;\"",
"ignore-null-strings": "Ignorér tomme strenge", "ignore-null-strings": "Ignorér tomme strenge",
"ignore-null-strings-hint": "Ignorerer felter med tomme værdier.", "ignore-null-strings-hint": "Hvis valgt, vil regelnoden ignorere entitetsfelter med tom værdi.",
"add-metadata-key-values-as-kafka-headers": "Tilføj nøgle-værdi par fra metadata til Kafka headers", "add-metadata-key-values-as-kafka-headers": "Tilføj metadata nøgle-værdi-par til Kafka header",
"add-metadata-key-values-as-kafka-headers-hint": "Hvis valgt, tilføjes metadataens nøgle-værdi par som byte arrays med foruddefineret tegnkodning.", "add-metadata-key-values-as-kafka-headers-hint": "Hvis valgt, tilføjes nøgle-værdi-par fra beskedmetadata til headers i udgående Kafka-poster som byte-arrays med foruddefineret tegnkodning.",
"charset-encoding": "Tegnkodning", "charset-encoding": "Tegnkodning",
"charset-encoding-required": "Tegnkodning er påkrævet.", "charset-encoding-required": "Tegnkodning er påkrævet.",
"charset-us-ascii": "US-ASCII", "charset-us-ascii": "US-ASCII",
@ -5182,63 +5207,63 @@
"charset-utf-16be": "UTF-16BE", "charset-utf-16be": "UTF-16BE",
"charset-utf-16le": "UTF-16LE", "charset-utf-16le": "UTF-16LE",
"charset-utf-16": "UTF-16", "charset-utf-16": "UTF-16",
"select-queue-hint": "Vælg et kønavn fra rullemenu eller angiv et brugerdefineret navn.", "select-queue-hint": "Kønavnet kan vælges fra en rullemenu eller angives manuelt.",
"device-profile-node-hint": "Nyttigt ved varighed eller gentagne betingelser for at sikre fortsat evaluering af alarmtilstand.", "device-profile-node-hint": "Nyttigt, hvis du har varigheds- eller gentagelsesbetingelser for at sikre kontinuitet i evalueringen af alarmtilstand.",
"persist-alarm-rules": "Gem tilstand for alarmregler", "persist-alarm-rules": "Bevar tilstand for alarmregler",
"persist-alarm-rules-hint": "Gemmer behandlingsstatus i databasen.", "persist-alarm-rules-hint": "Hvis aktiveret, vil regelnoden gemme behandlingstilstanden i databasen.",
"fetch-alarm-rules": "Hent tilstand for alarmregler", "fetch-alarm-rules": "Hent tilstand for alarmregler",
"fetch-alarm-rules-hint": "Genskaber tilstand ved opstart for at sikre korrekt alarmstatus.", "fetch-alarm-rules-hint": "Hvis aktiveret, vil regelnoden gendanne behandlingstilstanden ved initialisering og sikre, at alarmer udløses selv efter servergenstart. Ellers vil tilstanden blive gendannet, når den første besked fra enheden modtages.",
"input-value-key": "Input nøgle", "input-value-key": "Inputværdinøgle",
"input-value-key-required": "Input nøgle er påkrævet.", "input-value-key-required": "Inputværdinøgle er påkrævet.",
"output-value-key": "Output nøgle", "output-value-key": "Outputværdinøgle",
"output-value-key-required": "Output nøgle er påkrævet.", "output-value-key-required": "Outputværdinøgle er påkrævet.",
"number-of-digits-after-floating-point": "Antal decimaler", "number-of-digits-after-floating-point": "Antal decimaler efter komma",
"number-of-digits-after-floating-point-range": "Antal decimaler skal være mellem 0 og 15.", "number-of-digits-after-floating-point-range": "Antallet af decimaler skal være mellem 0 og 15.",
"failure-if-delta-negative": "Rapportér fejl ved negativ delta", "failure-if-delta-negative": "Rapportér fejl, hvis delta er negativ",
"failure-if-delta-negative-tooltip": "Fejl ved negativ forskel mellem værdier.", "failure-if-delta-negative-tooltip": "Regelnoden tvinger beskedbehandling til at fejle, hvis delta-værdien er negativ.",
"use-caching": "Brug caching", "use-caching": "Brug caching",
"use-caching-tooltip": "Regelknuden vil cache værdien af \"{{inputValueKey}}\" fra den indkommende besked for at forbedre ydeevnen. Bemærk, at cachen ikke opdateres, hvis \"{{inputValueKey}}\" ændres et andet sted.", "use-caching-tooltip": "Regelnoden vil cache værdien af \"{{inputValueKey}}\", som modtages fra den indgående besked, for at forbedre ydeevnen. Bemærk, at cachen ikke opdateres, hvis du ændrer værdien af \"{{inputValueKey}}\" andre steder.",
"add-time-difference-between-readings": "Tilføj tidsforskel mellem aflæsninger af \"{{inputValueKey}}\"", "add-time-difference-between-readings": "Tilføj tidsforskel mellem aflæsninger af \"{{inputValueKey}}\"",
"add-time-difference-between-readings-tooltip": "Hvis aktiveret, tilføjer regelknuden \"{{periodValueKey}}\" til den udgående besked.", "add-time-difference-between-readings-tooltip": "Hvis aktiveret, tilføjer regelnoden \"{{periodValueKey}}\" til den udgående besked.",
"period-value-key": "Tidsintervalnøgle", "period-value-key": "Periodeværdinøgle",
"period-value-key-required": "Tidsintervalnøgle er påkrævet.", "period-value-key-required": "Periodeværdinøgle er påkrævet.",
"general-pattern-hint": "Brug ${metadataKey} for værdi fra metadata, $[messageKey] for værdi fra meddelelsesindhold.", "general-pattern-hint": "Brug ${metadataKey} for værdi fra metadata, $[messageKey] for værdi fra beskedens indhold.",
"alarm-severity-pattern-hint": "Brug <code><span style=\"color: #000;\">$&#123;</span>metadataKey<span style=\"color: #000;\">&#125;</span></code> for værdi fra metadata, <code><span style=\"color: #000;\">$[</span>messageKey<span style=\"color: #000;\">]</span></code> for værdi fra meddelelsesindhold. Alarmens alvorlighed skal være et systemniveau (CRITICAL, MAJOR osv.)", "alarm-severity-pattern-hint": "Brug <code><span style=\"color: #000;\">$&#123;</span>metadataKey<span style=\"color: #000;\">&#125;</span></code> for værdi fra metadata, <code><span style=\"color: #000;\">$[</span>messageKey<span style=\"color: #000;\">]</span></code> for værdi fra beskedens indhold. Alarmernes alvorlighed skal være systemdefineret (CRITICAL, MAJOR osv.)",
"output-node-name-hint": "<b>Regelknudens navn</b> svarer til <b>relationstypen</b> for den udgående besked og bruges til at videresende beskeder til andre regelknuder i den kaldende regelkæde.", "output-node-name-hint": "<b>Regelnodens navn</b> svarer til <b>relationstypen</b> for den udgående besked og bruges til at videresende beskeder til andre regelnoder i den kaldende regelkæde.",
"use-server-ts": "Brug serverens tidsstempel", "use-server-ts": "Brug serverens tidsstempel",
"use-server-ts-hint": "Brug serverens aktuelle tidsstempel for tidsseriedata, der mangler et eksplicit tidsstempel. Dette hjælper med korrekt rækkefølge, når der behandles beskeder fra flere kilder eller ved uordnet ankomst.", "use-server-ts-hint": "Brug serverens aktuelle tidsstempel for tidsseriedata uden eksplicit tidsstempel. Dette hjælper med at bevare korrekt rækkefølge ved behandling af beskeder fra flere kilder eller når beskeder ankommer ude af rækkefølge.",
"kv-map-pattern-hint": "Alle inputfelter understøtter skabelonisering. Brug $[messageKey] for værdi fra beskeden og ${metadataKey} for værdi fra metadata.", "kv-map-pattern-hint": "Alle inputfelter understøtter skabeloner. Brug $[messageKey] for værdi fra beskeden og ${metadataKey} for værdi fra metadata.",
"kv-map-single-pattern-hint": "Inputfelt understøtter skabelonisering. Brug $[messageKey] for værdi fra beskeden og ${metadataKey} for værdi fra metadata.", "kv-map-single-pattern-hint": "Inputfeltet understøtter skabeloner. Brug $[messageKey] for værdi fra beskeden og ${metadataKey} for værdi fra metadata.",
"shared-scope": "Delt område", "shared-scope": "Delt område",
"server-scope": "Serverområde", "server-scope": "Serverområde",
"client-scope": "Klientområde", "client-scope": "Klientområde",
"attribute-type": "Attribute", "attribute-type": "Attribut",
"attribute-type-description": "Hent attributværdi fra database", "attribute-type-description": "Hent attributværdi fra databasen",
"attribute-type-result-description": "Gem som attribut i database", "attribute-type-result-description": "Gem resultatet som en entitetsattribut i databasen",
"constant-type": "Konstant", "constant-type": "Konstant",
"constant-type-description": "Definér konstant værdi", "constant-type-description": "Definér konstant værdi",
"time-series-type": "Tidsserie", "time-series-type": "Tidsserie",
"time-series-type-description": "Hent seneste værdi fra database", "time-series-type-description": "Hent seneste tidsserieværdi fra databasen",
"time-series-type-result-description": "Gem som tidsserie i database", "time-series-type-result-description": "Gem resultatet som en entitets tidsserie i databasen",
"message-body-type": "Besked", "message-body-type": "Besked",
"message-body-type-description": "Hent argumentværdi fra besked", "message-body-type-description": "Hent argumentværdi fra den indgående besked",
"message-body-type-result-description": "Tilføj resultat til besked", "message-body-type-result-description": "Tilføj resultat til den udgående besked",
"message-metadata-type": "Metadata", "message-metadata-type": "Metadata",
"message-metadata-type-description": "Hent argumentværdi fra metadata", "message-metadata-type-description": "Hent argumentværdi fra den indgående beskeds metadata",
"message-metadata-result-description": "Tilføj resultat til metadata", "message-metadata-result-description": "Tilføj resultat til metadata for den udgående besked",
"argument-tile": "Argumenter", "argument-tile": "Argumenter",
"no-arguments-prompt": "Ingen argumenter konfigureret", "no-arguments-prompt": "Ingen argumenter konfigureret",
"result-title": "Resultat", "result-title": "Resultat",
"functions-field-input": "Funktioner", "functions-field-input": "Funktioner",
"no-option-found": "Ingen muligheder fundet", "no-option-found": "Ingen valgmuligheder fundet",
"argument-source-field-input": "Kilde", "argument-source-field-input": "Kilde",
"argument-source-field-input-required": "Kilde er påkrævet.", "argument-source-field-input-required": "Argumentkilde er påkrævet.",
"argument-key-field-input": "Nøgle", "argument-key-field-input": "Nøgle",
"argument-key-field-input-required": "Nøgle er påkrævet.", "argument-key-field-input-required": "Argumentnøgle er påkrævet.",
"constant-value-field-input": "Konstant værdi", "constant-value-field-input": "Konstant værdi",
"constant-value-field-input-required": "Konstant værdi er påkrævet.", "constant-value-field-input-required": "Konstant værdi er påkrævet.",
"attribute-scope-field-input": "Attribut område", "attribute-scope-field-input": "Attributområde",
"attribute-scope-field-input-required": "Område er påkrævet.", "attribute-scope-field-input-required": "Attributområde er påkrævet.",
"default-value-field-input": "Standardværdi", "default-value-field-input": "Standardværdi",
"type-field-input": "Type", "type-field-input": "Type",
"type-field-input-required": "Type er påkrævet.", "type-field-input-required": "Type er påkrævet.",
@ -5266,21 +5291,21 @@
"clear-selected-keys": "Ryd valgte nøgler", "clear-selected-keys": "Ryd valgte nøgler",
"geofence-configuration": "Geofence-konfiguration", "geofence-configuration": "Geofence-konfiguration",
"coordinate-field-names": "Koordinatfeltnavne", "coordinate-field-names": "Koordinatfeltnavne",
"coordinate-field-hint": "Forsøger at hente felter fra besked. Hvis ikke til stede, bruges metadata.", "coordinate-field-hint": "Regelnoden forsøger at hente de angivne felter fra beskeden. Hvis de ikke findes, vil den forsøge at hente dem fra metadata.",
"presence-monitoring-strategy": "Strategi for tilstedeværelsesovervågning", "presence-monitoring-strategy": "Strategi for tilstedeværelsesovervågning",
"presence-monitoring-strategy-on-first-message": "Ved første besked", "presence-monitoring-strategy-on-first-message": "Ved første besked",
"presence-monitoring-strategy-on-each-message": "Ved hver besked", "presence-monitoring-strategy-on-each-message": "Ved hver besked",
"presence-monitoring-strategy-on-first-message-hint": "Rapporterer status 'Inde' eller 'Ude' ved første besked efter minimumsvarighed siden sidste status.", "presence-monitoring-strategy-on-first-message-hint": "Rapporterer tilstedeværelsesstatus 'Inde' eller 'Ude' ved første besked efter den konfigurerede minimumsvarighed er opnået siden sidste status 'Gået ind' eller 'Gået ud'.",
"presence-monitoring-strategy-on-each-message-hint": "Rapporterer status ved hver besked efter statusændring.", "presence-monitoring-strategy-on-each-message-hint": "Rapporterer tilstedeværelsesstatus 'Inde' eller 'Ude' ved hver besked efter statusopdatering 'Gået ind' eller 'Gået ud'.",
"fetch-credentials-to": "Hent legitimationsoplysninger til", "fetch-credentials-to": "Hent legitimationsoplysninger til",
"add-originator-attributes-to": "Tilføj afsenders attributter til", "add-originator-attributes-to": "Tilføj afsenderattributter til",
"originator-attributes": "Afsenders attributter", "originator-attributes": "Afsenderattributter",
"fetch-latest-telemetry-with-timestamp": "Hent seneste telemetry med tidsstempel", "fetch-latest-telemetry-with-timestamp": "Hent seneste telemetri med tidsstempel",
"fetch-latest-telemetry-with-timestamp-tooltip": "Inkluderer tidsstempel i metadata, f.eks.: \"{{latestTsKeyName}}\": \"{\"ts\":1574329385897, \"value\":42}\"", "fetch-latest-telemetry-with-timestamp-tooltip": "Hvis valgt, tilføjes de seneste telemetriværdier med tidsstempel til metadata, f.eks.: \"{{latestTsKeyName}}\": \"{\\\"ts\\\":1574329385897, \\\"value\\\":42}\"",
"tell-failure": "Rapportér fejl hvis attribut mangler", "tell-failure": "Rapportér fejl, hvis en eller flere attributter mangler",
"tell-failure-tooltip": "Rapporterer fejl hvis mindst én valgt nøgle mangler.", "tell-failure-tooltip": "Hvis mindst én valgt nøgle ikke findes, vil den udgående besked rapportere \"Fejl\".",
"created-time": "Oprettelsestid", "created-time": "Oprettelsestidspunkt",
"chip-help": "Tryk på 'Enter' for at fuldføre {{inputName}}-indtastning. \nTryk på 'Backspace' for at slette {{inputName}}. \nFlere værdier understøttes.", "chip-help": "Tryk på 'Enter' for at afslutte indtastning af {{inputName}}. \nTryk på 'Backspace' for at slette {{inputName}}. \nFlere værdier understøttes.",
"detail": "detalje", "detail": "detalje",
"field-name": "feltnavn", "field-name": "feltnavn",
"device-profile": "enhedsprofil", "device-profile": "enhedsprofil",
@ -5291,19 +5316,19 @@
"first-name": "Fornavn", "first-name": "Fornavn",
"last-name": "Efternavn", "last-name": "Efternavn",
"label": "Etiket", "label": "Etiket",
"originator-fields-mapping": "Afsender felttilknytning", "originator-fields-mapping": "Kortlægning af afsenderfelter",
"add-mapped-originator-fields-to": "Tilføj mappede afsenderfelter til", "add-mapped-originator-fields-to": "Tilføj kortlagte afsenderfelter til",
"fields": "Felter", "fields": "Felter",
"skip-empty-fields": "Spring tomme felter over", "skip-empty-fields": "Spring tomme felter over",
"skip-empty-fields-tooltip": "Tomme felter tilføjes ikke til uddata.", "skip-empty-fields-tooltip": "Felter med tomme værdier tilføjes ikke til udgående besked eller metadata.",
"fetch-interval": "Hentningsinterval", "fetch-interval": "Henteinterval",
"fetch-strategy": "Hentningsstrategi", "fetch-strategy": "Hentestrategi",
"fetch-timeseries-from-to": "Hent tidsserier fra {{startInterval}} {{startIntervalTimeUnit}} siden til {{endInterval}} {{endIntervalTimeUnit}} siden.", "fetch-timeseries-from-to": "Hent tidsserie fra {{startInterval}} {{startIntervalTimeUnit}} siden til {{endInterval}} {{endIntervalTimeUnit}} siden.",
"fetch-timeseries-from-to-invalid": "Ugyldig hentning af tidsserier (\"Intervalstart\" skal være mindre end \"Intervalslut\").", "fetch-timeseries-from-to-invalid": "Ugyldig tidsseriehentning (\"Interval start\" skal være mindre end \"Interval slut\").",
"use-metadata-dynamic-interval-tooltip": "Hvis valgt, vil rule node bruge dynamisk intervalstart og -slut baseret på mønstre i beskeden og metadata.", "use-metadata-dynamic-interval-tooltip": "Hvis valgt, bruger regelnoden dynamisk start og slut på intervallet baseret på besked- og metadatamønstre.",
"all-mode-hint": "Hvis hentningstilstand \"Alle\" er valgt, vil rule node hente telemetri fra intervallet med konfigurerbare forespørgselsparametre.", "all-mode-hint": "Hvis hentemåde \"Alle\" er valgt, vil regelnoden hente telemetri fra hele intervallet baseret på konfigurerbare forespørgselsparametre.",
"first-mode-hint": "Hvis hentningstilstand \"Første\" er valgt, vil rule node hente den telemetri, der ligger tættest på intervallets start.", "first-mode-hint": "Hvis hentemåde \"Første\" er valgt, hentes den telemetri, der ligger tættest på intervalstarten.",
"last-mode-hint": "Hvis hentningstilstand \"Sidste\" er valgt, vil rule node hente den telemetri, der ligger tættest på intervallets slutning.", "last-mode-hint": "Hvis hentemåde \"Sidste\" er valgt, hentes den telemetri, der ligger tættest på intervalslutningen.",
"ascending": "Stigende", "ascending": "Stigende",
"descending": "Faldende", "descending": "Faldende",
"min": "Min", "min": "Min",
@ -5312,39 +5337,39 @@
"sum": "Sum", "sum": "Sum",
"count": "Antal", "count": "Antal",
"none": "Ingen", "none": "Ingen",
"last-level-relation-tooltip": "Søger kun relationer på det maksimale niveau.", "last-level-relation-tooltip": "Hvis valgt, vil regelnoden kun søge relaterede enheder på det niveau, der er angivet som maksimal relation.",
"last-level-device-relation-tooltip": "Søger kun enheder på det maksimale niveau.", "last-level-device-relation-tooltip": "Hvis valgt, vil regelnoden kun søge relaterede enheder på det niveau, der er angivet som maksimal relation.",
"data-to-fetch": "Data der skal hentes", "data-to-fetch": "Data der skal hentes",
"mapping-of-customers": "Kundemapping", "mapping-of-customers": "Kortlægning af kunde",
"map-fields-required": "Alle felter skal udfyldes.", "map-fields-required": "Alle kortlægningsfelter er påkrævede.",
"attributes": "Attributter", "attributes": "Attributter",
"related-device-attributes": "Attributter for relateret enhed", "related-device-attributes": "Attributter for relaterede enheder",
"add-selected-attributes-to": "Tilføj valgte attributter til", "add-selected-attributes-to": "Tilføj valgte attributter til",
"device-profiles": "Enhedsprofiler", "device-profiles": "Enhedsprofiler",
"mapping-of-tenant": "Tenant-mapping", "mapping-of-tenant": "Kortlægning af tenant",
"add-attribute-key": "Tilføj attributnøgle", "add-attribute-key": "Tilføj attributnøgle",
"message-template": "Beskedskabelon", "message-template": "Beskedskabelon",
"message-template-required": "Beskedskabelon er påkrævet", "message-template-required": "Beskedskabelon er påkrævet",
"use-system-slack-settings": "Brug systemets Slack-indstillinger", "use-system-slack-settings": "Brug systemets Slack-indstillinger",
"slack-api-token": "Slack API-token", "slack-api-token": "Slack API-token",
"slack-api-token-required": "Slack API-token er påkrævet", "slack-api-token-required": "Slack API-token er påkrævet",
"keys-mapping": "Nøgletilknytning", "keys-mapping": "Nøglekortlægning",
"add-key": "Tilføj nøgle", "add-key": "Tilføj nøgle",
"recipients": "Modtagere", "recipients": "Modtagere",
"message-subject-and-content": "Besked emne og indhold", "message-subject-and-content": "Beskedens emne og indhold",
"template-rules-hint": "Brug $[messageKey] eller ${metadataKey} til værdier.", "template-rules-hint": "Begge inputfelter understøtter skabeloner. Brug $[messageKey] for værdi fra besked og ${metadataKey} for værdi fra metadata.",
"originator-customer-desc": "Brug kundens oprindelige afsender.", "originator-customer-desc": "Brug kunde tilhørende beskedens afsender som ny afsender.",
"originator-tenant-desc": "Brug nuværende tenant.", "originator-tenant-desc": "Brug nuværende tenant som ny afsender.",
"originator-related-entity-desc": "Brug relateret entitet som afsender.", "originator-related-entity-desc": "Brug relateret enhed som ny afsender. Opslag baseret på konfigureret relationstype og retning.",
"originator-alarm-originator-desc": "Brug alarmens afsender (kun hvis besked er alarm).", "originator-alarm-originator-desc": "Brug alarmens afsender som ny afsender. Kun hvis afsenderen er en alarmenhed.",
"originator-entity-by-name-pattern-desc": "Find og brug entitet ud fra navn og type.", "originator-entity-by-name-pattern-desc": "Brug enhed hentet fra databasen som ny afsender. Opslag baseret på enhedstype og angivet navnemønster.",
"email-from-template-hint": "Brug $[messageKey] eller ${metadataKey} for at trække værdier.", "email-from-template-hint": "Brug $[messageKey] for værdi fra besked og ${metadataKey} for værdi fra metadata.",
"recipients-block-main-hint": "Kommasepareret liste, understøtter templatization.", "recipients-block-main-hint": "Kommasepareret adresseliste. Alle inputfelter understøtter skabeloner. Brug $[messageKey] for værdi fra besked og ${metadataKey} for værdi fra metadata.",
"forward-msg-default-rule-chain": "Videresend besked til standard regelkæde", "forward-msg-default-rule-chain": "Videresend besked til afsenders standardregel-kæde",
"forward-msg-default-rule-chain-tooltip": "Bruger standard regelkæde for afsender eller konfigureret kæde.", "forward-msg-default-rule-chain-tooltip": "Hvis aktiveret, videresendes besked til afsenders standardregel-kæde, eller den i konfigurationen angivne, hvis ingen standard er defineret i enhedsprofilen.",
"exclude-zero-deltas": "Udelad nul-delta værdier", "exclude-zero-deltas": "Ekskludér nul-deltaer fra udgående besked",
"exclude-zero-deltas-hint": "Tilføj kun nøgle hvis værdi ikke er nul.", "exclude-zero-deltas-hint": "Hvis aktiveret, tilføjes nøglen \"{{outputValueKey}}\" kun, hvis værdien ikke er nul.",
"exclude-zero-deltas-time-difference-hint": "Tilføj kun hvis outputværdi ≠ 0.", "exclude-zero-deltas-time-difference-hint": "Hvis aktiveret, tilføjes \"{{outputValueKey}}\" og \"{{periodValueKey}}\" kun, hvis \"{{outputValueKey}}\" ikke er nul.",
"search-direction-from": "Fra afsender til målentitet", "search-direction-from": "Fra afsender til målentitet",
"search-direction-to": "Fra målentitet til afsender", "search-direction-to": "Fra målentitet til afsender",
"del-relation-direction-from": "Fra afsender", "del-relation-direction-from": "Fra afsender",
@ -5354,33 +5379,33 @@
"function-name": "Funktionsnavn", "function-name": "Funktionsnavn",
"function-name-required": "Funktionsnavn er påkrævet.", "function-name-required": "Funktionsnavn er påkrævet.",
"qualifier": "Kvalifikator", "qualifier": "Kvalifikator",
"qualifier-hint": "Hvis kvalifikatoren ikke er angivet, vil standardkvalifikatoren \"$LATEST\" blive brugt.", "qualifier-hint": "Hvis kvalifikator ikke er angivet, bruges standardkvalifikatoren \"$LATEST\".",
"aws-credentials": "AWS-legitimationsoplysninger", "aws-credentials": "AWS-legitimationsoplysninger",
"connection-timeout": "Forbindelsestimeout", "connection-timeout": "Forbindelsestidsgrænse",
"connection-timeout-required": "Forbindelsestimeout er påkrævet.", "connection-timeout-required": "Forbindelsestidsgrænse er påkrævet.",
"connection-timeout-min": "Minimum forbindelsestimeout er 0.", "connection-timeout-min": "Minimum forbindelsestidsgrænse er 0.",
"connection-timeout-hint": "Ventetid ved etablering af forbindelse. 0 betyder uendelig og frarådes.", "connection-timeout-hint": "Tiden i sekunder, der ventes ved etablering af forbindelse, før timeout. En værdi på 0 betyder uendelig, hvilket ikke anbefales.",
"request-timeout": "Anmodningstimeout", "request-timeout": "Forespørgsels-timeout",
"request-timeout-required": "Anmodningstimeout er påkrævet", "request-timeout-required": "Forespørgsels-timeout er påkrævet.",
"request-timeout-min": "Minimum anmodningstimeout er 0", "request-timeout-min": "Minimum forespørgsels-timeout er 0.",
"request-timeout-hint": "Ventetid for anmodning, før timeout. 0 betyder uendelig og frarådes.", "request-timeout-hint": "Tiden i sekunder, der ventes på at gennemføre forespørgslen, før timeout. En værdi på 0 betyder uendelig, hvilket ikke anbefales.",
"units": "Enheder", "units": "Enheder",
"tell-failure-aws-lambda": "Rapportér fejl hvis AWS Lambda-funktion kaster en undtagelse", "tell-failure-aws-lambda": "Rapportér fejl, hvis AWS Lambda-funktion kaster en undtagelse",
"tell-failure-aws-lambda-hint": "Tvinger fejl hvis Lambda-funktionen fejler.", "tell-failure-aws-lambda-hint": "Regelnoden tvinger fejl i beskedbehandling, hvis AWS Lambda-funktion udløser en undtagelse.",
"basic-mode": "Grundlæggende", "basic-mode": "Basis",
"advanced-mode": "Avanceret", "advanced-mode": "Avanceret",
"save-time-series": { "save-time-series": {
"processing-settings": "Behandlingsindstillinger", "processing-settings": "Behandlingsindstillinger",
"processing-settings-hint": "Definér hvordan beskeder behandles. Grundlæggende eller avancerede strategier.", "processing-settings-hint": "Definér, hvordan indgående beskeder behandles. Basisindstillinger lader dig vælge forudkonfigurerede strategier, mens avancerede indstillinger tillader valg af individuelle strategier for hver handling.",
"advanced-settings-hint": "Vær forsigtig – visse kombinationer kan føre til uventet adfærd.", "advanced-settings-hint": "Vær forsigtig ved konfiguration af behandlingsstrategier. Visse kombinationer kan føre til uforudset opførsel.",
"strategy": "Strategi", "strategy": "Strategi",
"deduplication-interval": "Deduplikeringsinterval", "deduplication-interval": "Deduplikationsinterval",
"deduplication-interval-required": "Dedupliceringsinterval er påkrævet", "deduplication-interval-required": "Deduplikationsinterval er påkrævet",
"deduplication-interval-min-max-range": "Skal være mellem 1 sekund og 1 dag", "deduplication-interval-min-max-range": "Deduplikationsinterval skal være mindst 1 sekund og højst 1 dag",
"strategy-type": { "strategy-type": {
"every-message": "Ved hver besked", "every-message": "Ved hver besked",
"skip": "Spring over", "skip": "Spring over",
"deduplicate": "Dedupliker", "deduplicate": "Deduplikér",
"web-sockets-only": "Kun WebSockets" "web-sockets-only": "Kun WebSockets"
}, },
"time-series": "Tidsserier", "time-series": "Tidsserier",
@ -5390,17 +5415,17 @@
}, },
"save-attribute": { "save-attribute": {
"processing-settings": "Behandlingsindstillinger", "processing-settings": "Behandlingsindstillinger",
"processing-settings-hint": "Definér hvordan beskeder behandles. Grundlæggende eller avancerede strategier.", "processing-settings-hint": "Definér, hvordan indgående beskeder behandles. Basisindstillinger lader dig vælge forudkonfigurerede strategier, mens avancerede indstillinger tillader valg af individuelle strategier for hver handling.",
"advanced-settings-hint": "Vær forsigtig – visse kombinationer kan føre til uventet adfærd.", "advanced-settings-hint": "Vær forsigtig ved konfiguration af behandlingsstrategier. Visse kombinationer kan føre til uforudset opførsel.",
"strategy": "Strategi", "strategy": "Strategi",
"deduplication-interval": "Deduplikeringsinterval", "deduplication-interval": "Deduplikationsinterval",
"deduplication-interval-required": "Deduplikeringsinterval er påkrævet", "deduplication-interval-required": "Deduplikationsinterval er påkrævet",
"deduplication-interval-min-max-range": "Skal være mellem 1 sekund og 1 dag", "deduplication-interval-min-max-range": "Deduplikationsinterval skal være mindst 1 sekund og højst 1 dag",
"scope": "Omfang", "scope": "Omfang",
"strategy-type": { "strategy-type": {
"every-message": "Ved hver besked", "every-message": "Ved hver besked",
"skip": "Spring over", "skip": "Spring over",
"deduplicate": "Dedupliker", "deduplicate": "Deduplikér",
"web-sockets-only": "Kun WebSockets" "web-sockets-only": "Kun WebSockets"
}, },
"attributes": "Attributter" "attributes": "Attributter"
@ -5432,32 +5457,33 @@
"ai": { "ai": {
"ai-model": "AI-model", "ai-model": "AI-model",
"model": "Model", "model": "Model",
"ai-model-hint": "Vælg den forudkonfigurerede AI-model til at behandle forespørgsler sendt af denne rule node, eller brug \"Opret ny\" for at konfigurere en ny.", "ai-model-hint": "Vælg den forudkonfigurerede AI-model til at behandle anmodninger sendt af denne regelnode, eller brug \"Opret ny\" for at konfigurere en ny.",
"prompt-settings": "Promptindstillinger", "prompt-settings": "Prompt-indstillinger",
"prompt-settings-hint": "Den valgfrie systemprompt angiver AI'ens generelle rolle og begrænsninger, mens brugerprompten definerer den specifikke opgave. Begge felter understøtter også skabelonfunktionalitet.", "prompt-settings-hint": "Den valgfrie systemprompt angiver AI'ens generelle rolle og begrænsninger, mens brugerprompten definerer den specifikke opgave, der skal udføres. Begge felter understøtter også skabeloner.",
"system-prompt": "Systemprompt", "system-prompt": "Systemprompt",
"system-prompt-max-length": "Systemprompt må højst være 500000 tegn.", "system-prompt-max-length": "Systemprompt må højst indeholde 500000 tegn.",
"system-prompt-blank": "Systemprompt må ikke være tom.", "system-prompt-blank": "Systemprompt må ikke være tom.",
"user-prompt": "Brugerprompt", "user-prompt": "Brugerprompt",
"user-prompt-required": "Brugerprompt er påkrævet.", "user-prompt-required": "Brugerprompt er påkrævet.",
"user-prompt-max-length": "Brugerprompt må højst være 500000 tegn.", "user-prompt-max-length": "Brugerprompt må højst indeholde 500000 tegn.",
"user-prompt-blank": "Brugerprompt må ikke være tom.", "user-prompt-blank": "Brugerprompt må ikke være tom.",
"response-format": "Svarformat", "response-format": "Svartype",
"response-text": "Tekst", "response-text": "Tekst",
"response-json": "JSON", "response-json": "JSON",
"response-json-schema": "JSON-skema", "response-json-schema": "JSON-skema",
"response-format-hint-TEXT": "Tillader modellen at generere vilkårlig tekst, som måske eller måske ikke er gyldig JSON. Hvis output ikke er gyldig JSON, bliver det automatisk pakket ind i en JSON med nøglen \"response\".", "response-format-hint-TEXT": "Tillader modellen at generere vilkårlig tekst, som muligvis ikke er et gyldigt JSON-objekt. Hvis output ikke er gyldigt JSON, vil det automatisk blive pakket ind i et JSON-objekt under nøglen \"response\".",
"response-format-hint-JSON": "Modellen skal generere et svar, der er gyldig JSON. Hvis output ikke er gyldig JSON, bliver det automatisk pakket ind i en JSON med nøglen \"response\".", "response-format-hint-JSON": "Modellen skal generere et svar, der er gyldigt JSON. Hvis output ikke er gyldigt JSON, vil det automatisk blive pakket ind i et JSON-objekt under nøglen \"response\".",
"response-format-hint-JSON_SCHEMA": "Modellen skal generere en JSON, der matcher strukturen og datatyperne defineret i det angivne skema. Hvis output ikke er gyldig JSON, bliver det automatisk pakket ind i en JSON med nøglen \"response\".", "response-format-hint-JSON_SCHEMA": "Modellen skal generere JSON, der matcher den specifikke struktur og datatyper defineret i det angivne skema. Hvis output ikke er gyldigt JSON, vil det automatisk blive pakket ind i et JSON-objekt under nøglen \"response\".",
"response-json-schema-hint": "Selvom enhver gyldig JSON-skema kan indtastes, understøtter denne rule node kun et begrænset sæt funktioner. Se dokumentationen for detaljer.", "response-json-schema-hint": "Selvom enhver gyldig JSON-skema kan indtastes, understøtter denne regelnode kun et begrænset sæt af dets funktioner. Se node-dokumentationen for detaljer.",
"response-json-schema-required": "JSON-skema er påkrævet", "response-json-schema-required": "JSON-skema er påkrævet",
"advanced-settings": "Avancerede indstillinger", "advanced-settings": "Avancerede indstillinger",
"timeout": "Timeout", "timeout": "Timeout",
"timeout-hint": "Maksimalt tidsrum at vente på svar \nfra AI-modellen, før forespørgslen afsluttes.", "timeout-hint": "Maksimal ventetid på svar fra AI-modellen, før anmodningen afbrydes.",
"timeout-required": "Timeout er påkrævet", "timeout-required": "Timeout er påkrævet",
"timeout-validation": "Skal være mellem 1 sekund og 10 minutter.", "timeout-validation": "Skal være mellem 1 sekund og 10 minutter.",
"force-acknowledgement": "Tving kvittering", "force-acknowledgement": "Tving kvittering",
"force-acknowledgement-hint": "Hvis aktiveret, kvitteres der straks for den indgående besked. Modellens svar bliver derefter sat i kø som en separat, ny besked." "force-acknowledgement-hint": "Hvis aktiveret, kvitteres den indgående besked straks. Modellens svar sættes derefter i kø som en separat, ny besked.",
"ai-resources": "AI-ressourcer"
} }
}, },
"timezone": { "timezone": {
@ -5757,9 +5783,9 @@
"rule-engine-exceptions-ttl-days": "Rule Engine-undtagelser TTL dage", "rule-engine-exceptions-ttl-days": "Rule Engine-undtagelser TTL dage",
"rule-engine-exceptions-ttl-days-required": "Rule Engine-undtagelser TTL dage er påkrævet", "rule-engine-exceptions-ttl-days-required": "Rule Engine-undtagelser TTL dage er påkrævet",
"rule-engine-exceptions-ttl-days-range": "Rule Engine-undtagelser TTL dage må ikke være negativt", "rule-engine-exceptions-ttl-days-range": "Rule Engine-undtagelser TTL dage må ikke være negativt",
"max-rule-node-executions-per-message": "Maksimalt antal regelnode-udførelser pr. besked", "max-rule-node-executions-per-message": "Maks. antal regelnodekørsler pr. besked",
"max-rule-node-executions-per-message-required": "Maksimalt antal regelnode-udførelser pr. besked er påkrævet.", "max-rule-node-executions-per-message-required": "Maks. antal regelnodekørsler pr. besked er påkrævet.",
"max-rule-node-executions-per-message-range": "Maksimalt antal regelnode-udførelser pr. besked må ikke være negativt", "max-rule-node-executions-per-message-range": "Maks. antal regelnodekørsler pr. besked må ikke være negativ",
"max-emails": "Maksimalt antal sendte e-mails", "max-emails": "Maksimalt antal sendte e-mails",
"max-emails-required": "Maksimalt antal sendte e-mails er påkrævet.", "max-emails-required": "Maksimalt antal sendte e-mails er påkrævet.",
"max-emails-range": "Maksimalt antal sendte e-mails må ikke være negativt", "max-emails-range": "Maksimalt antal sendte e-mails må ikke være negativt",
@ -5987,9 +6013,10 @@
"label": "Etiket", "label": "Etiket",
"value": "Værdi", "value": "Værdi",
"date": "Dato", "date": "Dato",
"show-date-time-interval": "Vis datotidsinterval", "show-date-time-interval": "Vis dato-/tidsinterval",
"show-date-time-interval-hint": "Vis datotidsinterval i henhold til dataaggregering.", "show-date-time-interval-hint": "Vis dato-/tidsinterval i henhold til dataaggregering.",
"hide-zero-tooltip-values": "Skjul nulværdier", "hide-zero-tooltip-values": "Skjul nulværdier",
"show-stack-total": "Vis totalværdi i stablet tilstand",
"background-color": "Baggrundsfarve", "background-color": "Baggrundsfarve",
"background-blur": "Baggrundssløring" "background-blur": "Baggrundssløring"
}, },
@ -6702,15 +6729,15 @@
"no-widgets-text": "Ingen widgets fundet", "no-widgets-text": "Ingen widgets fundet",
"management": "Widgetadministration", "management": "Widgetadministration",
"editor": "Widget-editor", "editor": "Widget-editor",
"confirm-to-exit-editor-html": "Du har ikke gemt dine widgetindstillinger.<br>Er du sikker på, at du vil forlade denne side?", "confirm-to-exit-editor-html": "Du har ikke gemte widget-indstillinger.<br>Er du sikker på, at du vil forlade denne side?",
"widget-type-not-found": "Problem med at indlæse widgetkonfiguration.<br>Den tilknyttede widgettype er sandsynligvis blevet fjernet.", "widget-type-not-found": "Problem med indlæsning af widget-konfiguration.<br>Den tilknyttede widget-type er\n sandsynligvis blevet fjernet.",
"widget-type-load-error": "Widget blev ikke indlæst på grund af følgende fejl:", "widget-type-load-error": "Widget blev ikke indlæst på grund af følgende fejl:",
"remove": "Fjern widget", "remove": "Fjern widget",
"delete": "Slet widget", "delete": "Slet widget",
"edit": "Rediger widget", "edit": "Rediger widget",
"remove-widget-title": "Er du sikker på, at du vil fjerne widgetten '{{widgetTitle}}'?", "remove-widget-title": "Er du sikker på, at du vil fjerne widgetten '{{widgetTitle}}'?",
"remove-widget-text": "Efter bekræftelse vil widgetten og alle tilknyttede data ikke kunne gendannes.", "remove-widget-text": "Efter bekræftelse bliver widgetten og alle relaterede data uigenkaldeligt slettet.",
"replace-reference-with-widget-copy": "Erstat reference med kopi af widget", "replace-reference-with-widget-copy": "Erstat reference med en kopi af widget",
"timeseries": "Tidsserier", "timeseries": "Tidsserier",
"search-data": "Søg data", "search-data": "Søg data",
"no-data-found": "Ingen data fundet", "no-data-found": "Ingen data fundet",
@ -7550,8 +7577,8 @@
"October": "Oktober", "October": "Oktober",
"November": "November", "November": "November",
"December": "December", "December": "December",
"Custom Date Range": "Brugerdefineret datoområde", "Custom Date Range": "Brugerdefineret datointerval",
"Date Range Template": "Skabelon for datoområde", "Date Range Template": "Datointervalskabelon",
"Today": "I dag", "Today": "I dag",
"Yesterday": "I går", "Yesterday": "I går",
"This Week": "Denne uge", "This Week": "Denne uge",
@ -7572,7 +7599,7 @@
"Custom interval": "Brugerdefineret interval", "Custom interval": "Brugerdefineret interval",
"Interval": "Interval", "Interval": "Interval",
"Step size": "Trinstørrelse", "Step size": "Trinstørrelse",
"Ok": "OK" "Ok": "Ok"
} }
}, },
"doughnut": { "doughnut": {
@ -7784,11 +7811,11 @@
"gpio-switches": "GPIO-kontakter", "gpio-switches": "GPIO-kontakter",
"no-gpio-switches": "Ingen GPIO-kontakter konfigureret", "no-gpio-switches": "Ingen GPIO-kontakter konfigureret",
"add-gpio-switch": "Tilføj GPIO-kontakt", "add-gpio-switch": "Tilføj GPIO-kontakt",
"gpio-status-request": "GPIO-statusanmodning", "gpio-status-request": "GPIO-statusforespørgsel",
"method-name": "Metodenavn", "method-name": "Metodenavn",
"method-body": "Metodeindhold", "method-body": "Metodeindhold",
"gpio-status-change-request": "Anmodning om ændring af GPIO-status", "gpio-status-change-request": "Anmodning om ændring af GPIO-status",
"parse-gpio-status-function": "Funktion til at fortolke GPIO-status", "parse-gpio-status-function": "Parse-funktion for GPIO-status",
"gpio-leds": "GPIO-LED'er", "gpio-leds": "GPIO-LED'er",
"no-gpio-leds": "Ingen GPIO-LED'er konfigureret", "no-gpio-leds": "Ingen GPIO-LED'er konfigureret",
"add-gpio-led": "Tilføj GPIO-LED" "add-gpio-led": "Tilføj GPIO-LED"
@ -9522,4 +9549,4 @@
"language": { "language": {
"language": "Sprog" "language": "Sprog"
} }
} }

365
ui-ngx/src/assets/locale/locale.constant-de_DE.json

@ -163,39 +163,39 @@
"aws-secret-access-key-required": "AWS Secret Access Key ist erforderlich", "aws-secret-access-key-required": "AWS Secret Access Key ist erforderlich",
"aws-region": "AWS-Region", "aws-region": "AWS-Region",
"aws-region-required": "AWS-Region ist erforderlich", "aws-region-required": "AWS-Region ist erforderlich",
"number-from": "Absendernummer", "number-from": "Telefonnummer Von",
"number-from-required": "Absendernummer ist erforderlich.", "number-from-required": "Telefonnummer Von ist erforderlich.",
"number-to": "Empfängernummer", "number-to": "Telefonnummer An",
"number-to-required": "Empfängernummer ist erforderlich.", "number-to-required": "Telefonnummer An ist erforderlich.",
"phone-number-hint": "Telefonnummer im E.164-Format, z. B. +19995550123", "phone-number-hint": "Telefonnummer im E.164-Format, z.B. +19995550123",
"phone-number-hint-twilio": "Telefonnummer im E.164-Format/SID der Telefonnummer/Messaging Service SID, z. B. +19995550123/PNXXX/MGXXX", "phone-number-hint-twilio": "Telefonnummer im E.164-Format/SID der Telefonnummer/SID des Messaging-Dienstes, z. B. +19995550123/PNXXX/MGXXX",
"phone-number-pattern": "Ungültige Telefonnummer. Sollte im E.164-Format sein, z. B. +19995550123.", "phone-number-pattern": "Ungültige Telefonnummer. Sollte im E.164-Format vorliegen, z. B. +19995550123.",
"phone-number-pattern-twilio": "Ungültige Telefonnummer. Sollte im E.164-Format/SID der Telefonnummer/Messaging Service SID sein.", "phone-number-pattern-twilio": "Ungültige Telefonnummer. Sollte im E.164-Format/SID der Telefonnummer/SID des Messaging-Dienstes vorliegen, z. B. +19995550123/PNXXX/MGXXX.",
"sms-message": "SMS-Nachricht", "sms-message": "SMS-Nachricht",
"sms-message-required": "SMS-Nachricht ist erforderlich.", "sms-message-required": "SMS-Nachricht ist erforderlich.",
"sms-message-max-length": "SMS-Nachricht darf nicht länger als 1600 Zeichen sein", "sms-message-max-length": "SMS-Nachricht darf nicht länger als 1600 Zeichen sein",
"twilio-account-sid": "Twilio Account SID", "twilio-account-sid": "Twilio-Konto SID",
"twilio-account-sid-required": "Twilio Account SID ist erforderlich", "twilio-account-sid-required": "Twilio-Konto SID ist erforderlich",
"twilio-account-token": "Twilio Account Token", "twilio-account-token": "Twilio-Konto-Token",
"twilio-account-token-required": "Twilio Account Token ist erforderlich", "twilio-account-token-required": "Twilio-Konto-Token ist erforderlich",
"send-test-sms": "Test-SMS senden", "send-test-sms": "Test-SMS senden",
"test-sms-sent": "Test-SMS wurde erfolgreich gesendet!", "test-sms-sent": "Test-SMS wurde erfolgreich gesendet!",
"security-settings": "Sicherheitseinstellungen", "security-settings": "Sicherheitseinstellungen",
"password-policy": "Passwortrichtlinie", "password-policy": "Passwortrichtlinie",
"minimum-password-length": "Minimale Passwortlänge", "minimum-password-length": "Minimale Passwortlänge",
"minimum-password-length-required": "Minimale Passwortlänge ist erforderlich", "minimum-password-length-required": "Minimale Passwortlänge ist erforderlich",
"minimum-password-length-range": "Minimale Passwortlänge sollte zwischen 6 und 50 Zeichen liegen", "minimum-password-length-range": "Die minimale Passwortlänge muss zwischen 6 und 50 liegen",
"maximum-password-length": "Maximale Passwortlänge", "maximum-password-length": "Maximale Passwortlänge",
"maximum-password-length-min": "Maximale Passwortlänge sollte mindestens 6 betragen", "maximum-password-length-min": "Die maximale Passwortlänge muss mindestens 6 betragen",
"maximum-password-length-less-min": "Maximale Passwortlänge muss größer als die minimale Länge sein", "maximum-password-length-less-min": "Die maximale Passwortlänge muss größer als die minimale sein",
"minimum-uppercase-letters": "Minimale Anzahl an Großbuchstaben", "minimum-uppercase-letters": "Mindestanzahl an Großbuchstaben",
"minimum-uppercase-letters-range": "Minimale Anzahl an Großbuchstaben darf nicht negativ sein", "minimum-uppercase-letters-range": "Die Mindestanzahl an Großbuchstaben darf nicht negativ sein",
"minimum-lowercase-letters": "Minimale Anzahl an Kleinbuchstaben", "minimum-lowercase-letters": "Mindestanzahl an Kleinbuchstaben",
"minimum-lowercase-letters-range": "Minimale Anzahl an Kleinbuchstaben darf nicht negativ sein", "minimum-lowercase-letters-range": "Die Mindestanzahl an Kleinbuchstaben darf nicht negativ sein",
"minimum-digits": "Minimale Anzahl an Ziffern", "minimum-digits": "Mindestanzahl an Ziffern",
"minimum-digits-range": "Minimale Anzahl an Ziffern darf nicht negativ sein", "minimum-digits-range": "Die Mindestanzahl an Ziffern darf nicht negativ sein",
"minimum-special-characters": "Minimale Anzahl an Sonderzeichen", "minimum-special-characters": "Mindestanzahl an Sonderzeichen",
"minimum-special-characters-range": "Minimale Anzahl an Sonderzeichen darf nicht negativ sein", "minimum-special-characters-range": "Die Mindestanzahl an Sonderzeichen darf nicht negativ sein",
"password-expiration-period-days": "Passwort-Ablaufzeitraum in Tagen", "password-expiration-period-days": "Passwort-Ablaufzeitraum in Tagen",
"password-expiration-period-days-range": "Passwort-Ablaufzeitraum darf nicht negativ sein", "password-expiration-period-days-range": "Passwort-Ablaufzeitraum darf nicht negativ sein",
"password-reuse-frequency-days": "Häufigkeit der Passwortwiederverwendung in Tagen", "password-reuse-frequency-days": "Häufigkeit der Passwortwiederverwendung in Tagen",
@ -676,8 +676,8 @@
"alias": { "alias": {
"add": "Alias hinzufügen", "add": "Alias hinzufügen",
"edit": "Alias bearbeiten", "edit": "Alias bearbeiten",
"name": "Aliasname", "name": "Alias-Name",
"name-required": "Aliasname ist erforderlich", "name-required": "Alias-Name ist erforderlich",
"duplicate-alias": "Ein Alias mit demselben Namen existiert bereits.", "duplicate-alias": "Ein Alias mit demselben Namen existiert bereits.",
"filter-type-single-entity": "Einzelne Entität", "filter-type-single-entity": "Einzelne Entität",
"filter-type-entity-list": "Entitätsliste", "filter-type-entity-list": "Entitätsliste",
@ -864,15 +864,15 @@
"api-features": "API-Funktionen", "api-features": "API-Funktionen",
"api-usage": "API-Nutzung", "api-usage": "API-Nutzung",
"alarm": "Alarm", "alarm": "Alarm",
"alarms-created": "Erstellte Alarme", "alarms-created": "Alarme erstellt",
"queue-stats": "Warteschlangenstatistiken", "queue-stats": "Warteschlangenstatistiken",
"processing-failures-and-timeouts": "Verarbeitungsfehler und Zeitüberschreitungen", "processing-failures-and-timeouts": "Verarbeitungsfehler und Zeitüberschreitungen",
"exceptions": "Ausnahmen", "exceptions": "Ausnahmen",
"alarms-created-daily-activity": "Tägliche Aktivität der Alarmerstellung", "alarms-created-daily-activity": "Tägliche Aktivität der Alarm-Erstellung",
"alarms-created-hourly-activity": "Stündliche Aktivität der Alarmerstellung", "alarms-created-hourly-activity": "Stündliche Aktivität der Alarm-Erstellung",
"alarms-created-monthly-activity": "Monatliche Aktivität der Alarmerstellung", "alarms-created-monthly-activity": "Monatliche Aktivität der Alarm-Erstellung",
"data-points": "Datenpunkte", "data-points": "Datenpunkte",
"data-points-storage-days": "Speichertage der Datenpunkte", "data-points-storage-days": "Speicherzeitraum der Datenpunkte (in Tagen)",
"device-api": "Geräte-API", "device-api": "Geräte-API",
"email": "E-Mail", "email": "E-Mail",
"email-messages": "E-Mail-Nachrichten", "email-messages": "E-Mail-Nachrichten",
@ -1111,13 +1111,15 @@
"mistral-ai": "Mistral AI", "mistral-ai": "Mistral AI",
"anthropic": "Anthropic", "anthropic": "Anthropic",
"amazon-bedrock": "Amazon Bedrock", "amazon-bedrock": "Amazon Bedrock",
"github-models": "GitHub-Modelle" "github-models": "GitHub-Modelle",
"ollama": "Ollama"
}, },
"name-required": "Name ist erforderlich.", "name-required": "Name ist erforderlich.",
"name-max-length": "Der Name darf höchstens 255 Zeichen lang sein.", "name-max-length": "Der Name darf höchstens 255 Zeichen lang sein.",
"provider": "Anbieter", "provider": "Anbieter",
"api-key": "API-Schlüssel", "api-key": "API-Schlüssel",
"api-key-required": "API-Schlüssel ist erforderlich.", "api-key-required": "API-Schlüssel ist erforderlich.",
"api-key-open-ai-required": "API-Schlüssel ist erforderlich, wenn die offizielle OpenAI-API verwendet wird.",
"project-id": "Projekt-ID", "project-id": "Projekt-ID",
"project-id-required": "Projekt-ID ist erforderlich.", "project-id-required": "Projekt-ID ist erforderlich.",
"location": "Standort", "location": "Standort",
@ -1147,24 +1149,41 @@
"top-p-hint": "Erstellt einen Pool der wahrscheinlichsten Tokens, aus denen das Modell auswählt. Höhere Werte erweitern den Pool, niedrigere verkleinern ihn.", "top-p-hint": "Erstellt einen Pool der wahrscheinlichsten Tokens, aus denen das Modell auswählt. Höhere Werte erweitern den Pool, niedrigere verkleinern ihn.",
"top-p-min-max": "Muss größer als 0 und maximal 1 sein.", "top-p-min-max": "Muss größer als 0 und maximal 1 sein.",
"top-k": "Top K", "top-k": "Top K",
"top-k-hint": "Begrenzt die Auswahl des Modells auf die „K“ wahrscheinlichsten Tokens.", "top-k-hint": "Begrenzt die Auswahl des Modells auf die \"K\" wahrscheinlichsten Tokens.",
"top-k-min": "Muss 0 oder größer sein.", "top-k-min": "Muss 0 oder größer sein.",
"presence-penalty": "Strafe für Anwesenheit", "presence-penalty": "Präsenzstrafe",
"presence-penalty-hint": "Wendet eine feste Strafe auf die Wahrscheinlichkeit eines Tokens an, wenn es bereits im Text erschienen ist.", "presence-penalty-hint": "Wendet eine feste Strafe auf die Wahrscheinlichkeit eines Tokens an, wenn es bereits im Text erschienen ist.",
"frequency-penalty": "Strafe für Häufigkeit", "frequency-penalty": "Frequenzstrafe",
"frequency-penalty-hint": "Verringert die Wahrscheinlichkeit eines Tokens basierend auf seiner Häufigkeit im Text.", "frequency-penalty-hint": "Reduziert die Wahrscheinlichkeit eines Tokens abhängig von seiner Häufigkeit im Text.",
"max-output-tokens": "Maximale Ausgabetokens", "max-output-tokens": "Maximale Ausgabetokens",
"max-output-tokens-min": "Muss größer als 0 sein.", "max-output-tokens-hint": "Legt die maximale Anzahl an Tokens fest, die das \nModell in einer Antwort generieren kann.",
"max-output-tokens-hint": "Legt die maximale Anzahl an Tokens fest, die das Modell in einer Antwort generieren kann.", "context-length": "Kontextlänge",
"context-length-hint": "Definiert die Größe des Kontextfensters in Tokens. Dieser Wert legt das Gesamtspeicherlimit für das Modell fest – einschließlich Benutzereingabe und generierter Antwort.",
"endpoint": "Endpunkt", "endpoint": "Endpunkt",
"endpoint-required": "Endpunkt ist erforderlich.", "endpoint-required": "Endpunkt ist erforderlich.",
"baseurl": "Basis-URL",
"baseurl-required": "Basis-URL ist erforderlich.",
"service-version": "Service-Version", "service-version": "Service-Version",
"check-connectivity": "Konnektivität prüfen", "check-connectivity": "Konnektivität prüfen",
"check-connectivity-success": "Testanfrage war erfolgreich", "check-connectivity-success": "Testanfrage war erfolgreich",
"check-connectivity-failed": "Testanfrage fehlgeschlagen", "check-connectivity-failed": "Testanfrage fehlgeschlagen",
"no-model-matching": "Keine mit '{{entity}}' übereinstimmenden Modelle gefunden.", "no-model-matching": "Keine Modelle gefunden, die mit '{{entity}}' übereinstimmen.",
"model-required": "Modell ist erforderlich.", "model-required": "Modell ist erforderlich.",
"no-model-text": "Keine Modelle gefunden." "no-model-text": "Keine Modelle gefunden.",
"authentication": "Authentifizierung",
"authentication-basic-hint": "Verwendet die Standard-HTTP-Basis-Authentifizierung. Benutzername und Passwort werden kombiniert, Base64-codiert und im \"Authorization\"-Header an den Ollama-Server gesendet.",
"authentication-token-hint": "Verwendet die Bearer-Token-Authentifizierung. Das bereitgestellte Token wird direkt im \"Authorization\"-Header an den Ollama-Server gesendet.",
"authentication-type": {
"none": "Keine",
"basic": "Basis",
"token": "Token"
},
"username": "Benutzername",
"username-required": "Benutzername ist erforderlich.",
"password": "Passwort",
"password-required": "Passwort ist erforderlich.",
"token": "Token",
"token-required": "Token ist erforderlich."
}, },
"confirm-on-exit": { "confirm-on-exit": {
"message": "Sie haben ungespeicherte Änderungen. Möchten Sie diese Seite wirklich verlassen?", "message": "Sie haben ungespeicherte Änderungen. Möchten Sie diese Seite wirklich verlassen?",
@ -1228,7 +1247,7 @@
"required-fields": "Erforderliche Felder fehlen" "required-fields": "Erforderliche Felder fehlen"
}, },
"content-type": { "content-type": {
"json": "Json", "json": "JSON",
"text": "Text", "text": "Text",
"binary": "Binär (Base64)" "binary": "Binär (Base64)"
}, },
@ -1261,11 +1280,11 @@
"add-customer-text": "Neuen Kunden hinzufügen", "add-customer-text": "Neuen Kunden hinzufügen",
"no-customers-text": "Keine Kunden gefunden", "no-customers-text": "Keine Kunden gefunden",
"customer-details": "Kundendetails", "customer-details": "Kundendetails",
"delete-customer-title": "Möchten Sie den Kunden '{{customerTitle}}' wirklich löschen?", "delete-customer-title": "Sind Sie sicher, dass Sie den Kunden '{{customerTitle}}' löschen möchten?",
"delete-customer-text": "Achtung, nach der Bestätigung werden der Kunde und alle zugehörigen Daten unwiederbringlich gelöscht.", "delete-customer-text": "Achtung: Nach der Bestätigung werden der Kunde und alle zugehörigen Daten unwiderruflich gelöscht.",
"delete-customers-title": "Möchten Sie { count, plural, =1 {1 Kunden} other {# Kunden} } wirklich löschen?", "delete-customers-title": "Sind Sie sicher, dass Sie { count, plural, =1 {1 Kunden} other {# Kunden} } löschen möchten?",
"delete-customers-action-title": "{ count, plural, =1 {1 Kunden löschen} other {# Kunden löschen} }", "delete-customers-action-title": "{ count, plural, =1 {1 Kunden löschen} other {# Kunden löschen} }",
"delete-customers-text": "Achtung, nach der Bestätigung werden alle ausgewählten Kunden und alle zugehörigen Daten gelöscht.", "delete-customers-text": "Achtung: Nach der Bestätigung werden alle ausgewählten Kunden und deren zugehörige Daten unwiderruflich gelöscht.",
"manage-users": "Benutzer verwalten", "manage-users": "Benutzer verwalten",
"manage-assets": "Assets verwalten", "manage-assets": "Assets verwalten",
"manage-devices": "Geräte verwalten", "manage-devices": "Geräte verwalten",
@ -1578,13 +1597,13 @@
"time-prev-description": "Zeitstempel des vorherigen Werts;", "time-prev-description": "Zeitstempel des vorherigen Werts;",
"prev-orig-value-description": "ursprünglicher vorheriger Wert;", "prev-orig-value-description": "ursprünglicher vorheriger Wert;",
"aggregation": "Aggregation", "aggregation": "Aggregation",
"aggregation-type-hint-common": "Aus Leistungsgründen ist die Berechnung aggregierter Werte nur für feste Zeitintervalle wie 'heutiger Tag', 'aktueller Monat' usw. verfügbar, nicht jedoch für gleitende Zeitfenster wie 'letzte 30 Minuten'.", "aggregation-type-hint-common": "Aus Leistungsgründen ist die Aggregationsberechnung nur für feste Zeitintervalle wie \"aktueller Tag\", \"aktueller Monat\" usw. verfügbar und nicht für gleitende Zeitfenster wie \"letzte 30 Minuten\" oder \"letzte 24 Stunden\".",
"aggregation-type-none-hint": "Letzten Wert übernehmen.", "aggregation-type-none-hint": "Letzten Wert übernehmen.",
"aggregation-type-min-hint": "Mindestwert innerhalb des ausgewählten Zeitfensters finden.", "aggregation-type-min-hint": "Minimalwert unter den Datenpunkten innerhalb eines ausgewählten Zeitfensters ermitteln.",
"aggregation-type-max-hint": "Höchstwert innerhalb des ausgewählten Zeitfensters finden.", "aggregation-type-max-hint": "Maximalwert unter den Datenpunkten innerhalb eines ausgewählten Zeitfensters ermitteln.",
"aggregation-type-avg-hint": "Durchschnittswert innerhalb des ausgewählten Zeitfensters berechnen.", "aggregation-type-avg-hint": "Durchschnittswert der Datenpunkte innerhalb eines ausgewählten Zeitfensters berechnen.",
"aggregation-type-sum-hint": "Alle Werte der Datenpunkte im Zeitfenster summieren.", "aggregation-type-sum-hint": "Summe aller Werte der Datenpunkte innerhalb eines ausgewählten Zeitfensters berechnen.",
"aggregation-type-count-hint": "Gesamtanzahl der Datenpunkte im Zeitfenster.", "aggregation-type-count-hint": "Gesamtanzahl der Datenpunkte innerhalb eines ausgewählten Zeitfensters.",
"delta-calculation": "Delta-Berechnung", "delta-calculation": "Delta-Berechnung",
"enable-delta-calculation": "Delta-Berechnung aktivieren", "enable-delta-calculation": "Delta-Berechnung aktivieren",
"enable-delta-calculation-hint": "Wenn aktiviert, wird der Wert basierend auf aggregierten Werten für ein ausgewähltes Zeitfenster und einen Vergleichszeitraum berechnet. Delta-Berechnung ist nur für historische Zeitfenster verfügbar, nicht für Echtzeitwerte.", "enable-delta-calculation-hint": "Wenn aktiviert, wird der Wert basierend auf aggregierten Werten für ein ausgewähltes Zeitfenster und einen Vergleichszeitraum berechnet. Delta-Berechnung ist nur für historische Zeitfenster verfügbar, nicht für Echtzeitwerte.",
@ -1991,19 +2010,19 @@
"create-new-device-profile": "Neues erstellen!", "create-new-device-profile": "Neues erstellen!",
"mqtt-device-topic-filters": "MQTT-Gerät-Topic-Filter", "mqtt-device-topic-filters": "MQTT-Gerät-Topic-Filter",
"mqtt-device-topic-filters-unique": "MQTT-Gerät-Topic-Filter müssen eindeutig sein.", "mqtt-device-topic-filters-unique": "MQTT-Gerät-Topic-Filter müssen eindeutig sein.",
"mqtt-device-topic-filters-spark-plug": "MQTT Sparkplug B Edge-of-Network (EoN) Node.", "mqtt-device-topic-filters-spark-plug": "MQTT Sparkplug B Edge-of-Network (EoN)-Knoten.",
"mqtt-device-topic-filters-spark-plug-hint": "Erlaubt Verbindungen von EoN-Nodes mit Sparkplug B Nutzlast und Topic-Format.", "mqtt-device-topic-filters-spark-plug-hint": "Erlaubt Verbindungen von EoN-Knoten mit Sparkplug B Payload- und Topic-Format.",
"mqtt-device-topic-filters-spark-plug-attribute-metric-names": "SparkPlug-Metriken zur Speicherung als Attribute.", "mqtt-device-topic-filters-spark-plug-attribute-metric-names": "SparkPlug-Metriken, die als Attribute gespeichert werden.",
"mqtt-device-topic-filters-spark-plug-attribute-metric-names-hint": "Namen der SparkPlug-Metriken, die als Geräteattribute gespeichert werden. Alle anderen Metriken werden als Telemetrie gespeichert.", "mqtt-device-topic-filters-spark-plug-attribute-metric-names-hint": "Namen der SparkPlug-Metriken, die als Geräteattribute gespeichert werden. Alle anderen Metriken werden als Gerätetelemetrie gespeichert.",
"mqtt-device-payload-type": "MQTT-Geräte-Nutzlast", "mqtt-device-payload-type": "MQTT-Geräte-Payload",
"mqtt-device-payload-type-json": "JSON", "mqtt-device-payload-type-json": "JSON",
"mqtt-device-payload-type-proto": "Protobuf", "mqtt-device-payload-type-proto": "Protobuf",
"mqtt-enable-compatibility-with-json-payload-format": "Kompatibilität mit anderen Nutzlast-Formaten aktivieren.", "mqtt-enable-compatibility-with-json-payload-format": "Kompatibilität mit anderen Payload-Formaten aktivieren.",
"mqtt-enable-compatibility-with-json-payload-format-hint": "Wenn aktiviert, wird standardmäßig das Protobuf-Format verwendet. Bei Parsing-Fehlern wird JSON genutzt. Nützlich für die Abwärtskompatibilität bei Firmware-Updates. Dieser Modus kann die Leistung leicht beeinträchtigen und sollte nach Abschluss der Updates deaktiviert werden.", "mqtt-enable-compatibility-with-json-payload-format-hint": "Wenn aktiviert, verwendet die Plattform standardmäßig das Protobuf-Payload-Format. Falls das Parsing fehlschlägt, versucht die Plattform, das JSON-Format zu verwenden. Nützlich für Abwärtskompatibilität bei Firmware-Updates. Beispielsweise nutzt die ursprüngliche Firmware-Version JSON, während die neue Version Protobuf verwendet. Während des Firmware-Update-Prozesses für die gesamte Geräteflotte ist es erforderlich, beide Formate gleichzeitig zu unterstützen. Der Kompatibilitätsmodus führt zu einer geringen Performanceeinbuße und sollte deaktiviert werden, sobald alle Geräte aktualisiert sind.",
"mqtt-use-json-format-for-default-downlink-topics": "JSON-Format für Standard-Downlink-Themen verwenden", "mqtt-use-json-format-for-default-downlink-topics": "JSON-Format für Standard-Downlink-Topics verwenden",
"mqtt-use-json-format-for-default-downlink-topics-hint": "Wenn aktiviert, wird das JSON-Format für die Standard-Downlink-Themen verwendet, z.B.: <b>v1/devices/me/attributes/response/$request_id</b>. Neue v2-Themen sind davon nicht betroffen.", "mqtt-use-json-format-for-default-downlink-topics-hint": "Wenn aktiviert, verwendet die Plattform das JSON-Payload-Format zum Übertragen von Attributen und RPC über folgende Topics: <b>v1/devices/me/attributes/response/$request_id</b>, <b>v1/devices/me/attributes</b>, <b>v1/devices/me/rpc/request/$request_id</b>, <b>v1/devices/me/rpc/response/$request_id</b>. Diese Einstellung beeinflusst nicht die Verwendung neuer (v2) Topics: <b>v2/a/res/$request_id</b>, <b>v2/a</b>, <b>v2/r/req/$request_id</b>, <b>v2/r/res/$request_id</b>. Dabei ist <b>$request_id</b> ein ganzzahliger Anfrage-Identifier.",
"mqtt-send-ack-on-validation-exception": "PUBACK bei Validierungsfehler senden", "mqtt-send-ack-on-validation-exception": "PUBACK bei PUBLISH-Validierungsfehler senden",
"mqtt-send-ack-on-validation-exception-hint": "Standardmäßig wird die Sitzung bei einem Validierungsfehler geschlossen. Wenn aktiviert, wird stattdessen eine Bestätigung gesendet.", "mqtt-send-ack-on-validation-exception-hint": "Standardmäßig beendet die Plattform die MQTT-Sitzung bei einem Validierungsfehler. Wenn aktiviert, sendet die Plattform stattdessen eine Bestätigung (PUBACK), anstatt die Sitzung zu schließen.",
"mqtt-protocol-version": "Protokollversion", "mqtt-protocol-version": "Protokollversion",
"snmp-add-mapping": "SNMP-Zuordnung hinzufügen", "snmp-add-mapping": "SNMP-Zuordnung hinzufügen",
"snmp-mapping-not-configured": "Keine Zuordnung für OID zu Zeitreihen/Telemetrie konfiguriert", "snmp-mapping-not-configured": "Keine Zuordnung für OID zu Zeitreihen/Telemetrie konfiguriert",
@ -2038,11 +2057,11 @@
"rpc-request-proto-schema": "RPC-Anfrage-Protoschema", "rpc-request-proto-schema": "RPC-Anfrage-Protoschema",
"rpc-request-proto-schema-required": "RPC-Anfrage-Protoschema ist erforderlich.", "rpc-request-proto-schema-required": "RPC-Anfrage-Protoschema ist erforderlich.",
"rpc-request-proto-schema-hint": "RPC-Anforderungsnachrichten müssen die Felder 'string method = 1;', 'int32 requestId = 2;' und 'params = 3' enthalten.", "rpc-request-proto-schema-hint": "RPC-Anforderungsnachrichten müssen die Felder 'string method = 1;', 'int32 requestId = 2;' und 'params = 3' enthalten.",
"not-valid-pattern-topic-filter": "Ungültiges Muster im Topic-Filter", "not-valid-pattern-topic-filter": "Ungültiges Topic-Filter-Muster",
"not-valid-single-character": "Ungültige Verwendung eines Single-Level-Wildcards", "not-valid-single-character": "Ungültige Verwendung eines einstelligen Platzhalters",
"not-valid-multi-character": "Ungültige Verwendung eines Multi-Level-Wildcards", "not-valid-multi-character": "Ungültige Verwendung eines mehrstufigen Platzhalters",
"single-level-wildcards-hint": "<code>[+]</code> kann jedes Topic-Level ersetzen. Beispiel: <b>v1/devices/+/telemetry</b>.", "single-level-wildcards-hint": "<code>[+]</code> eignet sich für jede Ebene eines Topic-Filters. Beispiel: <b>v1/devices/+/telemetry</b> oder <b>+/devices/+/attributes</b>.",
"multi-level-wildcards-hint": "<code>[#]</code> ersetzt mehrere Ebenen und muss am Ende des Topics stehen. Beispiel: <b>#</b> oder <b>v1/devices/me/#</b>.", "multi-level-wildcards-hint": "<code>[#]</code> kann das gesamte Topic-Filter ersetzen und muss das letzte Symbol im Topic sein. Beispiel: <b>#</b> oder <b>v1/devices/me/#</b>.",
"alarm-rules": "Alarmregeln", "alarm-rules": "Alarmregeln",
"alarm-rules-with-count": "Alarmregeln ({{count}})", "alarm-rules-with-count": "Alarmregeln ({{count}})",
"no-alarm-rules": "Keine Alarmregeln konfiguriert", "no-alarm-rules": "Keine Alarmregeln konfiguriert",
@ -2050,8 +2069,8 @@
"edit-alarm-rule": "Alarmregel bearbeiten", "edit-alarm-rule": "Alarmregel bearbeiten",
"alarm-type": "Alarmtyp", "alarm-type": "Alarmtyp",
"alarm-type-required": "Alarmtyp ist erforderlich.", "alarm-type-required": "Alarmtyp ist erforderlich.",
"alarm-type-unique": "Alarmtyp muss innerhalb der Alarmregeln des Geräteprofils eindeutig sein.", "alarm-type-unique": "Der Alarmtyp muss innerhalb der Geräteprofil-Alarmregeln eindeutig sein.",
"alarm-type-max-length": "Alarmtyp sollte weniger als 256 Zeichen enthalten", "alarm-type-max-length": "Alarmtyp darf maximal 256 Zeichen lang sein",
"create-alarm-pattern": "<b>{{alarmType}}</b> Alarm erstellen", "create-alarm-pattern": "<b>{{alarmType}}</b> Alarm erstellen",
"create-alarm-rules": "Alarmregeln erstellen", "create-alarm-rules": "Alarmregeln erstellen",
"no-create-alarm-rules": "Keine Erstellungsbedingungen konfiguriert", "no-create-alarm-rules": "Keine Erstellungsbedingungen konfiguriert",
@ -2072,16 +2091,16 @@
"advanced-settings": "Erweiterte Einstellungen", "advanced-settings": "Erweiterte Einstellungen",
"alarm-rule-additional-info": "Zusätzliche Informationen", "alarm-rule-additional-info": "Zusätzliche Informationen",
"edit-alarm-rule-additional-info": "Zusätzliche Informationen bearbeiten", "edit-alarm-rule-additional-info": "Zusätzliche Informationen bearbeiten",
"alarm-rule-additional-info-placeholder": "Bitte Kommentare und Anpassungen angeben, die unter 'Zusätzliche Informationen' bei Alarmdetails angezeigt werden.", "alarm-rule-additional-info-placeholder": "Bitte geben Sie hier Ihre Kommentare und Anpassungen ein, um sie unter 'Zusätzliche Informationen' in den Alarmdetails anzuzeigen.",
"alarm-rule-additional-info-hint": "Hinweis: Verwenden Sie <code><span style=\"color: #000;\">$&#123;</span>keyName<span style=\"color: #000;\">&#125;</span></code> zur Ersetzung von Attribut- oder Telemetriedaten.", "alarm-rule-additional-info-hint": "Hinweis: Verwenden Sie <code><span style=\"color: #000;\">$&#123;</span>keyName<span style=\"color: #000;\">&#125;</span></code>, um Werte von Attribut- oder Telemetrie-Schlüsseln zu ersetzen, die in der Alarmregel-Bedingung verwendet werden.",
"alarm-rule-mobile-dashboard": "Mobiles Dashboard", "alarm-rule-mobile-dashboard": "Mobiles Dashboard",
"alarm-rule-mobile-dashboard-hint": "Wird von der mobilen App als Alarminformationen-Dashboard genutzt", "alarm-rule-mobile-dashboard-hint": "Wird von der mobilen Anwendung als Dashboard für Alarmdetails verwendet",
"alarm-rule-no-mobile-dashboard": "Kein Dashboard ausgewählt", "alarm-rule-no-mobile-dashboard": "Kein Dashboard ausgewählt",
"propagate-alarm": "Alarm auf verbundene Entitäten propagieren", "propagate-alarm": "Alarm an zugehörige Entitäten weiterleiten",
"alarm-rule-relation-types-list": "Beziehungstypen", "alarm-rule-relation-types-list": "Beziehungstypen",
"alarm-rule-relation-types-list-hint": "Definiert Beziehungstypen zur Filterung der verbundenen Entitäten. Wenn nicht gesetzt, wird der Alarm an alle verbundenen Entitäten propagiert.", "alarm-rule-relation-types-list-hint": "Definiert Beziehungstypen zur Filterung der zugehörigen Entitäten. Wenn nicht gesetzt, wird der Alarm an alle zugehörigen Entitäten weitergeleitet.",
"propagate-alarm-to-owner": "Alarm an Eigentümer der Entität (Kunde oder Mandant) propagieren", "propagate-alarm-to-owner": "Alarm an Eigentümer der Entität weiterleiten (Kunde oder Tenant)",
"propagate-alarm-to-tenant": "Alarm an Mandant propagieren", "propagate-alarm-to-tenant": "Alarm an den Tenant weiterleiten",
"alarm-rule-condition": "Alarmregelbedingung", "alarm-rule-condition": "Alarmregelbedingung",
"enter-alarm-rule-condition-prompt": "Bitte fügen Sie eine Alarmregelbedingung hinzu", "enter-alarm-rule-condition-prompt": "Bitte fügen Sie eine Alarmregelbedingung hinzu",
"edit-alarm-rule-condition": "Alarmregelbedingung bearbeiten", "edit-alarm-rule-condition": "Alarmregelbedingung bearbeiten",
@ -2237,28 +2256,28 @@
"tqs": "TQS: Sowohl TCP- als auch SMS-Verbindungen aktiv; TCP im Queue-Modus, SMS im Standardmodus (nicht unterstützt seit LWM2M 1.1)", "tqs": "TQS: Sowohl TCP- als auch SMS-Verbindungen aktiv; TCP im Queue-Modus, SMS im Standardmodus (nicht unterstützt seit LWM2M 1.1)",
"sq": "SQ: SMS-Verbindung im Queue-Modus (nicht unterstützt seit LWM2M 1.1)" "sq": "SQ: SMS-Verbindung im Queue-Modus (nicht unterstützt seit LWM2M 1.1)"
}, },
"binding-tooltip": "Liste der unterstützten Bindungsmodi im \"binding\"-Ressourcenelement des LwM2M-Serverobjekts - /1/x/7.\nMehrere Übertragungsmodi sind möglich, aber nur einer wird während einer Transport-Session genutzt.", "binding-tooltip": "Dies ist die Liste im \"binding\"-Ressourcenelement des LwM2M-Serverobjekts – /1/x/7.\nGibt die unterstützten Binding-Modi im LwM2M-Client an.\nDieser Wert SOLLTE mit dem Wert in der Ressource „Supported Binding and Modes“ im Geräteobjekt (/3/0/16) übereinstimmen.\nObwohl mehrere Transports unterstützt werden, kann während einer gesamten Transportsitzung nur ein Transport-Binding verwendet werden.\nBeispiel: Wenn sowohl UDP als auch SMS unterstützt werden, können der LwM2M-Client und der LwM2M-Server während der gesamten Transportsitzung entweder über UDP oder SMS kommunizieren.",
"bootstrap-server": "Bootstrap-Server", "bootstrap-server": "Bootstrap-Server",
"lwm2m-server": "LwM2M-Server", "lwm2m-server": "LwM2M-Server",
"include-bootstrap-server": "Bootstrap-Server-Updates einbeziehen", "include-bootstrap-server": "Bootstrap-Server-Updates einbeziehen",
"bootstrap-update-title": "Bootstrap-Server ist bereits konfiguriert. Möchten Sie die Updates wirklich ausschließen?", "bootstrap-update-title": "Bootstrap-Server ist bereits konfiguriert. Möchten Sie die Updates wirklich ausschließen?",
"bootstrap-update-text": "Vorsicht: Nach der Bestätigung gehen die Konfigurationsdaten des Bootstrap-Servers verloren.", "bootstrap-update-text": "Achtung: Nach der Bestätigung werden die Konfigurationsdaten des Bootstrap-Servers unwiderruflich gelöscht.",
"server-host": "Host", "server-host": "Host",
"server-host-required": "Host ist erforderlich.", "server-host-required": "Host ist erforderlich.",
"server-port": "Port", "server-port": "Port",
"server-port-required": "Port ist erforderlich.", "server-port-required": "Port ist erforderlich.",
"server-port-pattern": "Port muss eine positive Ganzzahl sein.", "server-port-pattern": "Port muss eine positive ganze Zahl sein.",
"server-port-range": "Port sollte im Bereich von 1 bis 65535 liegen.", "server-port-range": "Port muss im Bereich von 1 bis 65535 liegen.",
"server-public-key": "Öffentlicher Schlüssel des Servers", "server-public-key": "Öffentlicher Schlüssel des Servers",
"server-public-key-required": "Öffentlicher Schlüssel des Servers ist erforderlich.", "server-public-key-required": "Öffentlicher Schlüssel des Servers ist erforderlich.",
"client-hold-off-time": "Wartezeit des Clients", "client-hold-off-time": "Verzögerungszeit (Hold Off Time)",
"client-hold-off-time-required": "Wartezeit des Clients ist erforderlich.", "client-hold-off-time-required": "Verzögerungszeit ist erforderlich.",
"client-hold-off-time-pattern": "Wartezeit des Clients muss eine positive Ganzzahl sein.", "client-hold-off-time-pattern": "Verzögerungszeit muss eine positive ganze Zahl sein.",
"client-hold-off-time-tooltip": "Client-Wartezeit nur bei Verwendung eines Bootstrap-Servers", "client-hold-off-time-tooltip": "Verzögerungszeit für den Einsatz mit einem Bootstrap-Server",
"account-after-timeout": "Konto nach Zeitüberschreitung", "account-after-timeout": "Aktivierung nach Zeitüberschreitung",
"account-after-timeout-required": "Konto nach Zeitüberschreitung ist erforderlich.", "account-after-timeout-required": "Aktivierung nach Zeitüberschreitung ist erforderlich.",
"account-after-timeout-pattern": "Konto nach Zeitüberschreitung muss eine positive Ganzzahl sein.", "account-after-timeout-pattern": "Der Wert muss eine positive ganze Zahl sein.",
"account-after-timeout-tooltip": "Wert für Konto nach Zeitüberschreitung beim Bootstrap-Server.", "account-after-timeout-tooltip": "Bootstrap-Server-Aktivierung nach dem durch diese Ressource angegebenen Timeout-Wert.",
"server-type": "Servertyp", "server-type": "Servertyp",
"add-new-server-title": "Neue Serverkonfiguration hinzufügen", "add-new-server-title": "Neue Serverkonfiguration hinzufügen",
"add-server-config": "Serverkonfiguration hinzufügen", "add-server-config": "Serverkonfiguration hinzufügen",
@ -2267,25 +2286,25 @@
"others-tab": "Weitere Einstellungen", "others-tab": "Weitere Einstellungen",
"ota-update": "OTA-Update", "ota-update": "OTA-Update",
"use-object-19-for-ota-update": "Objekt 19 für OTA-Dateimetadaten verwenden (Prüfsumme, Größe, Version, Name)", "use-object-19-for-ota-update": "Objekt 19 für OTA-Dateimetadaten verwenden (Prüfsumme, Größe, Version, Name)",
"use-object-19-for-ota-update-hint": "Verwenden Sie Resource ObjectId = 19 für OTA-Updates: Firmware → InstanceId = 65534, Software → InstanceId = 65535. Das Datenformat ist JSON, codiert in Base64. Dieses JSON enthält OTA-Dateimetadaten (Dateiinformationen): „Checksum“ (SHA256). Zusätzliche Felder: „Title“ (OTA-Name), „Version“ (OTA-Version), „File Name“ (Dateiname zur Speicherung auf dem Client), „File Size“ (OTA-Größe in Bytes).", "use-object-19-for-ota-update-hint": "Verwenden Sie Resource ObjectId = 19 für OTA-Updates: FirmWare → InstanceId = 65534, SoftWare → InstanceId = 65535. Das Datenformat ist JSON, eingebettet in Base64. Dieses JSON enthält OTA-Dateimetadaten (Dateiinformationen): \"Prüfsumme\" (SHA256). Zusätzliche Felder: \"Titel\" (OTA-Name), \"Version\" (OTA-Version), \"Dateiname\" (Dateiname für die Speicherung auf dem Client), \"Dateigröße\" (OTA-Größe in Byte).",
"client-strategy": "Client-Strategie beim Verbinden", "client-strategy": "Client-Strategie beim Verbindungsaufbau",
"client-strategy-label": "Strategie", "client-strategy-label": "Strategie",
"client-strategy-only-observe": "Nur Beobachtungsanfragen nach der ersten Verbindung", "client-strategy-only-observe": "Nur Observe-Anfrage an den Client nach der ersten Verbindung",
"client-strategy-read-all": "Alle Ressourcen lesen und beobachten nach der Registrierung", "client-strategy-read-all": "Alle Ressourcen lesen und Observe-Anfrage nach der Registrierung senden",
"fw-update": "Firmware-Update", "fw-update": "Firmware-Update",
"fw-update-strategy": "Firmware-Update-Strategie", "fw-update-strategy": "Strategie für Firmware-Update",
"fw-update-strategy-data": "Firmware-Update als Binärdatei mit Objekt 19 und Ressource 0 (Daten) übertragen", "fw-update-strategy-data": "Firmware-Update als Binärdatei über Objekt 19 und Ressource 0 (Data) übertragen",
"fw-update-strategy-package": "Firmware-Update als Binärdatei mit Objekt 5 und Ressource 0 (Paket) übertragen", "fw-update-strategy-package": "Firmware-Update als Binärdatei über Objekt 5 und Ressource 0 (Package) übertragen",
"fw-update-strategy-package-uri": "Automatisch eindeutige CoAP-URL generieren, um das Paket herunterzuladen, und als Objekt 5 und Ressource 1 (Paket-URI) übertragen", "fw-update-strategy-package-uri": "Automatisch eindeutige CoAP-URL generieren und Firmware-Update über Objekt 5 und Ressource 1 (Package URI) übertragen",
"sw-update": "Software-Update", "sw-update": "Software-Update",
"sw-update-strategy": "Software-Update-Strategie", "sw-update-strategy": "Strategie für Software-Update",
"sw-update-strategy-package": "Binärdatei mit Objekt 9 und Ressource 2 (Paket) übertragen", "sw-update-strategy-package": "Binärdatei über Objekt 9 und Ressource 2 (Package) übertragen",
"sw-update-strategy-package-uri": "Automatisch eindeutige CoAP-URL generieren, um das Paket herunterzuladen, und Software-Update mit Objekt 9 und Ressource 3 (Paket-URI) übertragen", "sw-update-strategy-package-uri": "Automatisch eindeutige CoAP-URL generieren und Software-Update über Objekt 9 und Ressource 3 (Package URI) übertragen",
"fw-update-resource": "Firmware-Update CoAP-Ressource", "fw-update-resource": "CoAP-Ressource für Firmware-Update",
"fw-update-resource-required": "Firmware-Update CoAP-Ressource ist erforderlich.", "fw-update-resource-required": "CoAP-Ressource für Firmware-Update ist erforderlich.",
"sw-update-resource": "Software-Update CoAP-Ressource", "sw-update-resource": "CoAP-Ressource für Software-Update",
"sw-update-resource-required": "Software-Update CoAP-Ressource ist erforderlich.", "sw-update-resource-required": "CoAP-Ressource für Software-Update ist erforderlich.",
"config-json-tab": "JSON-Konfigurationsprofil Gerät", "config-json-tab": "JSON-Konfigurationsprofil für Gerät",
"attributes-name": { "attributes-name": {
"min-period": "Minimale Periode", "min-period": "Minimale Periode",
"max-period": "Maximale Periode", "max-period": "Maximale Periode",
@ -2810,20 +2829,20 @@
"server-attributes-placeholder": "Server-Attribute", "server-attributes-placeholder": "Server-Attribute",
"timeseries-placeholder": "Zeitreihen", "timeseries-placeholder": "Zeitreihen",
"target-entity": "Zielentität", "target-entity": "Zielentität",
"attributes-propagation": "Attributübertragung", "attributes-propagation": "Attributweiterleitung",
"attributes-propagation-hint": "Die Entitätsansicht kopiert automatisch die angegebenen Attribute von der Zielentität jedes Mal, wenn Sie diese Entitätsansicht speichern oder aktualisieren. Aus Leistungsgründen werden Zielentitätsattribute nicht bei jeder Attributänderung auf die Entitätsansicht übertragen. Sie können die automatische Übertragung aktivieren, indem Sie einen 'copy to view'-Regelknoten in Ihrer Regelkette konfigurieren und 'Post attributes' und 'Attributes Updated'-Nachrichten an diesen neuen Regelknoten verlinken.", "attributes-propagation-hint": "Die Entitätsansicht kopiert automatisch die angegebenen Attribute von der Zielentität jedes Mal, wenn Sie diese Entitätsansicht speichern oder aktualisieren. Aus Leistungsgründen werden die Attribute der Zielentität nicht bei jeder Attributänderung automatisch in die Entitätsansicht übernommen. Sie können eine automatische Weiterleitung aktivieren, indem Sie den Regelknoten \"In Ansicht kopieren\" in Ihrer Regelkette konfigurieren und die Nachrichten \"Post attributes\" und \"Attributes Updated\" mit diesem neuen Regelknoten verknüpfen.",
"timeseries-data": "Zeitreihendaten", "timeseries-data": "Zeitreihendaten",
"timeseries-data-hint": "Konfigurieren Sie die Zeitreihendatenschlüssel der Zielentität, die für die Entitätsansicht zugänglich sein werden. Diese Zeitreihendaten sind schreibgeschützt.", "timeseries-data-hint": "Konfigurieren Sie die Zeitreihenschlüssel der Zielentität, die in der Entitätsansicht verfügbar sein sollen. Diese Zeitreihendaten sind schreibgeschützt.",
"search": "Entitätsansichten suchen", "search": "Entitätssichten suchen",
"selected-entity-views": "{ count, plural, =1 {1 Entitätsansicht} other {# Entitätsansichten} } ausgewählt", "selected-entity-views": "{ count, plural, =1 {1 Entitätssicht} other {# Entitätssichten} } ausgewählt",
"assign-entity-view-to-edge": "Entitätsansicht(en) Edge zuweisen", "assign-entity-view-to-edge": "Entitätssicht(en) einer Edge zuweisen",
"assign-entity-view-to-edge-text": "Bitte wählen Sie die Entitätsansichten aus, die dem Edge zugewiesen werden sollen", "assign-entity-view-to-edge-text": "Bitte wählen Sie die Entitätssichten aus, die der Edge zugewiesen werden sollen",
"unassign-entity-view-from-edge-title": "Sind Sie sicher, dass Sie die Entitätsansicht '{{entityViewName}}' von Edge entfernen möchten?", "unassign-entity-view-from-edge-title": "Möchten Sie die Entitätsansicht '{{entityViewName}}' wirklich von der Edge entfernen?",
"unassign-entity-view-from-edge-text": "Nach der Bestätigung wird die Entitätsansicht von Edge entfernt und ist nicht mehr zugänglich.", "unassign-entity-view-from-edge-text": "Nach der Bestätigung wird die Entitätsansicht entfernt und ist auf der Edge nicht mehr verfügbar.",
"unassign-entity-views-from-edge-action-title": "{ count, plural, =1 {1 Entitätsansicht} other {# Entitätsansichten} } von Edge entfernen", "unassign-entity-views-from-edge-action-title": "{ count, plural, =1 {1 Entitätsansicht von der Edge entfernen} other {# Entitätssichten von der Edge entfernen} }",
"unassign-entity-view-from-edge": "Entitätsansicht von Edge entfernen", "unassign-entity-view-from-edge": "Entitätsansicht entfernen",
"unassign-entity-views-from-edge-title": "Sind Sie sicher, dass Sie { count, plural, =1 {1 Entitätsansicht} other {# Entitätsansichten} } von Edge entfernen möchten?", "unassign-entity-views-from-edge-title": "Möchten Sie { count, plural, =1 {1 Entitätssicht} other {# Entitätssichten} } wirklich entfernen?",
"unassign-entity-views-from-edge-text": "Nach der Bestätigung werden alle ausgewählten Entitätsansichten von Edge entfernt und sind nicht mehr zugänglich." "unassign-entity-views-from-edge-text": "Nach der Bestätigung werden alle ausgewählten Entitätssichten entfernt und sind auf der Edge nicht mehr verfügbar."
}, },
"event": { "event": {
"event-type": "Ereignistyp", "event-type": "Ereignistyp",
@ -3041,15 +3060,15 @@
"edit": "Filter bearbeiten", "edit": "Filter bearbeiten",
"name": "Filtername", "name": "Filtername",
"name-required": "Filtername ist erforderlich.", "name-required": "Filtername ist erforderlich.",
"duplicate-filter": "Ein Filter mit demselben Namen existiert bereits.", "duplicate-filter": "Ein Filter mit demselben Namen ist bereits vorhanden.",
"filters": "Filter", "filters": "Filter",
"unable-delete-filter-title": "Filter kann nicht gelöscht werden", "unable-delete-filter-title": "Filter kann nicht gelöscht werden",
"unable-delete-filter-text": "Der Filter '{{filter}}' kann nicht gelöscht werden, da er von folgenden Widget(s) verwendet wird:<br/>{{widgetsList}}", "unable-delete-filter-text": "Filter '{{filter}}' kann nicht gelöscht werden, da er von folgendem/n Widget(s) verwendet wird:<br/>{{widgetsList}}",
"duplicate-filter-error": "Doppelter Filter gefunden '{{filter}}'.<br>Filter müssen innerhalb des Dashboards eindeutig sein.", "duplicate-filter-error": "Doppelter Filter gefunden: '{{filter}}'.<br>Filter müssen innerhalb des Dashboards eindeutig sein.",
"missing-key-filters-error": "Schlüsselfilter fehlt für Filter '{{filter}}'.", "missing-key-filters-error": "Schlüsselfilter fehlt für Filter '{{filter}}'.",
"filter": "Filter", "filter": "Filter",
"editable": "Bearbeitbar", "editable": "Bearbeitbar",
"editable-hint": "Benutzern erlauben, den Filterwert in Dashboards zu ändern.", "editable-hint": "Ermöglicht dem Benutzer, den Filterwert in Dashboards zu ändern.",
"no-filters-found": "Keine Filter gefunden.", "no-filters-found": "Keine Filter gefunden.",
"no-filter-text": "Kein Filter angegeben", "no-filter-text": "Kein Filter angegeben",
"add-filter-prompt": "Bitte Filter hinzufügen", "add-filter-prompt": "Bitte Filter hinzufügen",
@ -4303,7 +4322,7 @@
}, },
"profile": { "profile": {
"profile": "Profil", "profile": "Profil",
"last-login-time": "Letzte Anmeldung", "last-login-time": "Letzter Login",
"change-password": "Passwort ändern", "change-password": "Passwort ändern",
"current-password": "Aktuelles Passwort", "current-password": "Aktuelles Passwort",
"copy-jwt-token": "JWT-Token kopieren", "copy-jwt-token": "JWT-Token kopieren",
@ -4478,7 +4497,8 @@
"jks": "JKS", "jks": "JKS",
"js-module": "JS-Modul", "js-module": "JS-Modul",
"lwm2m-model": "LWM2M-Modell", "lwm2m-model": "LWM2M-Modell",
"pkcs-12": "PKCS #12" "pkcs-12": "PKCS #12",
"general": "Allgemein"
}, },
"resource-sub-type": "Subtyp", "resource-sub-type": "Subtyp",
"sub-type": { "sub-type": {
@ -4486,7 +4506,12 @@
"scada-symbol": "SCADA-Symbol", "scada-symbol": "SCADA-Symbol",
"extension": "Erweiterung", "extension": "Erweiterung",
"module": "Modul" "module": "Modul"
} },
"resource-is-in-use": "Ressource wird von anderen Entitäten verwendet",
"resources-are-in-use": "Ressourcen werden von anderen Entitäten verwendet",
"resource-is-in-use-text": "Die Ressource <b>'{{title}}'</b> wurde nicht gelöscht, da sie von folgenden Entitäten verwendet wird:",
"resources-are-in-use-text": "Nicht alle Ressourcen wurden gelöscht, da sie von anderen Entitäten verwendet werden.</br>Sie können die referenzierten Entitäten anzeigen, indem Sie auf die Schaltfläche <b>Referenzen</b> in der entsprechenden Ressourcenzeile klicken.</br>Wenn Sie diese Ressourcen dennoch löschen möchten, wählen Sie sie in der Tabelle unten aus und klicken Sie auf die Schaltfläche <b>Ausgewählte löschen</b>.",
"delete-resource-in-use-text": "Wenn Sie die Ressource dennoch löschen möchten, klicken Sie auf die Schaltfläche <b>Trotzdem löschen</b>."
}, },
"javascript": { "javascript": {
"add": "JavaScript-Ressource hinzufügen", "add": "JavaScript-Ressource hinzufügen",
@ -4742,24 +4767,24 @@
"send-attributes-deleted-notification": "Benachrichtigung bei gelöschten Attributen senden", "send-attributes-deleted-notification": "Benachrichtigung bei gelöschten Attributen senden",
"send-attributes-deleted-notification-hint": "Sendet Benachrichtigung über gelöschte Attribute als separate Nachricht an die Regelmaschinen-Warteschlange.", "send-attributes-deleted-notification-hint": "Sendet Benachrichtigung über gelöschte Attribute als separate Nachricht an die Regelmaschinen-Warteschlange.",
"update-attributes-only-on-value-change": "Attribute nur bei Wertänderung speichern", "update-attributes-only-on-value-change": "Attribute nur bei Wertänderung speichern",
"update-attributes-only-on-value-change-hint": "Aktualisiert Attribute bei jeder eingehenden Nachricht, unabhängig von Wertänderung. Erhöht API-Nutzung und verringert Leistung.", "update-attributes-only-on-value-change-hint": "Aktualisiert die Attribute bei jeder eingehenden Nachricht, unabhängig davon, ob sich deren Wert geändert hat. Erhöht die API-Nutzung und verringert die Leistung.",
"update-attributes-only-on-value-change-hint-enabled": "Aktualisiert Attribute nur bei Wertänderung. Keine Aktualisierung von Zeitstempel oder Änderungsbenachrichtigung bei gleichem Wert.", "update-attributes-only-on-value-change-hint-enabled": "Aktualisiert die Attribute nur, wenn sich deren Wert geändert hat. Wenn der Wert unverändert bleibt, werden weder der Attribut-Zeitstempel noch eine Änderungsbenachrichtigung gesendet.",
"fetch-credentials-to-metadata": "Zugangsdaten in Metadaten übernehmen", "fetch-credentials-to-metadata": "Zugangsdaten in Metadaten übernehmen",
"notify-device-on-update-hint": "Wenn aktiviert, erzwingt Benachrichtigung an das Gerät bei Attribut-Update. Bei Deaktivierung erfolgt Steuerung über Metadatenparameter 'notifyDevice'.", "notify-device-on-update-hint": "Wenn aktiviert, wird das Gerät über die Aktualisierung gemeinsamer Attribute zwangsweise benachrichtigt. Wenn deaktiviert, steuert das Metadatenfeld 'notifyDevice' im eingehenden Nachrichtenkontext das Benachrichtigungsverhalten. Um die Benachrichtigung zu deaktivieren, muss der Parameter 'notifyDevice' auf 'false' gesetzt sein. In allen anderen Fällen wird eine Benachrichtigung ausgelöst.",
"notify-device-on-delete-hint": "Wenn aktiviert, erzwingt Benachrichtigung an das Gerät bei Attribut-Entfernung. Bei Deaktivierung erfolgt Steuerung über Metadatenparameter 'notifyDevice'.", "notify-device-on-delete-hint": "Wenn aktiviert, wird das Gerät über das Entfernen gemeinsamer Attribute zwangsweise benachrichtigt. Wenn deaktiviert, steuert das Metadatenfeld 'notifyDevice' im eingehenden Nachrichtenkontext das Verhalten. Um die Benachrichtigung zu aktivieren, muss der Parameter 'notifyDevice' auf 'true' gesetzt sein. In allen anderen Fällen wird keine Benachrichtigung gesendet.",
"latest-timeseries": "Neueste Zeitreihenschlüssel", "latest-timeseries": "Neueste Zeitreihendatenschlüssel",
"timeseries-keys": "Zeitreihenschlüssel", "timeseries-keys": "Zeitreihenschlüssel",
"timeseries-keys-required": "Mindestens ein Zeitreihenschlüssel muss ausgewählt werden.", "timeseries-keys-required": "Mindestens ein Zeitreihenschlüssel muss ausgewählt sein.",
"add-timeseries-key": "Zeitreihenschlüssel hinzufügen", "add-timeseries-key": "Zeitreihenschlüssel hinzufügen",
"add-message-field": "Nachrichtenfeld hinzufügen", "add-message-field": "Nachrichtenfeld hinzufügen",
"relation-search-parameters": "Beziehungs-Suchparameter", "relation-search-parameters": "Suchparameter für Beziehungen",
"relation-parameters": "Beziehungsparameter", "relation-parameters": "Beziehungsparameter",
"add-metadata-field": "Metadatenfeld hinzufügen", "add-metadata-field": "Metadatenfeld hinzufügen",
"data-keys": "Feldnamen der Nachricht", "data-keys": "Feldnamen der Nachricht",
"copy-from": "Kopieren von", "copy-from": "Kopieren von",
"data-to-metadata": "Daten zu Metadaten", "data-to-metadata": "Daten zu Metadaten",
"metadata-to-data": "Metadaten zu Daten", "metadata-to-data": "Metadaten zu Daten",
"use-regular-expression-hint": "Verwenden Sie reguläre Ausdrücke, um Schlüssel anhand eines Musters zu kopieren.\n\nTipps & Tricks:\nDrücken Sie 'Enter', um die Eingabe des Feldnamens abzuschließen.\nDrücken Sie 'Rücktaste', um den Feldnamen zu löschen. Mehrere Feldnamen werden unterstützt.", "use-regular-expression-hint": "Verwenden Sie reguläre Ausdrücke, um Schlüssel anhand von Mustern zu kopieren.\n\nTipps & Tricks:\nDrücken Sie 'Enter', um die Eingabe eines Feldnamens abzuschließen.\nDrücken Sie 'Rücktaste', um einen Feldnamen zu löschen. Mehrere Feldnamen werden unterstützt.",
"interval": "Intervall", "interval": "Intervall",
"interval-required": "Intervall ist erforderlich", "interval-required": "Intervall ist erforderlich",
"interval-hint": "Deduplizierungsintervall in Sekunden.", "interval-hint": "Deduplizierungsintervall in Sekunden.",
@ -4826,13 +4851,13 @@
"fields-mapping-hint": "Wenn das Nachrichtenfeld auf $entityId gesetzt ist, wird die ID des Absenders in die angegebene Spalte gespeichert.", "fields-mapping-hint": "Wenn das Nachrichtenfeld auf $entityId gesetzt ist, wird die ID des Absenders in die angegebene Spalte gespeichert.",
"relations-query-config-direction-suffix": "Absender", "relations-query-config-direction-suffix": "Absender",
"profile-name": "Profilname", "profile-name": "Profilname",
"fetch-circle-parameter-info-from-metadata-hint": "Das Metadatenfeld '{{perimeterKeyName}}' sollte folgendes Format haben: {\"latitude\":48.196, \"longitude\":24.6532, \"radius\":100.0, \"radiusUnit\":\"METER\"}", "fetch-circle-parameter-info-from-metadata-hint": "Das Metadatenfeld '{{perimeterKeyName}}' muss im folgenden Format definiert sein: {\"latitude\":48.196, \"longitude\":24.6532, \"radius\":100.0, \"radiusUnit\":\"METER\"}",
"fetch-poligon-parameter-info-from-metadata-hint": "Das Metadatenfeld '{{perimeterKeyName}}' sollte folgendes Format haben: [[48.19736,24.65235],[48.19800,24.65060],...,[48.19849,24.65420]]", "fetch-poligon-parameter-info-from-metadata-hint": "Das Metadatenfeld '{{perimeterKeyName}}' muss im folgenden Format definiert sein: [[48.19736,24.65235],[48.19800,24.65060],...,[48.19849,24.65420]]",
"short-templatization-tooltip": "Verwenden Sie $[messageKey] für Nachrichtenwerte und ${metadataKey} für Metadatenwerte.", "short-templatization-tooltip": "Verwenden Sie $[messageKey], um einen Wert aus der Nachricht zu extrahieren, und ${metadataKey}, um einen Wert aus den Metadaten zu extrahieren.",
"fields-mapping-required": "Mindestens eine Feldzuordnung muss angegeben werden.", "fields-mapping-required": "Mindestens eine Feldzuordnung muss angegeben werden.",
"at-least-one-field-required": "Mindestens ein Eingabefeld muss einen Wert enthalten.", "at-least-one-field-required": "Mindestens ein Eingabefeld muss einen Wert enthalten.",
"originator-fields-sv-map-hint": "Zielschlüsselfelder unterstützen Templatisierung. Verwenden Sie $[messageKey] oder ${metadataKey}.", "originator-fields-sv-map-hint": "Zielschlüsselfelder unterstützen Templatisierung. Verwenden Sie $[messageKey], um einen Wert aus der Nachricht zu extrahieren, und ${metadataKey}, um einen Wert aus den Metadaten zu extrahieren.",
"sv-map-hint": "Nur Zielschlüsselfelder unterstützen Templatisierung. Verwenden Sie $[messageKey] oder ${metadataKey}.", "sv-map-hint": "Nur Zielschlüsselfelder unterstützen Templatisierung. Verwenden Sie $[messageKey], um einen Wert aus der Nachricht zu extrahieren, und ${metadataKey}, um einen Wert aus den Metadaten zu extrahieren.",
"source-field": "Quellfeld", "source-field": "Quellfeld",
"source-field-required": "Quellfeld ist erforderlich.", "source-field-required": "Quellfeld ist erforderlich.",
"originator-source": "Absenderquelle", "originator-source": "Absenderquelle",
@ -5436,11 +5461,11 @@
"prompt-settings": "Prompt-Einstellungen", "prompt-settings": "Prompt-Einstellungen",
"prompt-settings-hint": "Der optionale System-Prompt definiert die allgemeine Rolle und Einschränkungen der KI, während der Benutzer-Prompt die spezifische Aufgabe beschreibt. Beide Felder unterstützen auch die Verwendung von Templates.", "prompt-settings-hint": "Der optionale System-Prompt definiert die allgemeine Rolle und Einschränkungen der KI, während der Benutzer-Prompt die spezifische Aufgabe beschreibt. Beide Felder unterstützen auch die Verwendung von Templates.",
"system-prompt": "System-Prompt", "system-prompt": "System-Prompt",
"system-prompt-max-length": "Der System-Prompt darf maximal 500.000 Zeichen lang sein.", "system-prompt-max-length": "Der System-Prompt darf maximal 10.000 Zeichen lang sein.",
"system-prompt-blank": "Der System-Prompt darf nicht leer sein.", "system-prompt-blank": "Der System-Prompt darf nicht leer sein.",
"user-prompt": "Benutzer-Prompt", "user-prompt": "Benutzer-Prompt",
"user-prompt-required": "Benutzer-Prompt ist erforderlich.", "user-prompt-required": "Benutzer-Prompt ist erforderlich.",
"user-prompt-max-length": "Der Benutzer-Prompt darf maximal 500.000 Zeichen lang sein.", "user-prompt-max-length": "Der Benutzer-Prompt darf maximal 10.000 Zeichen lang sein.",
"user-prompt-blank": "Der Benutzer-Prompt darf nicht leer sein.", "user-prompt-blank": "Der Benutzer-Prompt darf nicht leer sein.",
"response-format": "Antwortformat", "response-format": "Antwortformat",
"response-text": "Text", "response-text": "Text",
@ -5457,7 +5482,8 @@
"timeout-required": "Zeitüberschreitung ist erforderlich", "timeout-required": "Zeitüberschreitung ist erforderlich",
"timeout-validation": "Muss zwischen 1 Sekunde und 10 Minuten liegen.", "timeout-validation": "Muss zwischen 1 Sekunde und 10 Minuten liegen.",
"force-acknowledgement": "Erzwinge Bestätigung", "force-acknowledgement": "Erzwinge Bestätigung",
"force-acknowledgement-hint": "Wenn aktiviert, wird die eingehende Nachricht sofort bestätigt. Die Antwort des Modells wird dann als separate, neue Nachricht eingereiht." "force-acknowledgement-hint": "Wenn aktiviert, wird die eingehende Nachricht sofort bestätigt. Die Antwort des Modells wird dann als separate, neue Nachricht eingereiht.",
"ai-resources": "KI-Ressourcen"
} }
}, },
"timezone": { "timezone": {
@ -5987,9 +6013,10 @@
"label": "Beschriftung", "label": "Beschriftung",
"value": "Wert", "value": "Wert",
"date": "Datum", "date": "Datum",
"show-date-time-interval": "Datum/Zeit-Intervall anzeigen", "show-date-time-interval": "Datums-/Zeitintervall anzeigen",
"show-date-time-interval-hint": "Datum/Zeit-Intervall gemäß Datenaggregation anzeigen.", "show-date-time-interval-hint": "Zeigt das Datums-/Zeitintervall entsprechend der Datenaggregation an.",
"hide-zero-tooltip-values": "Nullwerte ausblenden", "hide-zero-tooltip-values": "Nullwerte ausblenden",
"show-stack-total": "Gesamtwert im Stapelmodus anzeigen",
"background-color": "Hintergrundfarbe", "background-color": "Hintergrundfarbe",
"background-blur": "Hintergrundunschärfe" "background-blur": "Hintergrundunschärfe"
}, },
@ -6556,10 +6583,10 @@
"no-users-text": "Keine Benutzer gefunden", "no-users-text": "Keine Benutzer gefunden",
"user-details": "Benutzerdetails", "user-details": "Benutzerdetails",
"delete-user-title": "Möchten Sie den Benutzer '{{userEmail}}' wirklich löschen?", "delete-user-title": "Möchten Sie den Benutzer '{{userEmail}}' wirklich löschen?",
"delete-user-text": "Vorsicht! Nach der Bestätigung werden der Benutzer und alle zugehörigen Daten unwiederbringlich gelöscht.", "delete-user-text": "Achtung: Nach der Bestätigung werden der Benutzer und alle zugehörigen Daten unwiederbringlich gelöscht.",
"delete-users-title": "Möchten Sie wirklich { count, plural, =1 {1 Benutzer} other {# Benutzer} } löschen?", "delete-users-title": "Möchten Sie { count, plural, =1 {1 Benutzer} other {# Benutzer} } wirklich löschen?",
"delete-users-action-title": "{ count, plural, =1 {1 Benutzer löschen} other {# Benutzer löschen} }", "delete-users-action-title": "{ count, plural, =1 {1 Benutzer löschen} other {# Benutzer löschen} }",
"delete-users-text": "Vorsicht! Nach der Bestätigung werden alle ausgewählten Benutzer und zugehörige Daten gelöscht.", "delete-users-text": "Achtung: Nach der Bestätigung werden alle ausgewählten Benutzer und ihre zugehörigen Daten unwiederbringlich entfernt.",
"activation-email-sent-message": "Aktivierungs-E-Mail wurde erfolgreich gesendet!", "activation-email-sent-message": "Aktivierungs-E-Mail wurde erfolgreich gesendet!",
"resend-activation": "Aktivierung erneut senden", "resend-activation": "Aktivierung erneut senden",
"email": "E-Mail", "email": "E-Mail",
@ -6669,24 +6696,24 @@
"remove-all": "Alle entfernen", "remove-all": "Alle entfernen",
"version-create-result": "{ added, plural, =0 {Keine Entitäten} =1 {1 Entität} other {# Entitäten} } hinzugefügt.<br/>{ modified, plural, =0 {Keine Entitäten} =1 {1 Entität} other {# Entitäten} } geändert.<br/>{ removed, plural, =0 {Keine Entitäten} =1 {1 Entität} other {# Entitäten} } entfernt.", "version-create-result": "{ added, plural, =0 {Keine Entitäten} =1 {1 Entität} other {# Entitäten} } hinzugefügt.<br/>{ modified, plural, =0 {Keine Entitäten} =1 {1 Entität} other {# Entitäten} } geändert.<br/>{ removed, plural, =0 {Keine Entitäten} =1 {1 Entität} other {# Entitäten} } entfernt.",
"remove-other-entities": "Andere Entitäten entfernen", "remove-other-entities": "Andere Entitäten entfernen",
"find-existing-entity-by-name": "Vorhandene Entität nach Namen finden", "find-existing-entity-by-name": "Bestehende Entität nach Name suchen",
"restore-entities-from-version": "Entitäten aus Version '{{versionName}}' wiederherstellen", "restore-entities-from-version": "Entitäten aus Version '{{versionName}}' wiederherstellen",
"restoring-entities-from-version": "Entitäten werden wiederhergestellt... Bitte warten", "restoring-entities-from-version": "Entitäten werden wiederhergestellt... Bitte warten",
"no-entities-restored": "Keine Entitäten wiederhergestellt", "no-entities-restored": "Keine Entitäten wurden wiederhergestellt",
"created": "{{created}} erstellt", "created": "{{created}} erstellt",
"updated": "{{updated}} aktualisiert", "updated": "{{updated}} aktualisiert",
"deleted": "{{deleted}} gelöscht", "deleted": "{{deleted}} gelöscht",
"remove-other-entities-confirm-text": "Achtung! Dies wird <b>alle</b> aktuellen Entitäten dauerhaft <b>löschen</b><br/>die nicht in der wiederherzustellenden Version vorhanden sind.<br/><br/>Bitte geben Sie <b>\"andere Entitäten entfernen\"</b> ein, um zu bestätigen.", "remove-other-entities-confirm-text": "Achtung! Dies wird <b>alle</b> aktuellen Entitäten <b>dauerhaft löschen</b>,<br/>die nicht in der wiederherzustellenden Version vorhanden sind.<br/><br/>Bitte geben Sie <b>\"remove other entities\"</b> ein, um zu bestätigen.",
"auto-commit-to-branch": "automatisch in <b>{{ branch }}</b>-Zweig übernehmen", "auto-commit-to-branch": "Auto-Commit in den Branch <b>{{branch}}</b>",
"default-create-entity-version-name": "{{entityName}} Aktualisierung", "default-create-entity-version-name": "{{entityName}}-Aktualisierung",
"sync-strategy-merge-hint": "Erstellt oder aktualisiert ausgewählte Entitäten im Repository. Alle anderen Repository-Entitäten werden <b>nicht verändert</b>.", "sync-strategy-merge-hint": "Erstellt oder aktualisiert die ausgewählten Entitäten im Repository. Alle anderen Repository-Entitäten werden <b>nicht verändert</b>.",
"sync-strategy-overwrite-hint": "Erstellt oder aktualisiert ausgewählte Entitäten im Repository. Alle anderen Repository-Entitäten werden <b>gelöscht</b>.", "sync-strategy-overwrite-hint": "Erstellt oder aktualisiert die ausgewählten Entitäten im Repository. Alle anderen Repository-Entitäten werden <b>gelöscht</b>.",
"device-credentials-conflict": "Gerät mit externer ID <b>{{entityId}}</b> konnte nicht geladen werden,<br/>da dieselben Zugangsdaten bereits für ein anderes Gerät vorhanden sind.<br/>Bitte erwägen Sie, die Einstellung <b>Zugangsdaten laden</b> im Wiederherstellungsformular zu deaktivieren.", "device-credentials-conflict": "Laden des Geräts mit externer ID <b>{{entityId}}</b> fehlgeschlagen,<br/>da dieselben Zugangsdaten bereits für ein anderes Gerät in der Datenbank vorhanden sind.<br/>Deaktivieren Sie ggf. die Option <b>Zugangsdaten laden</b> im Wiederherstellungsformular.",
"missing-referenced-entity": "<b>{{sourceEntityTypeName}}</b> mit externer ID <b>{{sourceEntityId}}</b> konnte nicht geladen werden,<br/>da sie auf eine fehlende <b>{{targetEntityTypeName}}</b> mit ID <b>{{targetEntityId}}</b> verweist.", "missing-referenced-entity": "Laden von <b>{{sourceEntityTypeName}}</b> mit externer ID <b>{{sourceEntityId}}</b> fehlgeschlagen,<br/>da die referenzierte <b>{{targetEntityTypeName}}</b> mit ID <b>{{targetEntityId}}</b> fehlt.",
"runtime-failed": "<b>Fehlgeschlagen:</b> {{message}}", "runtime-failed": "<b>Fehlgeschlagen:</b> {{message}}",
"auto-commit-settings-read-only-hint": "Auto-Commit funktioniert nicht, wenn die Option 'Nur-Lesen' in den Repository-Einstellungen aktiviert ist.", "auto-commit-settings-read-only-hint": "Die Auto-Commit-Funktion funktioniert nicht, wenn die Option 'Nur Lesen' in den Repository-Einstellungen aktiviert ist.",
"rollback-on-error": "Bei Fehler zurücksetzen", "rollback-on-error": "Rollback bei Fehlern",
"rollback-on-error-hint": "Wenn Sie eine große Menge an Entitäten wiederherstellen, deaktivieren Sie diese Option zur Leistungssteigerung.\nBeachten Sie, dass bei einem Fehler bereits gespeicherte Entitäten (mit Beziehungen, Attributen etc.) erhalten bleiben." "rollback-on-error-hint": "Wenn Sie eine große Anzahl von Entitäten wiederherstellen, sollten Sie diese Option zur Leistungsverbesserung deaktivieren.\nHinweis: Im Fehlerfall bleiben bereits gespeicherte Entitäten (mit Beziehungen, Attributen usw.) erhalten."
}, },
"widget": { "widget": {
"widget-library": "Widget-Bibliothek", "widget-library": "Widget-Bibliothek",
@ -6703,8 +6730,8 @@
"management": "Widget-Verwaltung", "management": "Widget-Verwaltung",
"editor": "Widget-Editor", "editor": "Widget-Editor",
"confirm-to-exit-editor-html": "Sie haben nicht gespeicherte Widget-Einstellungen.<br>Möchten Sie diese Seite wirklich verlassen?", "confirm-to-exit-editor-html": "Sie haben nicht gespeicherte Widget-Einstellungen.<br>Möchten Sie diese Seite wirklich verlassen?",
"widget-type-not-found": "Fehler beim Laden der Widget-Konfiguration.<br>Vermutlich wurde der zugehörige Widget-Typ entfernt.", "widget-type-not-found": "Fehler beim Laden der Widget-Konfiguration.<br>Der zugehörige\n Widget-Typ wurde möglicherweise entfernt.",
"widget-type-load-error": "Widget konnte aufgrund folgender Fehler nicht geladen werden:", "widget-type-load-error": "Widget konnte aufgrund der folgenden Fehler nicht geladen werden:",
"remove": "Widget entfernen", "remove": "Widget entfernen",
"delete": "Widget löschen", "delete": "Widget löschen",
"edit": "Widget bearbeiten", "edit": "Widget bearbeiten",
@ -6769,11 +6796,11 @@
"javascript": "JavaScript", "javascript": "JavaScript",
"js": "JS", "js": "JS",
"delete-widget-title": "Möchten Sie das Widget '{{widgetName}}' wirklich löschen?", "delete-widget-title": "Möchten Sie das Widget '{{widgetName}}' wirklich löschen?",
"delete-widget-text": "Nach der Bestätigung wird das Widget und alle zugehörigen Daten unwiederbringlich gelöscht.", "delete-widget-text": "Nach der Bestätigung wird das Widget und alle zugehörigen Daten unwiderruflich gelöscht.",
"delete-widgets-title": "Möchten Sie wirklich { count, plural, =1 {1 Widget} other {# Widgets} } löschen?", "delete-widgets-title": "Möchten Sie { count, plural, =1 {1 Widget} other {# Widgets} } wirklich löschen?",
"delete-widgets-text": "Nach der Bestätigung werden alle ausgewählten Widgets und alle zugehörigen Daten gelöscht.", "delete-widgets-text": "Achtung: Nach der Bestätigung werden alle ausgewählten Widgets und deren zugehörige Daten unwiderruflich entfernt.",
"delete-widget": "Widget löschen", "delete-widget": "Widget löschen",
"widget-template-load-failed-error": "Widget-Vorlage konnte nicht geladen werden!", "widget-template-load-failed-error": "Laden der Widget-Vorlage fehlgeschlagen!",
"details": "Details", "details": "Details",
"widget-details": "Widget-Details", "widget-details": "Widget-Details",
"add": "Widget hinzufügen", "add": "Widget hinzufügen",
@ -8572,15 +8599,15 @@
"fit-map-bounds": "Kartenausschnitt anpassen, um alle Marker abzudecken", "fit-map-bounds": "Kartenausschnitt anpassen, um alle Marker abzudecken",
"use-default-map-center-position": "Standard-Zentrum der Karte verwenden", "use-default-map-center-position": "Standard-Zentrum der Karte verwenden",
"entities-limit": "Grenze für zu ladende Entitäten", "entities-limit": "Grenze für zu ladende Entitäten",
"markers-settings": "Marker-Einstellungen", "markers-settings": "Markereinstellungen",
"marker-offset-x": "X-Versatz des Markers multipliziert mit Breite", "marker-offset-x": "Marker-X-Versatz relativ zur Position multipliziert mit der Markerbreite",
"marker-offset-y": "Y-Versatz des Markers multipliziert mit Höhe", "marker-offset-y": "Marker-Y-Versatz relativ zur Position multipliziert mit der Markerhöhe",
"position-function": "Positionsumrechnungsfunktion, sollte x,y-Koordinaten als Double (0-1) zurückgeben", "position-function": "Positionskonvertierungsfunktion, sollte x,y-Koordinaten im Bereich von 0 bis 1 (double) zurückgeben",
"draggable-marker": "Marker verschiebbar", "draggable-marker": "Verschiebbarer Marker",
"label": "Beschriftung", "label": "Beschriftung",
"show-label": "Beschriftung anzeigen", "show-label": "Beschriftung anzeigen",
"use-label-function": "Beschriftungsfunktion verwenden", "use-label-function": "Beschriftungsfunktion verwenden",
"label-pattern": "Beschriftung (z.B.: '${entityName}', '${entityName}: (Text ${keyName} Einheiten.)')", "label-pattern": "Beschriftung (Beispielmuster: '${entityName}', '${entityName}: (Text ${keyName} Einheiten.)')",
"label-function": "Beschriftungsfunktion", "label-function": "Beschriftungsfunktion",
"tooltip": "Tooltip", "tooltip": "Tooltip",
"show-tooltip": "Tooltip anzeigen", "show-tooltip": "Tooltip anzeigen",
@ -9522,4 +9549,4 @@
"language": { "language": {
"language": "Sprache" "language": "Sprache"
} }
} }

681
ui-ngx/src/assets/locale/locale.constant-el_GR.json

File diff suppressed because it is too large

1449
ui-ngx/src/assets/locale/locale.constant-fr_FR.json

File diff suppressed because it is too large

1084
ui-ngx/src/assets/locale/locale.constant-it_IT.json

File diff suppressed because it is too large

1515
ui-ngx/src/assets/locale/locale.constant-nl_NL.json

File diff suppressed because it is too large
Loading…
Cancel
Save