Browse Source

Merge pull request #14588 from thingsboard/lts-4.2

Lts 4.2
pull/14592/head
Viacheslav Klimov 6 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 {
states.remove(cfId);
}
msg.getCallback().onSuccess();
}
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) {
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);
} 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());
} 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.msg.MsgType;
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.state.CalculatedFieldState;
@ -27,6 +28,7 @@ public class CalculatedFieldStateRestoreMsg implements ToCalculatedFieldSystemMs
private final CalculatedFieldEntityCtxId id;
private final CalculatedFieldState state;
private final TbCallback callback;
@Override
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.rule.RuleChain;
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.TbActorStopReason;
import org.thingsboard.server.common.msg.TbMsg;
@ -138,13 +137,22 @@ public class TenantActor extends RuleChainManagerActor {
@Override
protected boolean doProcess(TbActorMsg msg) {
if (cantFindTenant) {
log.info("[{}] Processing missing Tenant msg: {}", tenantId, msg);
if (msg.getMsgType().equals(MsgType.QUEUE_TO_RULE_ENGINE_MSG)) {
QueueToRuleEngineMsg queueMsg = (QueueToRuleEngineMsg) msg;
queueMsg.getMsg().getCallback().onSuccess();
} else if (msg.getMsgType().equals(MsgType.TRANSPORT_TO_DEVICE_ACTOR_MSG)) {
TransportToDeviceActorMsgWrapper transportMsg = (TransportToDeviceActorMsgWrapper) msg;
transportMsg.getCallback().onSuccess();
log.debug("[{}] Processing message for non-existing tenant: {}", tenantId, msg);
switch (msg.getMsgType()) {
case QUEUE_TO_RULE_ENGINE_MSG -> {
((QueueToRuleEngineMsg) msg).getMsg().getCallback().onSuccess();
}
case TRANSPORT_TO_DEVICE_ACTOR_MSG -> {
((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;
}
@ -390,6 +398,7 @@ public class TenantActor extends RuleChainManagerActor {
public TbActor createActor() {
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 void processRestoredState(CalculatedFieldStateProto stateMsg) {
protected void processRestoredState(CalculatedFieldStateProto stateMsg, TbCallback callback) {
var id = fromProto(stateMsg.getId());
var state = fromProto(stateMsg);
processRestoredState(id, state);
processRestoredState(id, state, callback);
}
protected void processRestoredState(CalculatedFieldEntityCtxId id, CalculatedFieldState state) {
actorSystemContext.tell(new CalculatedFieldStateRestoreMsg(id, state));
protected void processRestoredState(CalculatedFieldEntityCtxId id, CalculatedFieldState state, TbCallback callback) {
actorSystemContext.tell(new CalculatedFieldStateRestoreMsg(id, state, callback));
}
@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.ctx.CalculatedFieldEntityCtxId;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
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}")
private long pollInterval;
@Value("${queue.calculated_fields.pack_processing_timeout:60000}")
private long packProcessingTimeout;
private TbKafkaProducerTemplate<TbProtoQueueMsg<CalculatedFieldStateProto>> stateProducer;
@ -74,21 +78,39 @@ public class KafkaCalculatedFieldStateService extends AbstractCalculatedFieldSta
.topic(partitionService.getTopic(queueKey))
.pollInterval(pollInterval)
.msgPackProcessor((msgs, consumer, consumerKey, config) -> {
CountDownLatch completionLatch = new CountDownLatch(msgs.size());
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 {
if (msg.getValue() != null) {
processRestoredState(msg.getValue());
processRestoredState(msg.getValue(), callback);
} else {
processRestoredState(getStateId(msg.getHeaders()), null);
processRestoredState(getStateId(msg.getHeaders()), null, callback);
}
} catch (Throwable t) {
log.error("Failed to process state message: {}", msg, t);
callback.onFailure(t);
}
}
int processedMsgCount = counter.incrementAndGet();
if (processedMsgCount % 10000 == 0) {
log.info("Processed {} calculated field state msgs", processedMsgCount);
}
boolean success = completionLatch.await(packProcessingTimeout, TimeUnit.MILLISECONDS);
if (!success) {
log.error("Timeout to process CF state messages pack of size {}", msgs.size());
}
})
.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;
import com.google.protobuf.InvalidProtocolBufferException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
@ -63,11 +62,22 @@ public class RocksDBCalculatedFieldStateService extends AbstractCalculatedFieldS
public void restore(QueueKey queueKey, Set<TopicPartitionInfo> partitions) {
if (stateService.getPartitions().isEmpty()) {
cfRocksDb.forEach((key, value) -> {
CalculatedFieldStateProto stateMsg;
try {
processRestoredState(CalculatedFieldStateProto.parseFrom(value));
} catch (InvalidProtocolBufferException e) {
log.error("[{}] Failed to process restored state", key, e);
stateMsg = CalculatedFieldStateProto.parseFrom(value);
} catch (Exception 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);

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();
transportConfiguration.setBootstrap(Collections.emptyList());
transportConfiguration.setClientLwM2mSettings(new OtherConfiguration(false,1, 1, 1, PowerMode.DRX, null, null, null, null, null, V1_0.toString()));
transportConfiguration.setObserveAttr(new TelemetryMappingConfiguration(Collections.emptyMap(), Collections.emptySet(), Collections.emptySet(), Collections.emptySet(), Collections.emptyMap(), SINGLE));
transportConfiguration.setClientLwM2mSettings(new OtherConfiguration());
DeviceProfileData deviceProfileData = new DeviceProfileData();
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}"
# 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}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256
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.Optional;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static org.awaitility.Awaitility.await;
import static org.junit.Assert.assertEquals;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
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 {
await("await on Read")
.atMost(TIMEOUT*2, TimeUnit.SECONDS)
.until(() -> Boolean.valueOf(sendRPCById(resourceIdVer)));
String actualResult = sendRPCById(resourceIdVer);
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class);
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 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.TelemetryMappingConfiguration;
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;
@Data
@ -33,9 +38,18 @@ public class Lwm2mDeviceProfileTransportConfiguration implements DeviceProfileTr
private List<LwM2MBootstrapServerCredential> bootstrap;
private OtherConfiguration clientLwM2mSettings;
public Lwm2mDeviceProfileTransportConfiguration() {
updateDefault();
}
@Override
public DeviceTransportType getType() {
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;
@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 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.adminClient = LazyInitializer.<AdminClient>builder()
.setInitializer(() -> AdminClient.create(settings.toAdminProps()))
@ -91,7 +88,7 @@ public class KafkaAdmin {
NewTopic newTopic = new NewTopic(topic, partitions, settings.getReplicationFactor()).configs(properties);
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);
} catch (ExecutionException ee) {
log.trace("Failed to create topic {} with properties {}", topic, properties, ee);
@ -110,7 +107,7 @@ public class KafkaAdmin {
public void deleteTopic(String topic) {
log.debug("Deleting topic {}", topic);
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) {
log.error("Failed to delete kafka topic [{}].", topic, e);
}
@ -122,7 +119,7 @@ public class KafkaAdmin {
public Set<String> listTopics() {
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);
return topics;
} catch (Exception e) {
@ -150,7 +147,7 @@ public class KafkaAdmin {
.collect(Collectors.toMap(tp -> tp, tp -> OffsetSpec.latest()));
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()
.mapToLong(entry -> {
@ -169,7 +166,7 @@ public class KafkaAdmin {
@SneakyThrows
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 {
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);
break;
}
@ -229,7 +226,7 @@ public class KafkaAdmin {
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()
.flatMap(entry -> {
String topic = entry.getKey();
@ -239,9 +236,9 @@ public class KafkaAdmin {
.toList();
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()
.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) {
long beginningOffset = beginningOffsets.get(partition).offset();
@ -261,7 +258,7 @@ public class KafkaAdmin {
public void deleteConsumerGroup(String consumerGroupId) {
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) {
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}")
private int fetchMaxBytes;
@Getter
@Value("${queue.kafka.request.timeout.ms:30000}")
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
public Lwm2mDeviceProfileTransportConfiguration getProfile(Registration registration) {
UUID profileId = getClientByEndpoint(registration.getEndpoint()).getProfileId();
return doGetAndCache(profileId);
return profileId != null ? doGetAndCache(profileId) : null;
}
private Lwm2mDeviceProfileTransportConfiguration doGetAndCache(UUID profileId) {
Lwm2mDeviceProfileTransportConfiguration result = profiles.get(profileId);
if (result == null) {
log.debug("Fetching profile [{}]", profileId);
DeviceProfile deviceProfile = deviceProfileCache.get(new DeviceProfileId(profileId));
if (deviceProfile != null) {
result = profileUpdate(deviceProfile);
} else {
log.warn("Device profile was not found! Most probably device profile [{}] has been removed from the database.", profileId);
Lwm2mDeviceProfileTransportConfiguration result;
if (profileId != null) {
result = profiles.get(profileId);
if (result == null) {
log.debug("Fetching profile [{}]", profileId);
DeviceProfile deviceProfile = deviceProfileCache.get(new DeviceProfileId(profileId));
if (deviceProfile != null) {
result = profileUpdate(deviceProfile);
} 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;
}

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();
initFwStrategy(client, clientSettings);
initSwStrategy(client, clientSettings);
if (!attributesToFetch.isEmpty()) {
var future = attributesService.getSharedAttributes(client, attributesToFetch);
DonAsynchron.withCallback(future, attrs -> {
if (fwInfo.isSupported()) {
Optional<String> newFwTitle = getAttributeValue(attrs, FIRMWARE_TITLE);
Optional<String> newFwVersion = getAttributeValue(attrs, FIRMWARE_VERSION);
Optional<String> newFwTag = getAttributeValue(attrs, FIRMWARE_TAG);
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 (clientSettings != null) {
initFwStrategy(client, clientSettings);
initSwStrategy(client, clientSettings);
if (!attributesToFetch.isEmpty()) {
var future = attributesService.getSharedAttributes(client, attributesToFetch);
DonAsynchron.withCallback(future, attrs -> {
if (fwInfo.isSupported()) {
Optional<String> newFwTitle = getAttributeValue(attrs, FIRMWARE_TITLE);
Optional<String> newFwVersion = getAttributeValue(attrs, FIRMWARE_VERSION);
Optional<String> newFwTag = getAttributeValue(attrs, FIRMWARE_TAG);
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()) {
Optional<String> newSwTitle = getAttributeValue(attrs, SOFTWARE_TITLE);
Optional<String> newSwVersion = getAttributeValue(attrs, SOFTWARE_VERSION);
Optional<String> newSwTag = getAttributeValue(attrs, SOFTWARE_TAG);
Optional<String> newSwUrl = getAttributeValue(attrs, SOFTWARE_URL);
if (newSwTitle.isPresent() && newSwVersion.isPresent()) {
onTargetSoftwareUpdate(client, newSwTitle.get(), newSwVersion.get(), newSwUrl, newSwTag);
if (swInfo.isSupported()) {
Optional<String> newSwTitle = getAttributeValue(attrs, SOFTWARE_TITLE);
Optional<String> newSwVersion = getAttributeValue(attrs, SOFTWARE_VERSION);
Optional<String> newSwTag = getAttributeValue(attrs, SOFTWARE_TAG);
Optional<String> newSwUrl = getAttributeValue(attrs, SOFTWARE_URL);
if (newSwTitle.isPresent() && newSwVersion.isPresent()) {
onTargetSoftwareUpdate(client, newSwTitle.get(), newSwVersion.get(), newSwUrl, newSwTag);
}
}
}
}, throwable -> {
if (fwInfo.isSupported()) {
update(fwInfo);
}
}, executor);
}, throwable -> {
if (fwInfo.isSupported()) {
update(fwInfo);
}
}, 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);
for (byte[] endpoint : endpointsExpired) {
Registration r = deserializeReg(connection.get(toEndpointKey(endpoint)));
if (!r.isAlive(gracePeriod)) {
Deregistration dereg = removeRegistration(connection, r.getId(), true);
if (dereg != null)
expirationListener.registrationExpired(dereg.getRegistration(), dereg.getObservations());
byte[] data = connection.get(toEndpointKey(endpoint));
if (data != null && data.length > 0) {
Registration r = deserializeReg(data);
if (!r.isAlive(gracePeriod)) {
Deregistration dereg = removeRegistration(connection, r.getId(), true);
if (dereg != null)
expirationListener.registrationExpired(dereg.getRegistration(), dereg.getObservations());
}
}
}
} 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) {
Lwm2mDeviceProfileTransportConfiguration profile = clientContext.getProfile(lwM2MClient.getRegistration());
Set<String> supportedObjects = clientContext.getSupportedIdVerInClient(lwM2MClient);
if (supportedObjects != null && supportedObjects.size() > 0) {
this.sendReadRequests(lwM2MClient, profile, supportedObjects);
this.sendInitObserveRequests(lwM2MClient, profile, supportedObjects);
this.sendWriteAttributeRequests(lwM2MClient, profile, supportedObjects);
if (profile != null) {
Set<String> supportedObjects = clientContext.getSupportedIdVerInClient(lwM2MClient);
if (supportedObjects != null && !supportedObjects.isEmpty()) {
this.sendInitObserveRequests(lwM2MClient, profile, supportedObjects);
this.sendReadRequests(lwM2MClient, profile, supportedObjects);
this.sendWriteAttributeRequests(lwM2MClient, profile, supportedObjects);
// Removed. Used only for debug.
// 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 oldLwM2mSettings = oldProfile.getClientLwM2mSettings();
if (!newLwM2mSettings.getFwUpdateStrategy().equals(oldLwM2mSettings.getFwUpdateStrategy())
@ -1098,6 +1103,9 @@ public class DefaultLwM2mUplinkMsgHandler extends LwM2MExecutorAwareService impl
v -> attributesService.onAttributesUpdate(lwM2MClient, v, logFailedUpdateOfNonChangedValue),
t -> log.error("[{}] Failed to get attributes", lwM2MClient.getEndpoint(), t),
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) {
Lwm2mDeviceProfileTransportConfiguration profile = clientContext.getProfile(lwM2MClient.getRegistration());
return profile.getObserveAttr().getKeyName();
return profile != null ? profile.getObserveAttr().getKeyName() : Collections.emptyMap();
}
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}"
# 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}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions:
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.
#
FROM thingsboard/openjdk17:bookworm-slim
FROM ${docker.base.image}
COPY start-tb-edqs.sh ${pkg.name}.deb /tmp/

2
msa/monitoring/docker/Dockerfile

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

1
msa/pom.xml

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

2
msa/tb-node/docker/Dockerfile

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

2
msa/transport/http/docker/Dockerfile

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

2
msa/transport/lwm2m/docker/Dockerfile

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

2
msa/transport/mqtt/docker/Dockerfile

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

2
msa/transport/snmp/docker/Dockerfile

@ -14,7 +14,7 @@
# limitations under the License.
#
FROM thingsboard/openjdk17:bookworm-slim
FROM ${docker.base.image}
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.
#
FROM thingsboard/openjdk17:bookworm-slim
FROM ${docker.base.image}
ENV DEBIAN_FRONTEND=noninteractive
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}"
# 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}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256
core:

8
packaging/java/build.gradle

@ -92,7 +92,11 @@ buildRpm {
archiveVersion = projectVersion.replace('-', '')
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") {
include "${pkgName}.conf"
@ -132,6 +136,8 @@ buildDeb {
archiveFileName = "${pkgName}.deb"
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") {
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}"
# 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}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256
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}"
# 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}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256
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}"
# 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}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256
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}"
# 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}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256
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}"
# 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}"
# Topics cache TTL in milliseconds. 5 minutes by default
topics_cache_ttl_ms: "${TB_QUEUE_KAFKA_TOPICS_CACHE_TTL_MS:300000}"
partitions:
hash_function_name: "${TB_QUEUE_PARTITIONS_HASH_FUNCTION_NAME:murmur3_128}" # murmur3_32, murmur3_128 or sha256
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;
}
updateData(closeDetails = false) {
updateData(closeDetails = false, reloadEntity = true) {
if (this.table) {
this.table.updateData(closeDetails);
this.table.updateData(closeDetails, reloadEntity);
} else if (this.entityDetailsPage) {
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;
clearSelection(): void;
updateData(closeDetails?: boolean): void;
updateData(closeDetails?: boolean, reloadEntity?: boolean): void;
onRowClick($event: Event, entity): void;
toggleEntityDetails($event: Event, entity);
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() {
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() {
this.entitiesTableConfig.updateData(false);
this.entitiesTableConfig.updateData(false, false);
}
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() {
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",
"device-api": "Enheds-API",
"email": "E-mail",
"email-messages": "E-mailbeskeder",
"email-messages-daily-activity": "Daglig aktivitet for e-mailbeskeder",
"email-messages-monthly-activity": "Månedlig aktivitet for e-mailbeskeder",
"email-messages": "E-mail-beskeder",
"email-messages-daily-activity": "Daglig aktivitet for e-mail-beskeder",
"email-messages-monthly-activity": "Månedlig aktivitet for e-mail-beskeder",
"executions": "Udførelser",
"scripts": "Scripts",
"scripts-hourly-activity": "Timebaseret aktivitet for scripts",
"scripts-daily-activity": "Daglig aktivitet for scripts",
"scripts-monthly-activity": "Månedlig aktivitet for scripts",
"scripts-hourly-activity": "Scriptaktivitet pr. time",
"scripts-daily-activity": "Scriptaktivitet pr. dag",
"scripts-monthly-activity": "Scriptaktivitet pr. måned",
"javascript": "JavaScript",
"javascript-executions": "JavaScript-udførelser",
"tbel": "TBEL",
@ -1002,15 +1002,15 @@
"type-sms-sent": "SMS sendt"
},
"debug-settings": {
"label": "Fejlsøgningskonfiguration",
"label": "Fejlfindingskonfiguration",
"on-failure": "Kun fejl (24/7)",
"all-messages": "Alle beskeder ({{time}})",
"failures": "Fejl",
"entity": "enhed",
"hint": {
"main-limited": "Alle {{entity}} fejlsøgningsbeskeder vil blive hastighedsbegrænset, med maksimalt {{msg}} beskeder tilladt pr. {{time}}.",
"on-failure": "Gem alle fejlsøgningshændelser uden tidsbegrænsning.",
"all-messages": "Gem alle fejlsøgningshændelser i en tidsbegrænset periode."
"main-limited": "Der vil blive logget højst {{msg}} {{entity}} fejlfindingsbeskeder pr. {{time}}.",
"on-failure": "Log kun fejlbeskeder.",
"all-messages": "Log alle fejlfindingsbeskeder."
}
},
"calculated-fields": {
@ -1111,13 +1111,15 @@
"mistral-ai": "Mistral AI",
"anthropic": "Anthropic",
"amazon-bedrock": "Amazon Bedrock",
"github-models": "GitHub-modeller"
"github-models": "GitHub-modeller",
"ollama": "Ollama"
},
"name-required": "Navn er påkrævet.",
"name-max-length": "Navn må højst være 255 tegn.",
"provider": "Udbyder",
"api-key": "API-nøgle",
"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-required": "Projekt-ID er påkrævet",
"location": "Placering",
@ -1152,19 +1154,36 @@
"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.",
"frequency-penalty": "Frekvensstraf",
"frequency-penalty-hint": "Påfører en straf på et tokens sandsynlighed, som stiger baseret på dets hyppighed i teksten.",
"max-output-tokens": "Maksimalt outputtokens",
"max-output-tokens-min": "Skal være større end 0.",
"max-output-tokens-hint": "Angiver det maksimale antal tokens, som modellen kan generere i ét svar.",
"frequency-penalty-hint": "Anvender en straf på sandsynligheden for et token, som stiger afhængigt af dets hyppighed i teksten.",
"max-output-tokens": "Maksimalt antal output-tokens",
"max-output-tokens-hint": "Angiver det maksimale antal tokens, som \nmodellen 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-required": "Endpoint er påkrævet.",
"baseurl": "Base-URL",
"baseurl-required": "Base-URL er påkrævet.",
"service-version": "Serviceversion",
"check-connectivity": "Tjek forbindelsen",
"check-connectivity-success": "Testanmodningen var vellykket",
"check-connectivity-success": "Testanmodningen blev gennemført med succes",
"check-connectivity-failed": "Testanmodningen mislykkedes",
"no-model-matching": "Ingen modeller, der matcher '{{entity}}', blev fundet.",
"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": {
"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)",
"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",
"lwm2m-server": "LwM2M-server",
"include-bootstrap-server": "Inkluder Bootstrap Server-opdateringer",
"bootstrap-update-title": "Du har allerede konfigureret 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.",
"include-bootstrap-server": "Inkludér opdateringer til Bootstrap-server",
"bootstrap-update-title": "Du har allerede konfigureret en Bootstrap-server. Er du sikker på, at du vil udelukke opdateringerne?",
"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-required": "Host er påkrævet.",
"server-port": "Port",
@ -4308,8 +4327,8 @@
"current-password": "Nuværende adgangskode",
"copy-jwt-token": "Kopiér JWT-token",
"jwt-token": "JWT-token",
"token-valid-till": "Token er gyldig til",
"tokenCopiedSuccessMessage": "JWT-token er kopieret til udklipsholderen",
"token-valid-till": "Token er gyldig indtil",
"tokenCopiedSuccessMessage": "JWT-token er blevet kopieret til udklipsholderen",
"tokenCopiedWarnMessage": "JWT-token er udløbet! Opdater venligst siden."
},
"profiles": {
@ -4476,17 +4495,23 @@
"title-max-length": "Titel skal være mindre end 256 tegn",
"type": {
"jks": "JKS",
"js-module": "JS modul",
"lwm2m-model": "LWM2M model",
"pkcs-12": "PKCS #12"
"js-module": "JS-modul",
"lwm2m-model": "LWM2M-model",
"pkcs-12": "PKCS #12",
"general": "Generelt"
},
"resource-sub-type": "Undertype",
"sub-type": {
"image": "billede",
"scada-symbol": "Scada symbol",
"scada-symbol": "SCADA-symbol",
"extension": "Udvidelse",
"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": {
"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-required": "Cache udløbstid for kunder er påkrævet.",
"customer-cache-expiration-range": "Udløbstiden skal være ≥ 0.",
"interval-start": "Interval start",
"interval-end": "Interval slut",
"interval-start": "Start af interval",
"interval-end": "Intervalslut",
"time-unit": "Tidsenhed",
"fetch-mode": "Hentetilstand",
"fetch-mode": "Hentemåde",
"order-by-timestamp": "Sorter efter tidsstempel",
"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-range": "Grænsen skal være mellem 2 og 1000.",
"time-unit-milliseconds": "Millisekunder",
@ -4714,9 +4739,9 @@
"time-unit-minutes": "Minutter",
"time-unit-hours": "Timer",
"time-unit-days": "Dage",
"time-value-range": "Værdien skal være mellem 1 og 2147483647.",
"start-interval-value-required": "Interval start er påkrævet.",
"end-interval-value-required": "Interval slut er påkrævet.",
"time-value-range": "Tilladt område er fra 1 til 2147483647.",
"start-interval-value-required": "Intervalstart er påkrævet.",
"end-interval-value-required": "Intervalslut er påkrævet.",
"filter": "Filter",
"switch": "Skift",
"math-templatization-tooltip": "Understøtter templatisering via $[messageKey] og ${metadataKey}.",
@ -4759,7 +4784,7 @@
"copy-from": "Kopiér fra",
"data-to-metadata": "Data til metadata",
"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-required": "Interval er påkrævet",
"interval-hint": "Dedupliceringsinterval i sekunder.",
@ -4812,7 +4837,7 @@
"latest-telemetry": "Seneste telemetri",
"add-telemetry-key": "Tilføj telemetrinøgle",
"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",
"attr-mapping": "Attributmapping:",
"source-attribute": "Kildeattribut",
@ -4823,11 +4848,11 @@
"target-key-required": "Målnøgle er påkrævet.",
"attr-mapping-required": "Mindst én mapping skal angives.",
"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",
"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-poligon-parameter-info-from-metadata-hint": "Metadatafelt '{{perimeterKeyName}}' skal være i formatet: [[48.19736,24.65235],...]",
"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": "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.",
"fields-mapping-required": "Mindst én feltmapping er påkrævet.",
"at-least-one-field-required": "Mindst ét inputfelt skal have en værdi.",
@ -4918,8 +4943,8 @@
"mail-body-type": "Indholdstype",
"body-type-template": "Indholdstypemønster",
"reply-routing-configuration": "Svarrute-konfiguration",
"rpc-reply-routing-configuration-hint": "Konfiguration for at identificere tjeneste, session og anmodning i metadata.",
"reply-routing-configuration-hint": "Konfiguration for at identificere tjeneste 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": "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",
"service-id-metadata-attribute": "Tjeneste-id",
"session-id-metadata-attribute": "Session-id",
@ -4947,7 +4972,7 @@
"value-required": "Værdi er påkrævet",
"topic-pattern": "Emnemø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": "Emne",
"topic-required": "Emne er påkrævet",
@ -4956,18 +4981,18 @@
"other-properties": "Andre egenskaber",
"key": "Nøgle",
"key-required": "Nøgle er påkrævet",
"retries": "Antal genforsøg ved fejl",
"min-retries-message": "Kun 0 genforsøg tilladt som minimum",
"batch-size-bytes": "Batchstørrelse i bytes",
"min-batch-size-bytes-message": "Minimum batchstørrelse er 0",
"linger-ms": "Buffer-tid lokalt (ms)",
"min-linger-ms-message": "Minimum 0 ms tilladt",
"buffer-memory-bytes": "Maks. bufferstørrelse (bytes)",
"min-buffer-memory-message": "Minimum bufferstørrelse er 0",
"memory-buffer-size-range": "Bufferstørrelse skal være mellem 0 og {{max}} KB",
"acks": "Antal kvitteringer",
"topic-arn-pattern": "ARN-emnemønster",
"topic-arn-pattern-required": "ARN-emnemønster er påkrævet",
"retries": "Antal automatiske forsøg ved fejl",
"min-retries-message": "Kun 0 som minimumsantal forsøg er tilladt.",
"batch-size-bytes": "Batchstørrelse ved afsendelse (i bytes)",
"min-batch-size-bytes-message": "Kun 0 som minimum batchstørrelse er tilladt.",
"linger-ms": "Tidsbuffer lokalt (ms)",
"min-linger-ms-message": "Kun 0 ms som minimumværdi er tilladt.",
"buffer-memory-bytes": "Maksimal klientbufferstørrelse (i bytes)",
"min-buffer-memory-message": "Kun 0 som minimum bufferstørrelse er tilladt.",
"memory-buffer-size-range": "Bufferstørrelsen skal være mellem 0 og {{max}} KB",
"acks": "Antal bekræftelser",
"topic-arn-pattern": "Emne-ARN-mønster",
"topic-arn-pattern-required": "Emne-ARN-mønster er påkrævet",
"aws-access-key-id": "AWS Access Key ID",
"aws-access-key-id-required": "AWS Access Key ID er påkrævet",
"aws-secret-access-key": "AWS Secret Access Key",
@ -4987,35 +5012,35 @@
"password": "Adgangskode",
"automatic-recovery": "Automatisk gendannelse",
"connection-timeout-ms": "Forbindelsestimeout (ms)",
"min-connection-timeout-ms-message": "Minimum værdi er 0 ms",
"handshake-timeout-ms": "Handshake-timeout (ms)",
"min-handshake-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": "Tidsgrænse for håndtryk (ms)",
"min-handshake-timeout-ms-message": "Kun 0 ms som minimumværdi er tilladt.",
"client-properties": "Klientegenskaber",
"queue-url-pattern": "Kø-URL mønster",
"queue-url-pattern-required": "Kø-URL mønster er påkrævet",
"queue-url-pattern": "Køens URL-mønster",
"queue-url-pattern-required": "Køens URL-mønster er påkrævet",
"delay-seconds": "Forsinkelse (sekunder)",
"min-delay-seconds-message": "Minimum forsinkelse er 0 sekunder",
"max-delay-seconds-message": "Maksimal forsinkelse er 900 sekunder",
"min-delay-seconds-message": "Kun 0 sekunder som minimumværdi er tilladt.",
"max-delay-seconds-message": "Maksimum tilladt værdi er 900 sekunder.",
"name": "Navn",
"name-required": "Navn er påkrævet",
"name-required": "Navn er påkrævet.",
"queue-type": "Køtype",
"sqs-queue-standard": "Standard",
"sqs-queue-fifo": "FIFO",
"gcp-project-id": "GCP-projekt-ID",
"gcp-project-id-required": "GCP-projekt-ID er påkrævet",
"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": "GCP-servicekonto-nøglefil",
"gcp-service-account-key-required": "GCP-servicekonto-nøglefil er påkrævet",
"pubsub-topic-name": "Emnenavn",
"pubsub-topic-name-required": "Emnenavn er påkrævet",
"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",
"connect-timeout": "Forbindelsestimeout (sek)",
"connect-timeout-required": "Forbindelsestimeout er påkrævet.",
"connect-timeout-range": "Timeout skal være mellem 1 og 200.",
"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": "Forbindelsestidsgrænse (sek.)",
"connect-timeout-required": "Forbindelsestidsgrænse er påkrævet.",
"connect-timeout-range": "Forbindelsestidsgrænsen skal være mellem 1 og 200.",
"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.",
"append-client-id-suffix": "Tilføj service-ID som suffix 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-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 suffiks til Klient-ID",
"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-required": "Enheds-ID er påkrævet.",
"clean-session": "Ren session",
@ -5043,23 +5068,23 @@
"private-key-password": "Adgangskode til privat nøgle",
"use-system-smtp-settings": "Brug systemets SMTP-indstillinger",
"use-metadata-dynamic-interval": "Brug dynamisk interval",
"metadata-dynamic-interval-hint": "Intervalstart og -slut felterne understøtter skabeloner. Brug $[messageKey] eller ${metadataKey}.",
"use-metadata-interval-patterns-hint": "Hvis valgt, bruges mønstre fra metadata eller data til interval.",
"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, 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",
"overwrite-alarm-details": "Overskriv alarmdetaljer",
"use-alarm-severity-pattern": "Brug mønster for alarmens alvorlighed",
"check-all-keys": "Tjek at alle specificerede felter er til stede",
"check-all-keys-hint": "Tjekker at alle nøgler findes i data og metadata.",
"check-relation-to-specific-entity": "Tjek relation til specifik enhed",
"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-hint": "Tjek for relation til bestemt eller vilkårlig enhed.",
"delete-relation-with-specific-entity": "Slet relation med specifik enhed",
"delete-relation-with-specific-entity-hint": "Sletter relation med en bestemt enhed. Ellers slettes alle matchende relationer.",
"delete-relation-hint": "Sletter relation fra oprindelsen til den angivne enhed eller liste af enheder.",
"use-alarm-severity-pattern": "Brug mønster for alarmens alvorlighedsgrad",
"check-all-keys": "Tjek, at alle angivne felter er til stede",
"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 entitet",
"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": "Kontrollerer eksistensen af relation til en specifik eller vilkårlig entitet baseret på retning og relationstype.",
"delete-relation-with-specific-entity": "Slet relation til specifik entitet",
"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 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-hint": "Fjerner nuværende relationer baseret på type og retning.",
"change-originator-to-related-entity": "Skift oprindelse til relateret enhed",
"change-originator-to-related-entity-hint": "Behandler beskeden som om den kommer fra en anden enhed.",
"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 afsender til relateret entitet",
"change-originator-to-related-entity-hint": "Anvendes til at behandle en besked som om den kommer fra en anden entitet.",
"start-interval": "Interval start",
"end-interval": "Interval slut",
"start-interval-required": "Interval start er påkrævet.",
@ -5119,31 +5144,31 @@
"email-sender": "Email afsender",
"fields-to-check": "Felter der skal kontrolleres",
"add-detail": "Tilføj detalje",
"check-all-keys-tooltip": "Kontrollerer, at alle angivne felter findes i besked og metadata.",
"fields-to-check-hint": "Tryk på \"Enter\" for at afslutte. Flere felter understøttes.",
"entity-details-list-empty": "Mindst én detalje skal vælges.",
"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 indtastning af feltnavn. Flere feltnavne understøttes.",
"entity-details-list-empty": "Mindst ét detaljefelt skal vælges.",
"alarm-status": "Alarmstatus",
"alarm-required": "Mindst én alarmstatus skal vælges.",
"no-entity-details-matching": "Ingen tilsvarende entitetsdetaljer fundet.",
"custom-table-name": "Brugertabelnavn",
"no-entity-details-matching": "Ingen matchende entitetsdetaljer blev fundet.",
"custom-table-name": "Brugertilpasset tabelnavn",
"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-required": "Beskedfelt er påkrævet.",
"table-col": "Tabelkolonne",
"table-col-required": "Tabelkolonne er påkrævet.",
"latitude-field-name": "Navn på breddegradsfelt",
"longitude-field-name": "Navn på længdegradsfelt",
"latitude-field-name-required": "Navn på breddegradsfelt er påkrævet.",
"longitude-field-name-required": "Navn på længdegradsfelt er påkrævet.",
"fetch-perimeter-info-from-metadata": "Hent perimeteroplysninger fra metadata",
"fetch-perimeter-info-from-metadata-tooltip": "Parser metadatafelt for cirkel eller polygon afhængigt af perimeter-typen.",
"perimeter-key-name": "Perimeter nøgle navn",
"perimeter-key-name-hint": "Metadata felt med perimeter info.",
"perimeter-key-name-required": "Perimeter nøgle navn er påkrævet.",
"latitude-field-name": "Feltnavn for breddegrad",
"longitude-field-name": "Feltnavn for længdegrad",
"latitude-field-name-required": "Feltnavn for breddegrad er påkrævet.",
"longitude-field-name-required": "Feltnavn for længdegrad er påkrævet.",
"fetch-perimeter-info-from-metadata": "Hent perimeterinformation fra metadata",
"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",
"perimeter-key-name-hint": "Navn på metadatafelt, der indeholder perimeterinformation.",
"perimeter-key-name-required": "Perimeter-nøgle er påkrævet.",
"perimeter-circle": "Cirkel",
"perimeter-polygon": "Polygon",
"perimeter-type": "Perimeter type",
"perimeter-type": "Perimeter-type",
"circle-center-latitude": "Cirkelens center breddegrad",
"circle-center-latitude-required": "Center breddegrad er påkrævet.",
"circle-center-longitude": "Cirkelens center længdegrad",
@ -5155,25 +5180,25 @@
"range-unit-nautical-mile": "Sømil",
"range-units": "Afstandsenheder",
"range-units-required": "Afstandsenheder er påkrævet.",
"range": "Rækkevidde",
"range-required": "Rækkevidde er påkrævet.",
"range": "Interval",
"range-required": "Interval er påkrævet.",
"polygon-definition": "Polygondefinition",
"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-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-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",
"tell-failure-if-absent": "Rapporter fejl ved fravær",
"tell-failure-if-absent-hint": "Hvis mindst én af de valgte nøgler ikke findes, vil udgående besked rapportere \"Fejl\".",
"get-latest-value-with-ts": "Hent tidsstempel for de seneste telemetriværdier",
"tell-failure-if-absent": "Rapportér 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 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;\"",
"ignore-null-strings": "Ignorér tomme strenge",
"ignore-null-strings-hint": "Ignorerer felter med tomme værdier.",
"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-hint": "Hvis valgt, tilføjes metadataens nøgle-værdi par som byte arrays med foruddefineret tegnkodning.",
"ignore-null-strings-hint": "Hvis valgt, vil regelnoden ignorere entitetsfelter med tom værdi.",
"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 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-required": "Tegnkodning er påkrævet.",
"charset-us-ascii": "US-ASCII",
@ -5182,63 +5207,63 @@
"charset-utf-16be": "UTF-16BE",
"charset-utf-16le": "UTF-16LE",
"charset-utf-16": "UTF-16",
"select-queue-hint": "Vælg et kønavn fra rullemenu eller angiv et brugerdefineret navn.",
"device-profile-node-hint": "Nyttigt ved varighed eller gentagne betingelser for at sikre fortsat evaluering af alarmtilstand.",
"persist-alarm-rules": "Gem tilstand for alarmregler",
"persist-alarm-rules-hint": "Gemmer behandlingsstatus i databasen.",
"select-queue-hint": "Kønavnet kan vælges fra en rullemenu eller angives manuelt.",
"device-profile-node-hint": "Nyttigt, hvis du har varigheds- eller gentagelsesbetingelser for at sikre kontinuitet i evalueringen af alarmtilstand.",
"persist-alarm-rules": "Bevar tilstand for alarmregler",
"persist-alarm-rules-hint": "Hvis aktiveret, vil regelnoden gemme behandlingstilstanden i databasen.",
"fetch-alarm-rules": "Hent tilstand for alarmregler",
"fetch-alarm-rules-hint": "Genskaber tilstand ved opstart for at sikre korrekt alarmstatus.",
"input-value-key": "Input nøgle",
"input-value-key-required": "Input nøgle er påkrævet.",
"output-value-key": "Output nøgle",
"output-value-key-required": "Output nøgle er påkrævet.",
"number-of-digits-after-floating-point": "Antal decimaler",
"number-of-digits-after-floating-point-range": "Antal decimaler skal være mellem 0 og 15.",
"failure-if-delta-negative": "Rapportér fejl ved negativ delta",
"failure-if-delta-negative-tooltip": "Fejl ved negativ forskel mellem værdier.",
"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": "Inputværdinøgle",
"input-value-key-required": "Inputværdinøgle er påkrævet.",
"output-value-key": "Outputværdinøgle",
"output-value-key-required": "Outputværdinøgle er påkrævet.",
"number-of-digits-after-floating-point": "Antal decimaler efter komma",
"number-of-digits-after-floating-point-range": "Antallet af decimaler skal være mellem 0 og 15.",
"failure-if-delta-negative": "Rapportér fejl, hvis delta er negativ",
"failure-if-delta-negative-tooltip": "Regelnoden tvinger beskedbehandling til at fejle, hvis delta-værdien er negativ.",
"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-tooltip": "Hvis aktiveret, tilføjer regelknuden \"{{periodValueKey}}\" til den udgående besked.",
"period-value-key": "Tidsintervalnøgle",
"period-value-key-required": "Tidsintervalnøgle er påkrævet.",
"general-pattern-hint": "Brug ${metadataKey} for værdi fra metadata, $[messageKey] for værdi fra meddelelsesindhold.",
"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.)",
"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.",
"add-time-difference-between-readings-tooltip": "Hvis aktiveret, tilføjer regelnoden \"{{periodValueKey}}\" til den udgående besked.",
"period-value-key": "Periodeværdinøgle",
"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 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 beskedens indhold. Alarmernes alvorlighed skal være systemdefineret (CRITICAL, MAJOR osv.)",
"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-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.",
"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-single-pattern-hint": "Inputfelt understøtter skabelonisering. Brug $[messageKey] for værdi fra beskeden og ${metadataKey} for værdi fra metadata.",
"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 skabeloner. 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",
"server-scope": "Serverområde",
"client-scope": "Klientområde",
"attribute-type": "Attribute",
"attribute-type-description": "Hent attributværdi fra database",
"attribute-type-result-description": "Gem som attribut i database",
"attribute-type": "Attribut",
"attribute-type-description": "Hent attributværdi fra databasen",
"attribute-type-result-description": "Gem resultatet som en entitetsattribut i databasen",
"constant-type": "Konstant",
"constant-type-description": "Definér konstant værdi",
"time-series-type": "Tidsserie",
"time-series-type-description": "Hent seneste værdi fra database",
"time-series-type-result-description": "Gem som tidsserie i database",
"time-series-type-description": "Hent seneste tidsserieværdi fra databasen",
"time-series-type-result-description": "Gem resultatet som en entitets tidsserie i databasen",
"message-body-type": "Besked",
"message-body-type-description": "Hent argumentværdi fra besked",
"message-body-type-result-description": "Tilføj resultat til besked",
"message-body-type-description": "Hent argumentværdi fra den indgående besked",
"message-body-type-result-description": "Tilføj resultat til den udgående besked",
"message-metadata-type": "Metadata",
"message-metadata-type-description": "Hent argumentværdi fra metadata",
"message-metadata-result-description": "Tilføj resultat til metadata",
"message-metadata-type-description": "Hent argumentværdi fra den indgående beskeds metadata",
"message-metadata-result-description": "Tilføj resultat til metadata for den udgående besked",
"argument-tile": "Argumenter",
"no-arguments-prompt": "Ingen argumenter konfigureret",
"result-title": "Resultat",
"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-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-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-required": "Konstant værdi er påkrævet.",
"attribute-scope-field-input": "Attribut område",
"attribute-scope-field-input-required": "Område er påkrævet.",
"attribute-scope-field-input": "Attributområde",
"attribute-scope-field-input-required": "Attributområde er påkrævet.",
"default-value-field-input": "Standardværdi",
"type-field-input": "Type",
"type-field-input-required": "Type er påkrævet.",
@ -5266,21 +5291,21 @@
"clear-selected-keys": "Ryd valgte nøgler",
"geofence-configuration": "Geofence-konfiguration",
"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-on-first-message": "Ved første 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-each-message-hint": "Rapporterer status ved hver besked efter statusændring.",
"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 tilstedeværelsesstatus 'Inde' eller 'Ude' ved hver besked efter statusopdatering 'Gået ind' eller 'Gået ud'.",
"fetch-credentials-to": "Hent legitimationsoplysninger til",
"add-originator-attributes-to": "Tilføj afsenders attributter til",
"originator-attributes": "Afsenders attributter",
"fetch-latest-telemetry-with-timestamp": "Hent seneste telemetry med tidsstempel",
"fetch-latest-telemetry-with-timestamp-tooltip": "Inkluderer tidsstempel i metadata, f.eks.: \"{{latestTsKeyName}}\": \"{\"ts\":1574329385897, \"value\":42}\"",
"tell-failure": "Rapportér fejl hvis attribut mangler",
"tell-failure-tooltip": "Rapporterer fejl hvis mindst én valgt nøgle mangler.",
"created-time": "Oprettelsestid",
"chip-help": "Tryk på 'Enter' for at fuldføre {{inputName}}-indtastning. \nTryk på 'Backspace' for at slette {{inputName}}. \nFlere værdier understøttes.",
"add-originator-attributes-to": "Tilføj afsenderattributter til",
"originator-attributes": "Afsenderattributter",
"fetch-latest-telemetry-with-timestamp": "Hent seneste telemetri med tidsstempel",
"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 en eller flere attributter mangler",
"tell-failure-tooltip": "Hvis mindst én valgt nøgle ikke findes, vil den udgående besked rapportere \"Fejl\".",
"created-time": "Oprettelsestidspunkt",
"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",
"field-name": "feltnavn",
"device-profile": "enhedsprofil",
@ -5291,19 +5316,19 @@
"first-name": "Fornavn",
"last-name": "Efternavn",
"label": "Etiket",
"originator-fields-mapping": "Afsender felttilknytning",
"add-mapped-originator-fields-to": "Tilføj mappede afsenderfelter til",
"originator-fields-mapping": "Kortlægning af afsenderfelter",
"add-mapped-originator-fields-to": "Tilføj kortlagte afsenderfelter til",
"fields": "Felter",
"skip-empty-fields": "Spring tomme felter over",
"skip-empty-fields-tooltip": "Tomme felter tilføjes ikke til uddata.",
"fetch-interval": "Hentningsinterval",
"fetch-strategy": "Hentningsstrategi",
"fetch-timeseries-from-to": "Hent tidsserier fra {{startInterval}} {{startIntervalTimeUnit}} siden til {{endInterval}} {{endIntervalTimeUnit}} siden.",
"fetch-timeseries-from-to-invalid": "Ugyldig hentning af tidsserier (\"Intervalstart\" skal være mindre end \"Intervalslut\").",
"use-metadata-dynamic-interval-tooltip": "Hvis valgt, vil rule node bruge dynamisk intervalstart og -slut baseret på mønstre i beskeden og metadata.",
"all-mode-hint": "Hvis hentningstilstand \"Alle\" er valgt, vil rule node hente telemetri fra intervallet med 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.",
"last-mode-hint": "Hvis hentningstilstand \"Sidste\" er valgt, vil rule node hente den telemetri, der ligger tættest på intervallets slutning.",
"skip-empty-fields-tooltip": "Felter med tomme værdier tilføjes ikke til udgående besked eller metadata.",
"fetch-interval": "Henteinterval",
"fetch-strategy": "Hentestrategi",
"fetch-timeseries-from-to": "Hent tidsserie fra {{startInterval}} {{startIntervalTimeUnit}} siden til {{endInterval}} {{endIntervalTimeUnit}} siden.",
"fetch-timeseries-from-to-invalid": "Ugyldig tidsseriehentning (\"Interval start\" skal være mindre end \"Interval slut\").",
"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 hentemåde \"Alle\" er valgt, vil regelnoden hente telemetri fra hele intervallet baseret på konfigurerbare forespørgselsparametre.",
"first-mode-hint": "Hvis hentemåde \"Første\" er valgt, hentes den telemetri, der ligger tættest på intervalstarten.",
"last-mode-hint": "Hvis hentemåde \"Sidste\" er valgt, hentes den telemetri, der ligger tættest på intervalslutningen.",
"ascending": "Stigende",
"descending": "Faldende",
"min": "Min",
@ -5312,39 +5337,39 @@
"sum": "Sum",
"count": "Antal",
"none": "Ingen",
"last-level-relation-tooltip": "Søger kun relationer på det maksimale niveau.",
"last-level-device-relation-tooltip": "Søger kun enheder 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": "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",
"mapping-of-customers": "Kundemapping",
"map-fields-required": "Alle felter skal udfyldes.",
"mapping-of-customers": "Kortlægning af kunde",
"map-fields-required": "Alle kortlægningsfelter er påkrævede.",
"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",
"device-profiles": "Enhedsprofiler",
"mapping-of-tenant": "Tenant-mapping",
"mapping-of-tenant": "Kortlægning af tenant",
"add-attribute-key": "Tilføj attributnøgle",
"message-template": "Beskedskabelon",
"message-template-required": "Beskedskabelon er påkrævet",
"use-system-slack-settings": "Brug systemets Slack-indstillinger",
"slack-api-token": "Slack API-token",
"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",
"recipients": "Modtagere",
"message-subject-and-content": "Besked emne og indhold",
"template-rules-hint": "Brug $[messageKey] eller ${metadataKey} til værdier.",
"originator-customer-desc": "Brug kundens oprindelige afsender.",
"originator-tenant-desc": "Brug nuværende tenant.",
"originator-related-entity-desc": "Brug relateret entitet som afsender.",
"originator-alarm-originator-desc": "Brug alarmens afsender (kun hvis besked er alarm).",
"originator-entity-by-name-pattern-desc": "Find og brug entitet ud fra navn og type.",
"email-from-template-hint": "Brug $[messageKey] eller ${metadataKey} for at trække værdier.",
"recipients-block-main-hint": "Kommasepareret liste, understøtter templatization.",
"forward-msg-default-rule-chain": "Videresend besked til standard regelkæde",
"forward-msg-default-rule-chain-tooltip": "Bruger standard regelkæde for afsender eller konfigureret kæde.",
"exclude-zero-deltas": "Udelad nul-delta værdier",
"exclude-zero-deltas-hint": "Tilføj kun nøgle hvis værdi ikke er nul.",
"exclude-zero-deltas-time-difference-hint": "Tilføj kun hvis outputværdi ≠ 0.",
"message-subject-and-content": "Beskedens emne og indhold",
"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 kunde tilhørende beskedens afsender som ny afsender.",
"originator-tenant-desc": "Brug nuværende tenant som ny 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 som ny afsender. Kun hvis afsenderen er en alarmenhed.",
"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] for værdi fra besked og ${metadataKey} for værdi fra metadata.",
"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 afsenders standardregel-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": "Ekskludér nul-deltaer fra udgående besked",
"exclude-zero-deltas-hint": "Hvis aktiveret, tilføjes nøglen \"{{outputValueKey}}\" kun, hvis værdien ikke er nul.",
"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-to": "Fra målentitet til afsender",
"del-relation-direction-from": "Fra afsender",
@ -5354,33 +5379,33 @@
"function-name": "Funktionsnavn",
"function-name-required": "Funktionsnavn er påkrævet.",
"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",
"connection-timeout": "Forbindelsestimeout",
"connection-timeout-required": "Forbindelsestimeout er påkrævet.",
"connection-timeout-min": "Minimum forbindelsestimeout er 0.",
"connection-timeout-hint": "Ventetid ved etablering af forbindelse. 0 betyder uendelig og frarådes.",
"request-timeout": "Anmodningstimeout",
"request-timeout-required": "Anmodningstimeout er påkrævet",
"request-timeout-min": "Minimum anmodningstimeout er 0",
"request-timeout-hint": "Ventetid for anmodning, før timeout. 0 betyder uendelig og frarådes.",
"connection-timeout": "Forbindelsestidsgrænse",
"connection-timeout-required": "Forbindelsestidsgrænse er påkrævet.",
"connection-timeout-min": "Minimum forbindelsestidsgrænse er 0.",
"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": "Forespørgsels-timeout",
"request-timeout-required": "Forespørgsels-timeout er påkrævet.",
"request-timeout-min": "Minimum forespørgsels-timeout er 0.",
"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",
"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.",
"basic-mode": "Grundlæggende",
"tell-failure-aws-lambda": "Rapportér fejl, hvis AWS Lambda-funktion kaster en undtagelse",
"tell-failure-aws-lambda-hint": "Regelnoden tvinger fejl i beskedbehandling, hvis AWS Lambda-funktion udløser en undtagelse.",
"basic-mode": "Basis",
"advanced-mode": "Avanceret",
"save-time-series": {
"processing-settings": "Behandlingsindstillinger",
"processing-settings-hint": "Definér hvordan beskeder behandles. Grundlæggende eller avancerede strategier.",
"advanced-settings-hint": "Vær forsigtig – visse kombinationer kan føre til uventet adfærd.",
"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 ved konfiguration af behandlingsstrategier. Visse kombinationer kan føre til uforudset opførsel.",
"strategy": "Strategi",
"deduplication-interval": "Deduplikeringsinterval",
"deduplication-interval-required": "Dedupliceringsinterval er påkrævet",
"deduplication-interval-min-max-range": "Skal være mellem 1 sekund og 1 dag",
"deduplication-interval": "Deduplikationsinterval",
"deduplication-interval-required": "Deduplikationsinterval er påkrævet",
"deduplication-interval-min-max-range": "Deduplikationsinterval skal være mindst 1 sekund og højst 1 dag",
"strategy-type": {
"every-message": "Ved hver besked",
"skip": "Spring over",
"deduplicate": "Dedupliker",
"deduplicate": "Deduplikér",
"web-sockets-only": "Kun WebSockets"
},
"time-series": "Tidsserier",
@ -5390,17 +5415,17 @@
},
"save-attribute": {
"processing-settings": "Behandlingsindstillinger",
"processing-settings-hint": "Definér hvordan beskeder behandles. Grundlæggende eller avancerede strategier.",
"advanced-settings-hint": "Vær forsigtig – visse kombinationer kan føre til uventet adfærd.",
"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 ved konfiguration af behandlingsstrategier. Visse kombinationer kan føre til uforudset opførsel.",
"strategy": "Strategi",
"deduplication-interval": "Deduplikeringsinterval",
"deduplication-interval-required": "Deduplikeringsinterval er påkrævet",
"deduplication-interval-min-max-range": "Skal være mellem 1 sekund og 1 dag",
"deduplication-interval": "Deduplikationsinterval",
"deduplication-interval-required": "Deduplikationsinterval er påkrævet",
"deduplication-interval-min-max-range": "Deduplikationsinterval skal være mindst 1 sekund og højst 1 dag",
"scope": "Omfang",
"strategy-type": {
"every-message": "Ved hver besked",
"skip": "Spring over",
"deduplicate": "Dedupliker",
"deduplicate": "Deduplikér",
"web-sockets-only": "Kun WebSockets"
},
"attributes": "Attributter"
@ -5432,32 +5457,33 @@
"ai": {
"ai-model": "AI-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.",
"prompt-settings": "Promptindstillinger",
"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.",
"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": "Prompt-indstillinger",
"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-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.",
"user-prompt": "Brugerprompt",
"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.",
"response-format": "Svarformat",
"response-format": "Svartype",
"response-text": "Tekst",
"response-json": "JSON",
"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-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_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-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-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 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 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 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",
"advanced-settings": "Avancerede indstillinger",
"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-validation": "Skal være mellem 1 sekund og 10 minutter.",
"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": {
@ -5757,9 +5783,9 @@
"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-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-required": "Maksimalt antal regelnode-udførelser 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": "Maks. antal regelnodekørsler pr. besked",
"max-rule-node-executions-per-message-required": "Maks. antal regelnodekørsler pr. besked er påkrævet.",
"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-required": "Maksimalt antal sendte e-mails er påkrævet.",
"max-emails-range": "Maksimalt antal sendte e-mails må ikke være negativt",
@ -5987,9 +6013,10 @@
"label": "Etiket",
"value": "Værdi",
"date": "Dato",
"show-date-time-interval": "Vis datotidsinterval",
"show-date-time-interval-hint": "Vis datotidsinterval i henhold til dataaggregering.",
"show-date-time-interval": "Vis dato-/tidsinterval",
"show-date-time-interval-hint": "Vis dato-/tidsinterval i henhold til dataaggregering.",
"hide-zero-tooltip-values": "Skjul nulværdier",
"show-stack-total": "Vis totalværdi i stablet tilstand",
"background-color": "Baggrundsfarve",
"background-blur": "Baggrundssløring"
},
@ -6702,15 +6729,15 @@
"no-widgets-text": "Ingen widgets fundet",
"management": "Widgetadministration",
"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?",
"widget-type-not-found": "Problem med at indlæse widgetkonfiguration.<br>Den tilknyttede widgettype er sandsynligvis blevet fjernet.",
"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 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:",
"remove": "Fjern widget",
"delete": "Slet widget",
"edit": "Rediger widget",
"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.",
"replace-reference-with-widget-copy": "Erstat reference med kopi af widget",
"remove-widget-text": "Efter bekræftelse bliver widgetten og alle relaterede data uigenkaldeligt slettet.",
"replace-reference-with-widget-copy": "Erstat reference med en kopi af widget",
"timeseries": "Tidsserier",
"search-data": "Søg data",
"no-data-found": "Ingen data fundet",
@ -7550,8 +7577,8 @@
"October": "Oktober",
"November": "November",
"December": "December",
"Custom Date Range": "Brugerdefineret datoområde",
"Date Range Template": "Skabelon for datoområde",
"Custom Date Range": "Brugerdefineret datointerval",
"Date Range Template": "Datointervalskabelon",
"Today": "I dag",
"Yesterday": "I går",
"This Week": "Denne uge",
@ -7572,7 +7599,7 @@
"Custom interval": "Brugerdefineret interval",
"Interval": "Interval",
"Step size": "Trinstørrelse",
"Ok": "OK"
"Ok": "Ok"
}
},
"doughnut": {
@ -7784,11 +7811,11 @@
"gpio-switches": "GPIO-kontakter",
"no-gpio-switches": "Ingen GPIO-kontakter konfigureret",
"add-gpio-switch": "Tilføj GPIO-kontakt",
"gpio-status-request": "GPIO-statusanmodning",
"gpio-status-request": "GPIO-statusforespørgsel",
"method-name": "Metodenavn",
"method-body": "Metodeindhold",
"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",
"no-gpio-leds": "Ingen GPIO-LED'er konfigureret",
"add-gpio-led": "Tilføj GPIO-LED"
@ -9522,4 +9549,4 @@
"language": {
"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-region": "AWS-Region",
"aws-region-required": "AWS-Region ist erforderlich",
"number-from": "Absendernummer",
"number-from-required": "Absendernummer ist erforderlich.",
"number-to": "Empfängernummer",
"number-to-required": "Empfängernummer ist erforderlich.",
"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-pattern": "Ungültige Telefonnummer. Sollte im E.164-Format sein, z. B. +19995550123.",
"phone-number-pattern-twilio": "Ungültige Telefonnummer. Sollte im E.164-Format/SID der Telefonnummer/Messaging Service SID sein.",
"number-from": "Telefonnummer Von",
"number-from-required": "Telefonnummer Von ist erforderlich.",
"number-to": "Telefonnummer An",
"number-to-required": "Telefonnummer An ist erforderlich.",
"phone-number-hint": "Telefonnummer im E.164-Format, z.B. +19995550123",
"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 vorliegen, z. B. +19995550123.",
"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-required": "SMS-Nachricht ist erforderlich.",
"sms-message-max-length": "SMS-Nachricht darf nicht länger als 1600 Zeichen sein",
"twilio-account-sid": "Twilio Account SID",
"twilio-account-sid-required": "Twilio Account SID ist erforderlich",
"twilio-account-token": "Twilio Account Token",
"twilio-account-token-required": "Twilio Account Token ist erforderlich",
"twilio-account-sid": "Twilio-Konto SID",
"twilio-account-sid-required": "Twilio-Konto SID ist erforderlich",
"twilio-account-token": "Twilio-Konto-Token",
"twilio-account-token-required": "Twilio-Konto-Token ist erforderlich",
"send-test-sms": "Test-SMS senden",
"test-sms-sent": "Test-SMS wurde erfolgreich gesendet!",
"security-settings": "Sicherheitseinstellungen",
"password-policy": "Passwortrichtlinie",
"minimum-password-length": "Minimale Passwortlänge",
"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-min": "Maximale Passwortlänge sollte mindestens 6 betragen",
"maximum-password-length-less-min": "Maximale Passwortlänge muss größer als die minimale Länge sein",
"minimum-uppercase-letters": "Minimale Anzahl an Großbuchstaben",
"minimum-uppercase-letters-range": "Minimale Anzahl an Großbuchstaben darf nicht negativ sein",
"minimum-lowercase-letters": "Minimale Anzahl an Kleinbuchstaben",
"minimum-lowercase-letters-range": "Minimale Anzahl an Kleinbuchstaben darf nicht negativ sein",
"minimum-digits": "Minimale Anzahl an Ziffern",
"minimum-digits-range": "Minimale Anzahl an Ziffern darf nicht negativ sein",
"minimum-special-characters": "Minimale Anzahl an Sonderzeichen",
"minimum-special-characters-range": "Minimale Anzahl an Sonderzeichen darf nicht negativ sein",
"maximum-password-length-min": "Die maximale Passwortlänge muss mindestens 6 betragen",
"maximum-password-length-less-min": "Die maximale Passwortlänge muss größer als die minimale sein",
"minimum-uppercase-letters": "Mindestanzahl an Großbuchstaben",
"minimum-uppercase-letters-range": "Die Mindestanzahl an Großbuchstaben darf nicht negativ sein",
"minimum-lowercase-letters": "Mindestanzahl an Kleinbuchstaben",
"minimum-lowercase-letters-range": "Die Mindestanzahl an Kleinbuchstaben darf nicht negativ sein",
"minimum-digits": "Mindestanzahl an Ziffern",
"minimum-digits-range": "Die Mindestanzahl an Ziffern darf nicht negativ sein",
"minimum-special-characters": "Mindestanzahl an Sonderzeichen",
"minimum-special-characters-range": "Die Mindestanzahl an Sonderzeichen darf nicht negativ sein",
"password-expiration-period-days": "Passwort-Ablaufzeitraum in Tagen",
"password-expiration-period-days-range": "Passwort-Ablaufzeitraum darf nicht negativ sein",
"password-reuse-frequency-days": "Häufigkeit der Passwortwiederverwendung in Tagen",
@ -676,8 +676,8 @@
"alias": {
"add": "Alias hinzufügen",
"edit": "Alias bearbeiten",
"name": "Aliasname",
"name-required": "Aliasname ist erforderlich",
"name": "Alias-Name",
"name-required": "Alias-Name ist erforderlich",
"duplicate-alias": "Ein Alias mit demselben Namen existiert bereits.",
"filter-type-single-entity": "Einzelne Entität",
"filter-type-entity-list": "Entitätsliste",
@ -864,15 +864,15 @@
"api-features": "API-Funktionen",
"api-usage": "API-Nutzung",
"alarm": "Alarm",
"alarms-created": "Erstellte Alarme",
"alarms-created": "Alarme erstellt",
"queue-stats": "Warteschlangenstatistiken",
"processing-failures-and-timeouts": "Verarbeitungsfehler und Zeitüberschreitungen",
"exceptions": "Ausnahmen",
"alarms-created-daily-activity": "Tägliche Aktivität der Alarmerstellung",
"alarms-created-hourly-activity": "Stündliche Aktivität der Alarmerstellung",
"alarms-created-monthly-activity": "Monatliche Aktivität der Alarmerstellung",
"alarms-created-daily-activity": "Tägliche Aktivität der Alarm-Erstellung",
"alarms-created-hourly-activity": "Stündliche Aktivität der Alarm-Erstellung",
"alarms-created-monthly-activity": "Monatliche Aktivität der Alarm-Erstellung",
"data-points": "Datenpunkte",
"data-points-storage-days": "Speichertage der Datenpunkte",
"data-points-storage-days": "Speicherzeitraum der Datenpunkte (in Tagen)",
"device-api": "Geräte-API",
"email": "E-Mail",
"email-messages": "E-Mail-Nachrichten",
@ -1111,13 +1111,15 @@
"mistral-ai": "Mistral AI",
"anthropic": "Anthropic",
"amazon-bedrock": "Amazon Bedrock",
"github-models": "GitHub-Modelle"
"github-models": "GitHub-Modelle",
"ollama": "Ollama"
},
"name-required": "Name ist erforderlich.",
"name-max-length": "Der Name darf höchstens 255 Zeichen lang sein.",
"provider": "Anbieter",
"api-key": "API-Schlüssel",
"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-required": "Projekt-ID ist erforderlich.",
"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-min-max": "Muss größer als 0 und maximal 1 sein.",
"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.",
"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.",
"frequency-penalty": "Strafe für Häufigkeit",
"frequency-penalty-hint": "Verringert die Wahrscheinlichkeit eines Tokens basierend auf seiner Häufigkeit im Text.",
"frequency-penalty": "Frequenzstrafe",
"frequency-penalty-hint": "Reduziert die Wahrscheinlichkeit eines Tokens abhängig von seiner Häufigkeit im Text.",
"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 Modell in einer Antwort generieren kann.",
"max-output-tokens-hint": "Legt die maximale Anzahl an Tokens fest, die das \nModell 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-required": "Endpunkt ist erforderlich.",
"baseurl": "Basis-URL",
"baseurl-required": "Basis-URL ist erforderlich.",
"service-version": "Service-Version",
"check-connectivity": "Konnektivität prüfen",
"check-connectivity-success": "Testanfrage war erfolgreich",
"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.",
"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": {
"message": "Sie haben ungespeicherte Änderungen. Möchten Sie diese Seite wirklich verlassen?",
@ -1228,7 +1247,7 @@
"required-fields": "Erforderliche Felder fehlen"
},
"content-type": {
"json": "Json",
"json": "JSON",
"text": "Text",
"binary": "Binär (Base64)"
},
@ -1261,11 +1280,11 @@
"add-customer-text": "Neuen Kunden hinzufügen",
"no-customers-text": "Keine Kunden gefunden",
"customer-details": "Kundendetails",
"delete-customer-title": "Möchten Sie den Kunden '{{customerTitle}}' wirklich löschen?",
"delete-customer-text": "Achtung, nach der Bestätigung werden der Kunde und alle zugehörigen Daten unwiederbringlich gelöscht.",
"delete-customers-title": "Möchten Sie { count, plural, =1 {1 Kunden} other {# Kunden} } 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 unwiderruflich gelöscht.",
"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-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-assets": "Assets verwalten",
"manage-devices": "Geräte verwalten",
@ -1578,13 +1597,13 @@
"time-prev-description": "Zeitstempel des vorherigen Werts;",
"prev-orig-value-description": "ursprünglicher vorheriger Wert;",
"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-min-hint": "Mindestwert innerhalb des ausgewählten Zeitfensters finden.",
"aggregation-type-max-hint": "Höchstwert innerhalb des ausgewählten Zeitfensters finden.",
"aggregation-type-avg-hint": "Durchschnittswert innerhalb des ausgewählten Zeitfensters berechnen.",
"aggregation-type-sum-hint": "Alle Werte der Datenpunkte im Zeitfenster summieren.",
"aggregation-type-count-hint": "Gesamtanzahl der Datenpunkte im Zeitfenster.",
"aggregation-type-min-hint": "Minimalwert unter den Datenpunkten innerhalb eines ausgewählten Zeitfensters ermitteln.",
"aggregation-type-max-hint": "Maximalwert unter den Datenpunkten innerhalb eines ausgewählten Zeitfensters ermitteln.",
"aggregation-type-avg-hint": "Durchschnittswert der Datenpunkte innerhalb eines ausgewählten Zeitfensters berechnen.",
"aggregation-type-sum-hint": "Summe aller Werte der Datenpunkte innerhalb eines ausgewählten Zeitfensters berechnen.",
"aggregation-type-count-hint": "Gesamtanzahl der Datenpunkte innerhalb eines ausgewählten Zeitfensters.",
"delta-calculation": "Delta-Berechnung",
"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.",
@ -1991,19 +2010,19 @@
"create-new-device-profile": "Neues erstellen!",
"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-spark-plug": "MQTT Sparkplug B Edge-of-Network (EoN) Node.",
"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-attribute-metric-names": "SparkPlug-Metriken zur Speicherung als Attribute.",
"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-payload-type": "MQTT-Geräte-Nutzlast",
"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-Knoten mit Sparkplug B Payload- und Topic-Format.",
"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 Gerätetelemetrie gespeichert.",
"mqtt-device-payload-type": "MQTT-Geräte-Payload",
"mqtt-device-payload-type-json": "JSON",
"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-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-use-json-format-for-default-downlink-topics": "JSON-Format für Standard-Downlink-Themen 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-send-ack-on-validation-exception": "PUBACK bei 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-enable-compatibility-with-json-payload-format": "Kompatibilität mit anderen Payload-Formaten aktivieren.",
"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-Topics verwenden",
"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 PUBLISH-Validierungsfehler senden",
"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",
"snmp-add-mapping": "SNMP-Zuordnung hinzufügen",
"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-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.",
"not-valid-pattern-topic-filter": "Ungültiges Muster im Topic-Filter",
"not-valid-single-character": "Ungültige Verwendung eines Single-Level-Wildcards",
"not-valid-multi-character": "Ungültige Verwendung eines Multi-Level-Wildcards",
"single-level-wildcards-hint": "<code>[+]</code> kann jedes Topic-Level ersetzen. Beispiel: <b>v1/devices/+/telemetry</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>.",
"not-valid-pattern-topic-filter": "Ungültiges Topic-Filter-Muster",
"not-valid-single-character": "Ungültige Verwendung eines einstelligen Platzhalters",
"not-valid-multi-character": "Ungültige Verwendung eines mehrstufigen Platzhalters",
"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> 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-with-count": "Alarmregeln ({{count}})",
"no-alarm-rules": "Keine Alarmregeln konfiguriert",
@ -2050,8 +2069,8 @@
"edit-alarm-rule": "Alarmregel bearbeiten",
"alarm-type": "Alarmtyp",
"alarm-type-required": "Alarmtyp ist erforderlich.",
"alarm-type-unique": "Alarmtyp muss innerhalb der Alarmregeln des Geräteprofils eindeutig sein.",
"alarm-type-max-length": "Alarmtyp sollte weniger als 256 Zeichen enthalten",
"alarm-type-unique": "Der Alarmtyp muss innerhalb der Geräteprofil-Alarmregeln eindeutig sein.",
"alarm-type-max-length": "Alarmtyp darf maximal 256 Zeichen lang sein",
"create-alarm-pattern": "<b>{{alarmType}}</b> Alarm erstellen",
"create-alarm-rules": "Alarmregeln erstellen",
"no-create-alarm-rules": "Keine Erstellungsbedingungen konfiguriert",
@ -2072,16 +2091,16 @@
"advanced-settings": "Erweiterte Einstellungen",
"alarm-rule-additional-info": "Zusätzliche Informationen",
"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-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-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>, 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-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",
"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-hint": "Definiert Beziehungstypen zur Filterung der verbundenen Entitäten. Wenn nicht gesetzt, wird der Alarm an alle verbundenen Entitäten propagiert.",
"propagate-alarm-to-owner": "Alarm an Eigentümer der Entität (Kunde oder Mandant) propagieren",
"propagate-alarm-to-tenant": "Alarm an Mandant propagieren",
"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 weiterleiten (Kunde oder Tenant)",
"propagate-alarm-to-tenant": "Alarm an den Tenant weiterleiten",
"alarm-rule-condition": "Alarmregelbedingung",
"enter-alarm-rule-condition-prompt": "Bitte fügen Sie eine Alarmregelbedingung hinzu",
"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)",
"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",
"lwm2m-server": "LwM2M-Server",
"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-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-required": "Host ist erforderlich.",
"server-port": "Port",
"server-port-required": "Port ist erforderlich.",
"server-port-pattern": "Port muss eine positive Ganzzahl sein.",
"server-port-range": "Port sollte im Bereich von 1 bis 65535 liegen.",
"server-port-pattern": "Port muss eine positive ganze Zahl sein.",
"server-port-range": "Port muss im Bereich von 1 bis 65535 liegen.",
"server-public-key": "Öffentlicher Schlüssel des Servers",
"server-public-key-required": "Öffentlicher Schlüssel des Servers ist erforderlich.",
"client-hold-off-time": "Wartezeit des Clients",
"client-hold-off-time-required": "Wartezeit des Clients ist erforderlich.",
"client-hold-off-time-pattern": "Wartezeit des Clients muss eine positive Ganzzahl sein.",
"client-hold-off-time-tooltip": "Client-Wartezeit nur bei Verwendung eines Bootstrap-Servers",
"account-after-timeout": "Konto nach Zeitüberschreitung",
"account-after-timeout-required": "Konto nach Zeitüberschreitung ist erforderlich.",
"account-after-timeout-pattern": "Konto nach Zeitüberschreitung muss eine positive Ganzzahl sein.",
"account-after-timeout-tooltip": "Wert für Konto nach Zeitüberschreitung beim Bootstrap-Server.",
"client-hold-off-time": "Verzögerungszeit (Hold Off Time)",
"client-hold-off-time-required": "Verzögerungszeit ist erforderlich.",
"client-hold-off-time-pattern": "Verzögerungszeit muss eine positive ganze Zahl sein.",
"client-hold-off-time-tooltip": "Verzögerungszeit für den Einsatz mit einem Bootstrap-Server",
"account-after-timeout": "Aktivierung nach Zeitüberschreitung",
"account-after-timeout-required": "Aktivierung nach Zeitüberschreitung ist erforderlich.",
"account-after-timeout-pattern": "Der Wert muss eine positive ganze Zahl sein.",
"account-after-timeout-tooltip": "Bootstrap-Server-Aktivierung nach dem durch diese Ressource angegebenen Timeout-Wert.",
"server-type": "Servertyp",
"add-new-server-title": "Neue Serverkonfiguration hinzufügen",
"add-server-config": "Serverkonfiguration hinzufügen",
@ -2267,25 +2286,25 @@
"others-tab": "Weitere Einstellungen",
"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-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).",
"client-strategy": "Client-Strategie beim Verbinden",
"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 Verbindungsaufbau",
"client-strategy-label": "Strategie",
"client-strategy-only-observe": "Nur Beobachtungsanfragen nach der ersten Verbindung",
"client-strategy-read-all": "Alle Ressourcen lesen und beobachten nach der Registrierung",
"client-strategy-only-observe": "Nur Observe-Anfrage an den Client nach der ersten Verbindung",
"client-strategy-read-all": "Alle Ressourcen lesen und Observe-Anfrage nach der Registrierung senden",
"fw-update": "Firmware-Update",
"fw-update-strategy": "Firmware-Update-Strategie",
"fw-update-strategy-data": "Firmware-Update als Binärdatei mit Objekt 19 und Ressource 0 (Daten) übertragen",
"fw-update-strategy-package": "Firmware-Update als Binärdatei mit Objekt 5 und Ressource 0 (Paket) ü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": "Strategie für Firmware-Update",
"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 über Objekt 5 und Ressource 0 (Package) ü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-strategy": "Software-Update-Strategie",
"sw-update-strategy-package": "Binärdatei mit Objekt 9 und Ressource 2 (Paket) ü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",
"fw-update-resource": "Firmware-Update CoAP-Ressource",
"fw-update-resource-required": "Firmware-Update CoAP-Ressource ist erforderlich.",
"sw-update-resource": "Software-Update CoAP-Ressource",
"sw-update-resource-required": "Software-Update CoAP-Ressource ist erforderlich.",
"config-json-tab": "JSON-Konfigurationsprofil Gerät",
"sw-update-strategy": "Strategie für Software-Update",
"sw-update-strategy-package": "Binärdatei über Objekt 9 und Ressource 2 (Package) ü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": "CoAP-Ressource für Firmware-Update",
"fw-update-resource-required": "CoAP-Ressource für Firmware-Update ist erforderlich.",
"sw-update-resource": "CoAP-Ressource für Software-Update",
"sw-update-resource-required": "CoAP-Ressource für Software-Update ist erforderlich.",
"config-json-tab": "JSON-Konfigurationsprofil für Gerät",
"attributes-name": {
"min-period": "Minimale Periode",
"max-period": "Maximale Periode",
@ -2810,20 +2829,20 @@
"server-attributes-placeholder": "Server-Attribute",
"timeseries-placeholder": "Zeitreihen",
"target-entity": "Zielentität",
"attributes-propagation": "Attributübertragung",
"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": "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 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-hint": "Konfigurieren Sie die Zeitreihendatenschlüssel der Zielentität, die für die Entitätsansicht zugänglich sein werden. Diese Zeitreihendaten sind schreibgeschützt.",
"search": "Entitätsansichten suchen",
"selected-entity-views": "{ count, plural, =1 {1 Entitätsansicht} other {# Entitätsansichten} } ausgewählt",
"assign-entity-view-to-edge": "Entitätsansicht(en) Edge zuweisen",
"assign-entity-view-to-edge-text": "Bitte wählen Sie die Entitätsansichten aus, die dem 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-text": "Nach der Bestätigung wird die Entitätsansicht von Edge entfernt und ist nicht mehr zugänglich.",
"unassign-entity-views-from-edge-action-title": "{ count, plural, =1 {1 Entitätsansicht} other {# Entitätsansichten} } von Edge entfernen",
"unassign-entity-view-from-edge": "Entitätsansicht von Edge 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-text": "Nach der Bestätigung werden alle ausgewählten Entitätsansichten von Edge entfernt und sind nicht mehr zugänglich."
"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ätssichten suchen",
"selected-entity-views": "{ count, plural, =1 {1 Entitätssicht} other {# Entitätssichten} } ausgewählt",
"assign-entity-view-to-edge": "Entitätssicht(en) einer Edge zuweisen",
"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": "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 entfernt und ist auf der Edge nicht mehr verfügbar.",
"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 entfernen",
"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ätssichten entfernt und sind auf der Edge nicht mehr verfügbar."
},
"event": {
"event-type": "Ereignistyp",
@ -3041,15 +3060,15 @@
"edit": "Filter bearbeiten",
"name": "Filtername",
"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",
"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}}",
"duplicate-filter-error": "Doppelter Filter gefunden '{{filter}}'.<br>Filter müssen innerhalb des Dashboards eindeutig sein.",
"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.",
"missing-key-filters-error": "Schlüsselfilter fehlt für Filter '{{filter}}'.",
"filter": "Filter",
"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-filter-text": "Kein Filter angegeben",
"add-filter-prompt": "Bitte Filter hinzufügen",
@ -4303,7 +4322,7 @@
},
"profile": {
"profile": "Profil",
"last-login-time": "Letzte Anmeldung",
"last-login-time": "Letzter Login",
"change-password": "Passwort ändern",
"current-password": "Aktuelles Passwort",
"copy-jwt-token": "JWT-Token kopieren",
@ -4478,7 +4497,8 @@
"jks": "JKS",
"js-module": "JS-Modul",
"lwm2m-model": "LWM2M-Modell",
"pkcs-12": "PKCS #12"
"pkcs-12": "PKCS #12",
"general": "Allgemein"
},
"resource-sub-type": "Subtyp",
"sub-type": {
@ -4486,7 +4506,12 @@
"scada-symbol": "SCADA-Symbol",
"extension": "Erweiterung",
"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": {
"add": "JavaScript-Ressource hinzufügen",
@ -4742,24 +4767,24 @@
"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.",
"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-enabled": "Aktualisiert Attribute nur bei Wertänderung. Keine Aktualisierung von Zeitstempel oder Änderungsbenachrichtigung bei gleichem Wert.",
"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 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",
"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-delete-hint": "Wenn aktiviert, erzwingt Benachrichtigung an das Gerät bei Attribut-Entfernung. Bei Deaktivierung erfolgt Steuerung über Metadatenparameter 'notifyDevice'.",
"latest-timeseries": "Neueste Zeitreihenschlüssel",
"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, 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 Zeitreihendatenschlü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-message-field": "Nachrichtenfeld hinzufügen",
"relation-search-parameters": "Beziehungs-Suchparameter",
"relation-search-parameters": "Suchparameter für Beziehungen",
"relation-parameters": "Beziehungsparameter",
"add-metadata-field": "Metadatenfeld hinzufügen",
"data-keys": "Feldnamen der Nachricht",
"copy-from": "Kopieren von",
"data-to-metadata": "Daten zu Metadaten",
"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-required": "Intervall ist erforderlich",
"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.",
"relations-query-config-direction-suffix": "Absender",
"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-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]]",
"short-templatization-tooltip": "Verwenden Sie $[messageKey] für Nachrichtenwerte und ${metadataKey} für Metadatenwerte.",
"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}}' muss im folgenden Format definiert sein: [[48.19736,24.65235],[48.19800,24.65060],...,[48.19849,24.65420]]",
"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.",
"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}.",
"sv-map-hint": "Nur 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], um einen Wert aus der Nachricht zu extrahieren, und ${metadataKey}, um einen Wert aus den Metadaten zu extrahieren.",
"source-field": "Quellfeld",
"source-field-required": "Quellfeld ist erforderlich.",
"originator-source": "Absenderquelle",
@ -5436,11 +5461,11 @@
"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.",
"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.",
"user-prompt": "Benutzer-Prompt",
"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.",
"response-format": "Antwortformat",
"response-text": "Text",
@ -5457,7 +5482,8 @@
"timeout-required": "Zeitüberschreitung ist erforderlich",
"timeout-validation": "Muss zwischen 1 Sekunde und 10 Minuten liegen.",
"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": {
@ -5987,9 +6013,10 @@
"label": "Beschriftung",
"value": "Wert",
"date": "Datum",
"show-date-time-interval": "Datum/Zeit-Intervall anzeigen",
"show-date-time-interval-hint": "Datum/Zeit-Intervall gemäß Datenaggregation anzeigen.",
"show-date-time-interval": "Datums-/Zeitintervall anzeigen",
"show-date-time-interval-hint": "Zeigt das Datums-/Zeitintervall entsprechend der Datenaggregation an.",
"hide-zero-tooltip-values": "Nullwerte ausblenden",
"show-stack-total": "Gesamtwert im Stapelmodus anzeigen",
"background-color": "Hintergrundfarbe",
"background-blur": "Hintergrundunschärfe"
},
@ -6556,10 +6583,10 @@
"no-users-text": "Keine Benutzer gefunden",
"user-details": "Benutzerdetails",
"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-users-title": "Möchten Sie wirklich { count, plural, =1 {1 Benutzer} other {# Benutzer} } löschen?",
"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 { 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-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!",
"resend-activation": "Aktivierung erneut senden",
"email": "E-Mail",
@ -6669,24 +6696,24 @@
"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.",
"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",
"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",
"updated": "{{updated}} aktualisiert",
"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.",
"auto-commit-to-branch": "automatisch in <b>{{ branch }}</b>-Zweig übernehmen",
"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-overwrite-hint": "Erstellt oder aktualisiert ausgewählte 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.",
"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.",
"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": "Auto-Commit in den Branch <b>{{branch}}</b>",
"default-create-entity-version-name": "{{entityName}}-Aktualisierung",
"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 die ausgewählten Entitäten im Repository. Alle anderen Repository-Entitäten werden <b>gelöscht</b>.",
"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": "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}}",
"auto-commit-settings-read-only-hint": "Auto-Commit funktioniert nicht, wenn die Option 'Nur-Lesen' in den Repository-Einstellungen aktiviert ist.",
"rollback-on-error": "Bei Fehler zurücksetzen",
"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."
"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": "Rollback bei Fehlern",
"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-library": "Widget-Bibliothek",
@ -6703,8 +6730,8 @@
"management": "Widget-Verwaltung",
"editor": "Widget-Editor",
"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-load-error": "Widget konnte aufgrund folgender Fehler nicht geladen werden:",
"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 der folgenden Fehler nicht geladen werden:",
"remove": "Widget entfernen",
"delete": "Widget löschen",
"edit": "Widget bearbeiten",
@ -6769,11 +6796,11 @@
"javascript": "JavaScript",
"js": "JS",
"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-widgets-title": "Möchten Sie wirklich { count, plural, =1 {1 Widget} other {# Widgets} } löschen?",
"delete-widgets-text": "Nach der Bestätigung werden alle ausgewählten Widgets und alle zugehörigen Daten 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 { count, plural, =1 {1 Widget} other {# Widgets} } wirklich löschen?",
"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",
"widget-template-load-failed-error": "Widget-Vorlage konnte nicht geladen werden!",
"widget-template-load-failed-error": "Laden der Widget-Vorlage fehlgeschlagen!",
"details": "Details",
"widget-details": "Widget-Details",
"add": "Widget hinzufügen",
@ -8572,15 +8599,15 @@
"fit-map-bounds": "Kartenausschnitt anpassen, um alle Marker abzudecken",
"use-default-map-center-position": "Standard-Zentrum der Karte verwenden",
"entities-limit": "Grenze für zu ladende Entitäten",
"markers-settings": "Marker-Einstellungen",
"marker-offset-x": "X-Versatz des Markers multipliziert mit Breite",
"marker-offset-y": "Y-Versatz des Markers multipliziert mit Höhe",
"position-function": "Positionsumrechnungsfunktion, sollte x,y-Koordinaten als Double (0-1) zurückgeben",
"draggable-marker": "Marker verschiebbar",
"markers-settings": "Markereinstellungen",
"marker-offset-x": "Marker-X-Versatz relativ zur Position multipliziert mit der Markerbreite",
"marker-offset-y": "Marker-Y-Versatz relativ zur Position multipliziert mit der Markerhöhe",
"position-function": "Positionskonvertierungsfunktion, sollte x,y-Koordinaten im Bereich von 0 bis 1 (double) zurückgeben",
"draggable-marker": "Verschiebbarer Marker",
"label": "Beschriftung",
"show-label": "Beschriftung anzeigen",
"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",
"tooltip": "Tooltip",
"show-tooltip": "Tooltip anzeigen",
@ -9522,4 +9549,4 @@
"language": {
"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