From 8636ed3b0d68af3160385c1ff302c4ebe281a824 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Tue, 19 Mar 2024 12:57:37 +0200 Subject: [PATCH 01/17] TB Core consumer - parallel processing; refactoring --- .../queue/DefaultTbCoreConsumerService.java | 428 ++++++++---------- .../DefaultTbRuleEngineConsumerService.java | 39 +- .../consumer/BasicQueueConsumerManager.java | 109 +++++ .../queue/consumer/QueueConsumerManager.java | 321 +++++++++++++ .../processing/AbstractConsumerService.java | 128 +++--- .../TbQueueConsumerManagerTask.java | 8 +- .../queue/ruleengine/TbQueueConsumerTask.java | 7 +- .../TbRuleEngineConsumerContext.java | 25 - .../TbRuleEngineQueueConsumerManager.java | 290 ++---------- .../TbRuleEngineQueueConsumerManagerTest.java | 60 ++- .../server/common/data/queue/Queue.java | 2 +- .../server/common/data/queue/QueueConfig.java | 24 + .../provider/KafkaMonolithQueueFactory.java | 4 +- .../provider/KafkaTbCoreQueueFactory.java | 7 +- .../common/util/ThingsBoardThreadFactory.java | 5 + 15 files changed, 807 insertions(+), 650 deletions(-) create mode 100644 application/src/main/java/org/thingsboard/server/service/queue/consumer/BasicQueueConsumerManager.java create mode 100644 application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java create mode 100644 common/data/src/main/java/org/thingsboard/server/common/data/queue/QueueConfig.java diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java index 836c35aa85..c0ccaea9d0 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java @@ -18,12 +18,12 @@ package org.thingsboard.server.service.queue; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; +import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @@ -40,6 +40,7 @@ import org.thingsboard.server.common.data.id.NotificationRequestId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTrigger; +import org.thingsboard.server.common.data.queue.QueueConfig; import org.thingsboard.server.common.data.rpc.RpcError; import org.thingsboard.server.common.msg.MsgType; import org.thingsboard.server.common.msg.TbActorMsg; @@ -75,9 +76,9 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportToDeviceAct import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.PartitionService; +import org.thingsboard.server.queue.discovery.QueueKey; import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent; import org.thingsboard.server.queue.provider.TbCoreQueueFactory; -import org.thingsboard.server.queue.util.AfterStartUp; import org.thingsboard.server.queue.util.DataDecodingEncodingService; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.apiusage.TbApiUsageStateService; @@ -86,6 +87,8 @@ import org.thingsboard.server.service.notification.NotificationSchedulerService; import org.thingsboard.server.service.ota.OtaPackageStateService; import org.thingsboard.server.service.profile.TbAssetProfileCache; import org.thingsboard.server.service.profile.TbDeviceProfileCache; +import org.thingsboard.server.service.queue.consumer.BasicQueueConsumerManager; +import org.thingsboard.server.service.queue.consumer.QueueConsumerManager; import org.thingsboard.server.service.queue.processing.AbstractConsumerService; import org.thingsboard.server.service.queue.processing.IdMsgPair; import org.thingsboard.server.service.resource.TbImageService; @@ -108,7 +111,6 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; @@ -121,7 +123,7 @@ import java.util.stream.Collectors; public class DefaultTbCoreConsumerService extends AbstractConsumerService implements TbCoreConsumerService { @Value("${queue.core.poll-interval}") - private long pollDuration; + private long pollInterval; @Value("${queue.core.pack-processing-timeout}") private long packProcessingTimeout; @Value("${queue.core.stats.enabled:false}") @@ -132,7 +134,6 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService> mainConsumer; private final DeviceStateService stateService; private final TbApiUsageStateService statsService; private final TbLocalSubscriptionService localSubscriptionService; @@ -143,14 +144,14 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService> usageStatsConsumer; - private final TbQueueConsumer> firmwareStatesConsumer; + private final TbCoreQueueFactory queueFactory; private final TbImageService imageService; + private final TbCoreConsumerStats stats; + + private QueueConsumerManager, CoreQueueConfig> mainConsumer; + private BasicQueueConsumerManager> usageStatsConsumer; + private BasicQueueConsumerManager> firmwareStatesConsumer; - protected volatile ExecutorService consumersExecutor; - protected volatile ExecutorService usageStatsExecutor; - private volatile ExecutorService firmwareStatesExecutor; private volatile ListeningExecutorService deviceActivityEventsExecutor; public DefaultTbCoreConsumerService(TbCoreQueueFactory tbCoreQueueFactory, @@ -175,10 +176,7 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService, CoreQueueConfig>builder() + .queueKey(new QueueKey(ServiceType.TB_CORE)) + .config(CoreQueueConfig.of(true, (int) pollInterval)) + .msgPackProcessor(this::processMsgs) + .consumerCreator(config -> queueFactory.createToCoreMsgConsumer()) + .consumerExecutor(consumersExecutor) + .scheduler(scheduler) + .taskExecutor(mgmtExecutor) + .build(); + this.usageStatsConsumer = BasicQueueConsumerManager.>builder() + .key("usage-stats") + .name("TB Usage Stats") + .pollInterval(pollInterval) + .msgPackProcessor(this::processUsageStatsMsg) + .consumerCreator(queueFactory::createToUsageStatsServiceMsgConsumer) + .consumerExecutor(consumersExecutor) + .build(); + this.firmwareStatesConsumer = BasicQueueConsumerManager.>builder() + .key("firmware") + .name("TB Ota Package States") + .pollInterval(pollInterval) + .msgPackProcessor(this::processFirmwareMsgs) + .consumerCreator(queueFactory::createToOtaPackageStateServiceMsgConsumer) + .consumerExecutor(consumersExecutor) + .build(); } @PreDestroy public void destroy() { super.destroy(); - if (consumersExecutor != null) { - consumersExecutor.shutdownNow(); - } - if (usageStatsExecutor != null) { - usageStatsExecutor.shutdownNow(); - } - if (firmwareStatesExecutor != null) { - firmwareStatesExecutor.shutdownNow(); - } if (deviceActivityEventsExecutor != null) { deviceActivityEventsExecutor.shutdownNow(); } } - @AfterStartUp(order = AfterStartUp.REGULAR_SERVICE) - public void onApplicationEvent(ApplicationReadyEvent event) { - super.onApplicationEvent(event); - launchUsageStatsConsumer(); - launchOtaPackageUpdateNotificationConsumer(); + @Override + protected void startConsumers() { + super.startConsumers(); + firmwareStatesConsumer.subscribe(); + firmwareStatesConsumer.launch(); + usageStatsConsumer.launch(); } @Override protected void onTbApplicationEvent(PartitionChangeEvent event) { log.info("Subscribing to partitions: {}", event.getPartitions()); - this.mainConsumer.subscribe(event.getPartitions()); - this.usageStatsConsumer.subscribe( - event - .getPartitions() - .stream() - .map(tpi -> tpi.newByTopic(usageStatsConsumer.getTopic())) - .collect(Collectors.toSet())); - this.firmwareStatesConsumer.subscribe(); + mainConsumer.update(event.getPartitions()); + usageStatsConsumer.subscribe(event.getPartitions() + .stream() + .map(tpi -> tpi.newByTopic(usageStatsConsumer.getConsumer().getTopic())) + .collect(Collectors.toSet())); } - @Override - protected void launchMainConsumers() { - consumersExecutor.submit(() -> { - while (!stopped) { + private void processMsgs(List> msgs, TbQueueConsumer> consumer, CoreQueueConfig config) throws Exception { + List> orderedMsgList = msgs.stream().map(msg -> new IdMsgPair<>(UUID.randomUUID(), msg)).collect(Collectors.toList()); + ConcurrentMap> pendingMap = orderedMsgList.stream().collect( + Collectors.toConcurrentMap(IdMsgPair::getUuid, IdMsgPair::getMsg)); + CountDownLatch processingTimeoutLatch = new CountDownLatch(1); + TbPackProcessingContext> ctx = new TbPackProcessingContext<>( + processingTimeoutLatch, pendingMap, new ConcurrentHashMap<>()); + PendingMsgHolder pendingMsgHolder = new PendingMsgHolder(); + Future packSubmitFuture = consumersExecutor.submit(() -> { + orderedMsgList.forEach((element) -> { + UUID id = element.getUuid(); + TbProtoQueueMsg msg = element.getMsg(); + log.trace("[{}] Creating main callback for message: {}", id, msg.getValue()); + TbCallback callback = new TbPackCallback<>(id, ctx); try { - List> msgs = mainConsumer.poll(pollDuration); - if (msgs.isEmpty()) { - continue; - } - List> orderedMsgList = msgs.stream().map(msg -> new IdMsgPair<>(UUID.randomUUID(), msg)).collect(Collectors.toList()); - ConcurrentMap> pendingMap = orderedMsgList.stream().collect( - Collectors.toConcurrentMap(IdMsgPair::getUuid, IdMsgPair::getMsg)); - CountDownLatch processingTimeoutLatch = new CountDownLatch(1); - TbPackProcessingContext> ctx = new TbPackProcessingContext<>( - processingTimeoutLatch, pendingMap, new ConcurrentHashMap<>()); - PendingMsgHolder pendingMsgHolder = new PendingMsgHolder(); - Future packSubmitFuture = consumersExecutor.submit(() -> { - orderedMsgList.forEach((element) -> { - UUID id = element.getUuid(); - TbProtoQueueMsg msg = element.getMsg(); - log.trace("[{}] Creating main callback for message: {}", id, msg.getValue()); - TbCallback callback = new TbPackCallback<>(id, ctx); - try { - ToCoreMsg toCoreMsg = msg.getValue(); - pendingMsgHolder.setToCoreMsg(toCoreMsg); - if (toCoreMsg.hasToSubscriptionMgrMsg()) { - log.trace("[{}] Forwarding message to subscription manager service {}", id, toCoreMsg.getToSubscriptionMgrMsg()); - forwardToSubMgrService(toCoreMsg.getToSubscriptionMgrMsg(), callback); - } else if (toCoreMsg.hasToDeviceActorMsg()) { - log.trace("[{}] Forwarding message to device actor {}", id, toCoreMsg.getToDeviceActorMsg()); - forwardToDeviceActor(toCoreMsg.getToDeviceActorMsg(), callback); - } else if (toCoreMsg.hasDeviceStateServiceMsg()) { - log.trace("[{}] Forwarding message to device state service {}", id, toCoreMsg.getDeviceStateServiceMsg()); - forwardToStateService(toCoreMsg.getDeviceStateServiceMsg(), callback); - } else if (toCoreMsg.hasEdgeNotificationMsg()) { - log.trace("[{}] Forwarding message to edge service {}", id, toCoreMsg.getEdgeNotificationMsg()); - forwardToEdgeNotificationService(toCoreMsg.getEdgeNotificationMsg(), callback); - } else if (toCoreMsg.hasDeviceConnectMsg()) { - log.trace("[{}] Forwarding message to device state service {}", id, toCoreMsg.getDeviceConnectMsg()); - forwardToStateService(toCoreMsg.getDeviceConnectMsg(), callback); - } else if (toCoreMsg.hasDeviceActivityMsg()) { - log.trace("[{}] Forwarding message to device state service {}", id, toCoreMsg.getDeviceActivityMsg()); - forwardToStateService(toCoreMsg.getDeviceActivityMsg(), callback); - } else if (toCoreMsg.hasDeviceDisconnectMsg()) { - log.trace("[{}] Forwarding message to device state service {}", id, toCoreMsg.getDeviceDisconnectMsg()); - forwardToStateService(toCoreMsg.getDeviceDisconnectMsg(), callback); - } else if (toCoreMsg.hasDeviceInactivityMsg()) { - log.trace("[{}] Forwarding message to device state service {}", id, toCoreMsg.getDeviceInactivityMsg()); - forwardToStateService(toCoreMsg.getDeviceInactivityMsg(), callback); - } else if (toCoreMsg.hasToDeviceActorNotification()) { - TbActorMsg actorMsg = ProtoUtils.fromProto(toCoreMsg.getToDeviceActorNotification()); - if (actorMsg != null) { - if (actorMsg.getMsgType().equals(MsgType.DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG)) { - tbCoreDeviceRpcService.forwardRpcRequestToDeviceActor((ToDeviceRpcRequestActorMsg) actorMsg); - } else { - log.trace("[{}] Forwarding message to App Actor {}", id, actorMsg); - actorContext.tell(actorMsg); - } - } - callback.onSuccess(); - } else if (!toCoreMsg.getToDeviceActorNotificationMsg().isEmpty()) { - // will be removed in 3.6.1 in favour of hasToDeviceActorNotification() - Optional actorMsg = encodingService.decode(toCoreMsg.getToDeviceActorNotificationMsg().toByteArray()); - if (actorMsg.isPresent()) { - TbActorMsg tbActorMsg = actorMsg.get(); - if (tbActorMsg.getMsgType().equals(MsgType.DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG)) { - tbCoreDeviceRpcService.forwardRpcRequestToDeviceActor((ToDeviceRpcRequestActorMsg) tbActorMsg); - } else { - log.trace("[{}] Forwarding message to App Actor {}", id, actorMsg.get()); - actorContext.tell(actorMsg.get()); - } - } - callback.onSuccess(); - } else if (toCoreMsg.hasNotificationSchedulerServiceMsg()) { - TransportProtos.NotificationSchedulerServiceMsg notificationSchedulerServiceMsg = toCoreMsg.getNotificationSchedulerServiceMsg(); - log.trace("[{}] Forwarding message to notification scheduler service {}", id, toCoreMsg.getNotificationSchedulerServiceMsg()); - forwardToNotificationSchedulerService(notificationSchedulerServiceMsg, callback); - } else if (toCoreMsg.hasErrorEventMsg()) { - forwardToEventService(toCoreMsg.getErrorEventMsg(), callback); - } else if (toCoreMsg.hasLifecycleEventMsg()) { - forwardToEventService(toCoreMsg.getLifecycleEventMsg(), callback); - } - } catch (Throwable e) { - log.warn("[{}] Failed to process message: {}", id, msg, e); - callback.onFailure(e); + ToCoreMsg toCoreMsg = msg.getValue(); + pendingMsgHolder.setToCoreMsg(toCoreMsg); + if (toCoreMsg.hasToSubscriptionMgrMsg()) { + log.trace("[{}] Forwarding message to subscription manager service {}", id, toCoreMsg.getToSubscriptionMgrMsg()); + forwardToSubMgrService(toCoreMsg.getToSubscriptionMgrMsg(), callback); + } else if (toCoreMsg.hasToDeviceActorMsg()) { + log.trace("[{}] Forwarding message to device actor {}", id, toCoreMsg.getToDeviceActorMsg()); + forwardToDeviceActor(toCoreMsg.getToDeviceActorMsg(), callback); + } else if (toCoreMsg.hasDeviceStateServiceMsg()) { + log.trace("[{}] Forwarding message to device state service {}", id, toCoreMsg.getDeviceStateServiceMsg()); + forwardToStateService(toCoreMsg.getDeviceStateServiceMsg(), callback); + } else if (toCoreMsg.hasEdgeNotificationMsg()) { + log.trace("[{}] Forwarding message to edge service {}", id, toCoreMsg.getEdgeNotificationMsg()); + forwardToEdgeNotificationService(toCoreMsg.getEdgeNotificationMsg(), callback); + } else if (toCoreMsg.hasDeviceConnectMsg()) { + log.trace("[{}] Forwarding message to device state service {}", id, toCoreMsg.getDeviceConnectMsg()); + forwardToStateService(toCoreMsg.getDeviceConnectMsg(), callback); + } else if (toCoreMsg.hasDeviceActivityMsg()) { + log.trace("[{}] Forwarding message to device state service {}", id, toCoreMsg.getDeviceActivityMsg()); + forwardToStateService(toCoreMsg.getDeviceActivityMsg(), callback); + } else if (toCoreMsg.hasDeviceDisconnectMsg()) { + log.trace("[{}] Forwarding message to device state service {}", id, toCoreMsg.getDeviceDisconnectMsg()); + forwardToStateService(toCoreMsg.getDeviceDisconnectMsg(), callback); + } else if (toCoreMsg.hasDeviceInactivityMsg()) { + log.trace("[{}] Forwarding message to device state service {}", id, toCoreMsg.getDeviceInactivityMsg()); + forwardToStateService(toCoreMsg.getDeviceInactivityMsg(), callback); + } else if (toCoreMsg.hasToDeviceActorNotification()) { + TbActorMsg actorMsg = ProtoUtils.fromProto(toCoreMsg.getToDeviceActorNotification()); + if (actorMsg != null) { + if (actorMsg.getMsgType().equals(MsgType.DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG)) { + tbCoreDeviceRpcService.forwardRpcRequestToDeviceActor((ToDeviceRpcRequestActorMsg) actorMsg); + } else { + log.trace("[{}] Forwarding message to App Actor {}", id, actorMsg); + actorContext.tell(actorMsg); } - }); - }); - if (!processingTimeoutLatch.await(packProcessingTimeout, TimeUnit.MILLISECONDS)) { - if (!packSubmitFuture.isDone()) { - packSubmitFuture.cancel(true); - ToCoreMsg lastSubmitMsg = pendingMsgHolder.getToCoreMsg(); - log.info("Timeout to process message: {}", lastSubmitMsg); } - ctx.getAckMap().forEach((id, msg) -> log.debug("[{}] Timeout to process message: {}", id, msg.getValue())); - ctx.getFailedMap().forEach((id, msg) -> log.warn("[{}] Failed to process message: {}", id, msg.getValue())); - } - mainConsumer.commit(); - } catch (Exception e) { - if (!stopped) { - log.warn("Failed to obtain messages from queue.", e); - try { - Thread.sleep(pollDuration); - } catch (InterruptedException e2) { - log.trace("Failed to wait until the server has capacity to handle new requests", e2); + callback.onSuccess(); + } else if (!toCoreMsg.getToDeviceActorNotificationMsg().isEmpty()) { + // will be removed in 3.6.1 in favour of hasToDeviceActorNotification() + Optional actorMsg = encodingService.decode(toCoreMsg.getToDeviceActorNotificationMsg().toByteArray()); + if (actorMsg.isPresent()) { + TbActorMsg tbActorMsg = actorMsg.get(); + if (tbActorMsg.getMsgType().equals(MsgType.DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG)) { + tbCoreDeviceRpcService.forwardRpcRequestToDeviceActor((ToDeviceRpcRequestActorMsg) tbActorMsg); + } else { + log.trace("[{}] Forwarding message to App Actor {}", id, actorMsg.get()); + actorContext.tell(actorMsg.get()); + } } + callback.onSuccess(); + } else if (toCoreMsg.hasNotificationSchedulerServiceMsg()) { + TransportProtos.NotificationSchedulerServiceMsg notificationSchedulerServiceMsg = toCoreMsg.getNotificationSchedulerServiceMsg(); + log.trace("[{}] Forwarding message to notification scheduler service {}", id, toCoreMsg.getNotificationSchedulerServiceMsg()); + forwardToNotificationSchedulerService(notificationSchedulerServiceMsg, callback); + } else if (toCoreMsg.hasErrorEventMsg()) { + forwardToEventService(toCoreMsg.getErrorEventMsg(), callback); + } else if (toCoreMsg.hasLifecycleEventMsg()) { + forwardToEventService(toCoreMsg.getLifecycleEventMsg(), callback); } + } catch (Throwable e) { + log.warn("[{}] Failed to process message: {}", id, msg, e); + callback.onFailure(e); } - } - log.info("TB Core Consumer stopped."); + }); }); + if (!processingTimeoutLatch.await(packProcessingTimeout, TimeUnit.MILLISECONDS)) { + if (!packSubmitFuture.isDone()) { + packSubmitFuture.cancel(true); + ToCoreMsg lastSubmitMsg = pendingMsgHolder.getToCoreMsg(); + log.info("Timeout to process message: {}", lastSubmitMsg); + } + ctx.getAckMap().forEach((id, msg) -> log.debug("[{}] Timeout to process message: {}", id, msg.getValue())); + ctx.getFailedMap().forEach((id, msg) -> log.warn("[{}] Failed to process message: {}", id, msg.getValue())); + } + consumer.commit(); } private static class PendingMsgHolder { @@ -365,7 +355,7 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService> createNotificationsConsumer() { + return queueFactory.createToCoreNotificationsMsgConsumer(); + } + @Override protected void handleNotification(UUID id, TbProtoQueueMsg msg, TbCallback callback) { ToCoreNotificationMsg toCoreNotification = msg.getValue(); @@ -430,92 +430,53 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService { - while (!stopped) { - try { - List> msgs = usageStatsConsumer.poll(getNotificationPollDuration()); - if (msgs.isEmpty()) { - continue; - } - ConcurrentMap> pendingMap = msgs.stream().collect( - Collectors.toConcurrentMap(s -> UUID.randomUUID(), Function.identity())); - CountDownLatch processingTimeoutLatch = new CountDownLatch(1); - TbPackProcessingContext> ctx = new TbPackProcessingContext<>( - processingTimeoutLatch, pendingMap, new ConcurrentHashMap<>()); - pendingMap.forEach((id, msg) -> { - log.trace("[{}] Creating usage stats callback for message: {}", id, msg.getValue()); - TbCallback callback = new TbPackCallback<>(id, ctx); - try { - handleUsageStats(msg, callback); - } catch (Throwable e) { - log.warn("[{}] Failed to process usage stats: {}", id, msg, e); - callback.onFailure(e); - } - }); - if (!processingTimeoutLatch.await(getNotificationPackProcessingTimeout(), TimeUnit.MILLISECONDS)) { - ctx.getAckMap().forEach((id, msg) -> log.warn("[{}] Timeout to process usage stats: {}", id, msg.getValue())); - ctx.getFailedMap().forEach((id, msg) -> log.warn("[{}] Failed to process usage stats: {}", id, msg.getValue())); - } - usageStatsConsumer.commit(); - } catch (Exception e) { - if (!stopped) { - log.warn("Failed to obtain usage stats from queue.", e); - try { - Thread.sleep(getNotificationPollDuration()); - } catch (InterruptedException e2) { - log.trace("Failed to wait until the server has capacity to handle new usage stats", e2); - } - } - } + private void processUsageStatsMsg(List> msgs, TbQueueConsumer> consumer) throws Exception { + ConcurrentMap> pendingMap = msgs.stream().collect( + Collectors.toConcurrentMap(s -> UUID.randomUUID(), Function.identity())); + CountDownLatch processingTimeoutLatch = new CountDownLatch(1); + TbPackProcessingContext> ctx = new TbPackProcessingContext<>( + processingTimeoutLatch, pendingMap, new ConcurrentHashMap<>()); + pendingMap.forEach((id, msg) -> { + log.trace("[{}] Creating usage stats callback for message: {}", id, msg.getValue()); + TbCallback callback = new TbPackCallback<>(id, ctx); + try { + handleUsageStats(msg, callback); + } catch (Throwable e) { + log.warn("[{}] Failed to process usage stats: {}", id, msg, e); + callback.onFailure(e); } - log.info("TB Usage Stats Consumer stopped."); }); + if (!processingTimeoutLatch.await(getNotificationPackProcessingTimeout(), TimeUnit.MILLISECONDS)) { + ctx.getAckMap().forEach((id, msg) -> log.warn("[{}] Timeout to process usage stats: {}", id, msg.getValue())); + ctx.getFailedMap().forEach((id, msg) -> log.warn("[{}] Failed to process usage stats: {}", id, msg.getValue())); + } + consumer.commit(); + } - private void launchOtaPackageUpdateNotificationConsumer() { + private void processFirmwareMsgs(List> msgs, TbQueueConsumer> consumer) { long maxProcessingTimeoutPerRecord = firmwarePackInterval / firmwarePackSize; - firmwareStatesExecutor.submit(() -> { - while (!stopped) { - try { - List> msgs = firmwareStatesConsumer.poll(getNotificationPollDuration()); - if (msgs.isEmpty()) { - continue; - } - long timeToSleep = maxProcessingTimeoutPerRecord; - for (TbProtoQueueMsg msg : msgs) { - try { - long startTime = System.currentTimeMillis(); - boolean isSuccessUpdate = handleOtaPackageUpdates(msg); - long endTime = System.currentTimeMillis(); - long spentTime = endTime - startTime; - timeToSleep = timeToSleep - spentTime; - if (isSuccessUpdate) { - if (timeToSleep > 0) { - log.debug("Spent time per record is: [{}]!", spentTime); - Thread.sleep(timeToSleep); - timeToSleep = 0; - } - timeToSleep += maxProcessingTimeoutPerRecord; - } - } catch (Throwable e) { - log.warn("Failed to process firmware update msg: {}", msg, e); - } - } - firmwareStatesConsumer.commit(); - } catch (Exception e) { - if (!stopped) { - log.warn("Failed to obtain usage stats from queue.", e); - try { - Thread.sleep(getNotificationPollDuration()); - } catch (InterruptedException e2) { - log.trace("Failed to wait until the server has capacity to handle new firmware updates", e2); - } + long timeToSleep = maxProcessingTimeoutPerRecord; + for (TbProtoQueueMsg msg : msgs) { + try { + long startTime = System.currentTimeMillis(); + boolean isSuccessUpdate = handleOtaPackageUpdates(msg); + long endTime = System.currentTimeMillis(); + long spentTime = endTime - startTime; + timeToSleep = timeToSleep - spentTime; + if (isSuccessUpdate) { + if (timeToSleep > 0) { + log.debug("Spent time per record is: [{}]!", spentTime); + Thread.sleep(timeToSleep); + timeToSleep = 0; } + timeToSleep += maxProcessingTimeoutPerRecord; } + } catch (Throwable e) { + log.warn("Failed to process firmware update msg: {}", msg, e); } - log.info("TB Ota Package States Consumer stopped."); - }); + } + consumer.commit(); } private void handleUsageStats(TbProtoQueueMsg msg, TbCallback callback) { @@ -803,15 +764,16 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService consumers = new ConcurrentHashMap<>(); public DefaultTbRuleEngineConsumerService(TbRuleEngineConsumerContext ctx, - TbRuleEngineQueueFactory tbRuleEngineQueueFactory, ActorSystemContext actorContext, DataDecodingEncodingService encodingService, TbRuleEngineDeviceRpcService tbDeviceRpcService, @@ -89,8 +86,7 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService< PartitionService partitionService, ApplicationEventPublisher eventPublisher, JwtSettingsService jwtSettingsService) { - super(actorContext, encodingService, tenantProfileCache, deviceProfileCache, assetProfileCache, apiUsageStateService, partitionService, - eventPublisher, tbRuleEngineQueueFactory.createToRuleEngineNotificationsMsgConsumer(), jwtSettingsService); + super(actorContext, encodingService, tenantProfileCache, deviceProfileCache, assetProfileCache, apiUsageStateService, partitionService, eventPublisher, jwtSettingsService); this.ctx = ctx; this.tbDeviceRpcService = tbDeviceRpcService; this.queueService = queueService; @@ -98,7 +94,7 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService< @PostConstruct public void init() { - super.init("tb-rule-engine-notifications-consumer"); + super.init("tb-rule-engine"); List queues = queueService.findAllQueues(); for (Queue configuration : queues) { if (partitionService.isManagedByCurrentService(configuration.getTenantId())) { @@ -130,20 +126,11 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService< }); } - @AfterStartUp(order = AfterStartUp.REGULAR_SERVICE) - public void onApplicationEvent(ApplicationReadyEvent event) { - super.onApplicationEvent(event); - ctx.setReady(true); - } - - @Override - protected void launchMainConsumers() {} - @Override protected void stopConsumers() { + super.stopConsumers(); consumers.values().forEach(TbRuleEngineQueueConsumerManager::stop); consumers.values().forEach(TbRuleEngineQueueConsumerManager::awaitStop); - ctx.stop(); } @Override @@ -161,6 +148,16 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService< return ctx.getPackProcessingTimeout(); } + @Override + protected int getMgmtThreadPoolSize() { + return ctx.getMgmtThreadPoolSize(); + } + + @Override + protected TbQueueConsumer> createNotificationsConsumer() { + return ctx.getQueueFactory().createToRuleEngineNotificationsMsgConsumer(); + } + @Override protected void handleNotification(UUID id, TbProtoQueueMsg msg, TbCallback callback) throws Exception { ToRuleEngineNotificationMsg nfMsg = msg.getValue(); @@ -237,7 +234,13 @@ public class DefaultTbRuleEngineConsumerService extends AbstractConsumerService< } private TbRuleEngineQueueConsumerManager createConsumer(QueueKey queueKey, Queue queue) { - var consumer = new TbRuleEngineQueueConsumerManager(ctx, queueKey); + var consumer = TbRuleEngineQueueConsumerManager.create() + .ctx(ctx) + .queueKey(queueKey) + .consumerExecutor(consumersExecutor) + .scheduler(scheduler) + .taskExecutor(mgmtExecutor) + .build(); consumers.put(queueKey, consumer); consumer.init(queue); return consumer; diff --git a/application/src/main/java/org/thingsboard/server/service/queue/consumer/BasicQueueConsumerManager.java b/application/src/main/java/org/thingsboard/server/service/queue/consumer/BasicQueueConsumerManager.java new file mode 100644 index 0000000000..1d3773e3a1 --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/queue/consumer/BasicQueueConsumerManager.java @@ -0,0 +1,109 @@ +/** + * Copyright © 2016-2024 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.queue.consumer; + +import lombok.Builder; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.thingsboard.common.util.ThingsBoardThreadFactory; +import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; +import org.thingsboard.server.queue.TbQueueConsumer; +import org.thingsboard.server.queue.TbQueueMsg; + +import java.util.List; +import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.function.Supplier; + +@Slf4j +public class BasicQueueConsumerManager { + + private final String key; + private final String name; + private final long pollInterval; + private final MsgPackProcessor msgPackProcessor; + private final ExecutorService consumerExecutor; + + @Getter + private final TbQueueConsumer consumer; + private volatile boolean stopped; + + @Builder + public BasicQueueConsumerManager(String key, String name, + long pollInterval, + MsgPackProcessor msgPackProcessor, + Supplier> consumerCreator, + ExecutorService consumerExecutor) { + this.key = key; + this.name = name; + this.pollInterval = pollInterval; + this.msgPackProcessor = msgPackProcessor; + this.consumerExecutor = consumerExecutor; + this.consumer = consumerCreator.get(); + } + + public void subscribe() { + consumer.subscribe(); + } + + public void subscribe(Set partitions) { + consumer.subscribe(partitions); + } + + public void launch() { + log.info("[{}] Launching consumer", name); + consumerExecutor.submit(() -> { + ThingsBoardThreadFactory.addThreadNamePrefix(key); + try { + consumerLoop(consumer); + } catch (Throwable e) { + log.error("Failure in consumer loop", e); + } + }); + } + + private void consumerLoop(TbQueueConsumer consumer) { + while (!stopped && !consumer.isStopped()) { + try { + List msgs = consumer.poll(pollInterval); + if (msgs.isEmpty()) { + continue; + } + msgPackProcessor.process(msgs, consumer); + } catch (Exception e) { + if (!consumer.isStopped()) { + log.warn("Failed to process messages from queue", e); + try { + Thread.sleep(pollInterval); + } catch (InterruptedException interruptedException) { + log.trace("Failed to wait until the server has capacity to handle new requests", interruptedException); + } + } + } + } + log.info("{} Consumer stopped", name); + } + + public void stop() { + log.debug("[{}] Stopping consumer", name); + stopped = true; + consumer.unsubscribe(); + } + + public interface MsgPackProcessor { + void process(List msgs, TbQueueConsumer consumer) throws Exception; + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java b/application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java new file mode 100644 index 0000000000..04538289ea --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java @@ -0,0 +1,321 @@ +/** + * Copyright © 2016-2024 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.queue.consumer; + +import lombok.Builder; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.thingsboard.common.util.ThingsBoardThreadFactory; +import org.thingsboard.server.common.data.queue.QueueConfig; +import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; +import org.thingsboard.server.queue.TbQueueConsumer; +import org.thingsboard.server.queue.TbQueueMsg; +import org.thingsboard.server.queue.discovery.QueueKey; +import org.thingsboard.server.service.queue.ruleengine.QueueEvent; +import org.thingsboard.server.service.queue.ruleengine.TbQueueConsumerManagerTask; +import org.thingsboard.server.service.queue.ruleengine.TbQueueConsumerTask; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Slf4j +public class QueueConsumerManager { + + protected final QueueKey queueKey; + @Getter + protected C config; + protected final MsgPackProcessor msgPackProcessor; + protected final Function> consumerCreator; + protected final ExecutorService consumerExecutor; + protected final ScheduledExecutorService scheduler; + protected final ExecutorService taskExecutor; + + private final java.util.Queue tasks = new ConcurrentLinkedQueue<>(); + private final ReentrantLock lock = new ReentrantLock(); + + @Getter + private volatile Set partitions; + protected volatile ConsumerWrapper consumerWrapper; + protected volatile boolean stopped; + + @Builder + public QueueConsumerManager(QueueKey queueKey, + C config, + MsgPackProcessor msgPackProcessor, + Function> consumerCreator, + ExecutorService consumerExecutor, + ScheduledExecutorService scheduler, + ExecutorService taskExecutor) { + this.queueKey = queueKey; + this.config = config; + this.msgPackProcessor = msgPackProcessor; + this.consumerCreator = consumerCreator; + this.consumerExecutor = consumerExecutor; + this.scheduler = scheduler; + this.taskExecutor = taskExecutor; + if (config != null) { + init(config); + } + } + + public void init(C config) { + this.config = config; + if (config.isConsumerPerPartition()) { + this.consumerWrapper = new ConsumerPerPartitionWrapper(); + } else { + this.consumerWrapper = new SingleConsumerWrapper(); + } + log.debug("[{}] Initialized consumer for queue: {}", queueKey, config); + } + + public void update(C config) { + addTask(TbQueueConsumerManagerTask.configUpdate(config)); + } + + public void update(Set partitions) { + addTask(TbQueueConsumerManagerTask.partitionChange(partitions)); + } + + protected void addTask(TbQueueConsumerManagerTask todo) { + if (stopped) { + return; + } + tasks.add(todo); + log.trace("[{}] Added task: {}", queueKey, todo); + tryProcessTasks(); + } + + private void tryProcessTasks() { + taskExecutor.submit(() -> { + if (lock.tryLock()) { + try { + C newConfig = null; + Set newPartitions = null; + while (!stopped) { + TbQueueConsumerManagerTask task = tasks.poll(); + if (task == null) { + break; + } + log.trace("[{}] Processing task: {}", queueKey, task); + + if (task.getEvent() == QueueEvent.PARTITION_CHANGE) { + newPartitions = task.getPartitions(); + } else if (task.getEvent() == QueueEvent.CONFIG_UPDATE) { + newConfig = (C) task.getConfig(); + } else { + processTask(task); + } + } + if (stopped) { + return; + } + if (newConfig != null) { + doUpdate(newConfig); + } + if (newPartitions != null) { + doUpdate(newPartitions); + } + } catch (Exception e) { + log.error("[{}] Failed to process tasks", queueKey, e); + } finally { + lock.unlock(); + } + } else { + log.trace("[{}] Failed to acquire lock", queueKey); + scheduler.schedule(this::tryProcessTasks, 1, TimeUnit.SECONDS); + } + }); + } + + protected void processTask(TbQueueConsumerManagerTask task) { + } + + private void doUpdate(C newConfig) { + log.info("[{}] Processing queue update: {}", queueKey, newConfig); + var oldConfig = this.config; + this.config = newConfig; + if (log.isTraceEnabled()) { + log.trace("[{}] Old queue configuration: {}", queueKey, oldConfig); + log.trace("[{}] New queue configuration: {}", queueKey, newConfig); + } + + if (oldConfig == null) { + init(config); + } else if (newConfig.isConsumerPerPartition() != oldConfig.isConsumerPerPartition()) { + consumerWrapper.getConsumers().forEach(TbQueueConsumerTask::initiateStop); + consumerWrapper.getConsumers().forEach(TbQueueConsumerTask::awaitCompletion); + + init(config); + if (partitions != null) { + doUpdate(partitions); // even if partitions number was changed, there can be no partition change event + } + } else { + // do nothing, because partitions change (if they changed) will be handled on PartitionChangeEvent, + // and changes to pollInterval/packProcessingTimeout/submitStrategy/processingStrategy will be picked up by consumer on the fly, + // and queue topic and name are immutable + } + } + + private void doUpdate(Set partitions) { + this.partitions = partitions; + consumerWrapper.updatePartitions(partitions); + } + + private void launchConsumer(TbQueueConsumerTask consumerTask) { + log.info("[{}] Launching consumer", consumerTask.getKey()); + Future consumerLoop = consumerExecutor.submit(() -> { + ThingsBoardThreadFactory.updateCurrentThreadName(consumerTask.getKey().toString()); + try { + consumerLoop(consumerTask.getConsumer()); + } catch (Throwable e) { + log.error("Failure in consumer loop", e); + } + }); + consumerTask.setTask(consumerLoop); + } + + private void consumerLoop(TbQueueConsumer consumer) { + while (!stopped && !consumer.isStopped()) { + try { + List msgs = consumer.poll(config.getPollInterval()); + if (msgs.isEmpty()) { + continue; + } + processMsgs(msgs, consumer, config); + } catch (Exception e) { + if (!consumer.isStopped()) { + log.warn("Failed to process messages from queue", e); + try { + Thread.sleep(config.getPollInterval()); + } catch (InterruptedException e2) { + log.trace("Failed to wait until the server has capacity to handle new requests", e2); + } + } + } + } + if (consumer.isStopped()) { + consumer.unsubscribe(); + } + log.info("{} Consumer stopped", queueKey); + } + + protected void processMsgs(List msgs, TbQueueConsumer consumer, C config) throws Exception { + msgPackProcessor.process(msgs, consumer, config); + } + + public void stop() { + log.debug("[{}] Stopping consumers", queueKey); + consumerWrapper.getConsumers().forEach(TbQueueConsumerTask::initiateStop); + stopped = true; + } + + public void awaitStop() { + consumerWrapper.getConsumers().forEach(TbQueueConsumerTask::awaitCompletion); + log.debug("[{}] Unsubscribed and stopped consumers", queueKey); + } + + private static String partitionsToString(Collection partitions) { + return partitions.stream().map(TopicPartitionInfo::getFullTopicName).collect(Collectors.joining(", ", "[", "]")); + } + + public interface MsgPackProcessor { + void process(List msgs, TbQueueConsumer consumer, C config) throws Exception; + } + + public interface ConsumerWrapper { + + void updatePartitions(Set partitions); + + Collection> getConsumers(); + + } + + class ConsumerPerPartitionWrapper implements ConsumerWrapper { + private final Map> consumers = new HashMap<>(); + + @Override + public void updatePartitions(Set partitions) { + Set addedPartitions = new HashSet<>(partitions); + addedPartitions.removeAll(consumers.keySet()); + + Set removedPartitions = new HashSet<>(consumers.keySet()); + removedPartitions.removeAll(partitions); + log.info("[{}] Added partitions: {}, removed partitions: {}", queueKey, partitionsToString(addedPartitions), partitionsToString(removedPartitions)); + + removedPartitions.forEach((tpi) -> consumers.get(tpi).initiateStop()); + removedPartitions.forEach((tpi) -> consumers.remove(tpi).awaitCompletion()); + + addedPartitions.forEach((tpi) -> { + String key = queueKey + "-" + tpi.getPartition().orElse(-999999); + TbQueueConsumerTask consumer = new TbQueueConsumerTask<>(key, consumerCreator.apply(config)); + consumers.put(tpi, consumer); + consumer.subscribe(Set.of(tpi)); + launchConsumer(consumer); + }); + } + + @Override + public Collection> getConsumers() { + return consumers.values(); + } + } + + class SingleConsumerWrapper implements ConsumerWrapper { + private TbQueueConsumerTask consumer; + + @Override + public void updatePartitions(Set partitions) { + log.info("[{}] New partitions: {}", queueKey, partitionsToString(partitions)); + if (partitions.isEmpty()) { + if (consumer != null && consumer.isRunning()) { + consumer.initiateStop(); + consumer.awaitCompletion(); + } + consumer = null; + return; + } + + if (consumer == null) { + consumer = new TbQueueConsumerTask<>(queueKey, consumerCreator.apply(config)); + } + consumer.subscribe(partitions); + if (!consumer.isRunning()) { + launchConsumer(consumer); + } + } + + @Override + public Collection> getConsumers() { + if (consumer == null) { + return Collections.emptyList(); + } + return List.of(consumer); + } + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java index 26e23549e3..e2a6a3f117 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java @@ -18,6 +18,7 @@ package org.thingsboard.server.service.queue.processing; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationEventPublisher; +import org.thingsboard.common.util.ThingsBoardExecutors; import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.actors.ActorSystemContext; import org.thingsboard.server.common.data.EntityType; @@ -45,6 +46,7 @@ import org.thingsboard.server.service.profile.TbAssetProfileCache; import org.thingsboard.server.service.profile.TbDeviceProfileCache; import org.thingsboard.server.service.queue.TbPackCallback; import org.thingsboard.server.service.queue.TbPackProcessingContext; +import org.thingsboard.server.service.queue.consumer.BasicQueueConsumerManager; import org.thingsboard.server.service.security.auth.jwt.settings.JwtSettingsService; import javax.annotation.PreDestroy; @@ -55,15 +57,13 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Slf4j public abstract class AbstractConsumerService extends TbApplicationEventListener { - protected volatile ExecutorService notificationsConsumerExecutor; - protected volatile boolean stopped = false; - protected volatile boolean isReady = false; protected final ActorSystemContext actorContext; protected final DataDecodingEncodingService encodingService; protected final TbTenantProfileCache tenantProfileCache; @@ -72,16 +72,19 @@ public abstract class AbstractConsumerService> nfConsumer; protected final JwtSettingsService jwtSettingsService; + protected BasicQueueConsumerManager> nfConsumer; + + protected ExecutorService consumersExecutor; + protected ExecutorService mgmtExecutor; + protected ScheduledExecutorService scheduler; public AbstractConsumerService(ActorSystemContext actorContext, DataDecodingEncodingService encodingService, TbTenantProfileCache tenantProfileCache, TbDeviceProfileCache deviceProfileCache, TbAssetProfileCache assetProfileCache, TbApiUsageStateService apiUsageStateService, PartitionService partitionService, ApplicationEventPublisher eventPublisher, - TbQueueConsumer> nfConsumer, JwtSettingsService jwtSettingsService) { + JwtSettingsService jwtSettingsService) { this.actorContext = actorContext; this.encodingService = encodingService; this.tenantProfileCache = tenantProfileCache; @@ -90,21 +93,32 @@ public abstract class AbstractConsumerService>builder() + .key("notifications") + .name("TB Notifications") + .pollInterval(getNotificationPollDuration()) + .msgPackProcessor(this::processNotifications) + .consumerCreator(this::createNotificationsConsumer) + .consumerExecutor(consumersExecutor) + .build(); } @AfterStartUp(order = AfterStartUp.REGULAR_SERVICE) public void onApplicationEvent(ApplicationReadyEvent event) { - log.info("Subscribing to notifications: {}", nfConsumer.getTopic()); - this.nfConsumer.subscribe(); - this.isReady = true; - launchNotificationsConsumer(); - launchMainConsumers(); + startConsumers(); + } + + protected void startConsumers() { + nfConsumer.subscribe(); + nfConsumer.launch(); } @Override @@ -114,58 +128,42 @@ public abstract class AbstractConsumerService { - while (!stopped) { - try { - List> msgs = nfConsumer.poll(getNotificationPollDuration()); - if (msgs.isEmpty()) { - continue; - } - List> orderedMsgList = msgs.stream().map(msg -> new IdMsgPair<>(UUID.randomUUID(), msg)).collect(Collectors.toList()); - ConcurrentMap> pendingMap = orderedMsgList.stream().collect( - Collectors.toConcurrentMap(IdMsgPair::getUuid, IdMsgPair::getMsg)); - CountDownLatch processingTimeoutLatch = new CountDownLatch(1); - TbPackProcessingContext> ctx = new TbPackProcessingContext<>( - processingTimeoutLatch, pendingMap, new ConcurrentHashMap<>()); - orderedMsgList.forEach(element -> { - UUID id = element.getUuid(); - TbProtoQueueMsg msg = element.getMsg(); - log.trace("[{}] Creating notification callback for message: {}", id, msg.getValue()); - TbCallback callback = new TbPackCallback<>(id, ctx); - try { - handleNotification(id, msg, callback); - } catch (Throwable e) { - log.warn("[{}] Failed to process notification: {}", id, msg, e); - callback.onFailure(e); - } - }); - if (!processingTimeoutLatch.await(getNotificationPackProcessingTimeout(), TimeUnit.MILLISECONDS)) { - ctx.getAckMap().forEach((id, msg) -> log.warn("[{}] Timeout to process notification: {}", id, msg.getValue())); - ctx.getFailedMap().forEach((id, msg) -> log.warn("[{}] Failed to process notification: {}", id, msg.getValue())); - } - nfConsumer.commit(); - } catch (Exception e) { - if (!stopped) { - log.warn("Failed to obtain notifications from queue.", e); - try { - Thread.sleep(getNotificationPollDuration()); - } catch (InterruptedException e2) { - log.trace("Failed to wait until the server has capacity to handle new notifications", e2); - } - } - } + protected abstract int getMgmtThreadPoolSize(); + + protected abstract TbQueueConsumer> createNotificationsConsumer(); + + protected void processNotifications(List> msgs, TbQueueConsumer> consumer) throws Exception { + List> orderedMsgList = msgs.stream().map(msg -> new IdMsgPair<>(UUID.randomUUID(), msg)).collect(Collectors.toList()); + ConcurrentMap> pendingMap = orderedMsgList.stream().collect( + Collectors.toConcurrentMap(IdMsgPair::getUuid, IdMsgPair::getMsg)); + CountDownLatch processingTimeoutLatch = new CountDownLatch(1); + TbPackProcessingContext> ctx = new TbPackProcessingContext<>( + processingTimeoutLatch, pendingMap, new ConcurrentHashMap<>()); + orderedMsgList.forEach(element -> { + UUID id = element.getUuid(); + TbProtoQueueMsg msg = element.getMsg(); + log.trace("[{}] Creating notification callback for message: {}", id, msg.getValue()); + TbCallback callback = new TbPackCallback<>(id, ctx); + try { + handleNotification(id, msg, callback); + } catch (Throwable e) { + log.warn("[{}] Failed to process notification: {}", id, msg, e); + callback.onFailure(e); } - log.info("TB Notifications Consumer stopped."); }); + if (!processingTimeoutLatch.await(getNotificationPackProcessingTimeout(), TimeUnit.MILLISECONDS)) { + ctx.getAckMap().forEach((id, msg) -> log.warn("[{}] Timeout to process notification: {}", id, msg.getValue())); + ctx.getFailedMap().forEach((id, msg) -> log.warn("[{}] Failed to process notification: {}", id, msg.getValue())); + } + consumer.commit(); } protected final void handleComponentLifecycleMsg(UUID id, ComponentLifecycleMsg componentLifecycleMsg) { @@ -219,13 +217,15 @@ public abstract class AbstractConsumerService partitions; private boolean drainQueue; @@ -37,8 +37,8 @@ public class TbQueueConsumerManagerTask { return new TbQueueConsumerManagerTask(QueueEvent.DELETE, null, null, drainQueue); } - public static TbQueueConsumerManagerTask configUpdate(Queue queue) { - return new TbQueueConsumerManagerTask(QueueEvent.CONFIG_UPDATE, queue, null, false); + public static TbQueueConsumerManagerTask configUpdate(QueueConfig config) { + return new TbQueueConsumerManagerTask(QueueEvent.CONFIG_UPDATE, config, null, false); } public static TbQueueConsumerManagerTask partitionChange(Set partitions) { diff --git a/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbQueueConsumerTask.java b/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbQueueConsumerTask.java index 0e25efd014..84539d4d7c 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbQueueConsumerTask.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbQueueConsumerTask.java @@ -20,9 +20,8 @@ import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; -import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.TbQueueConsumer; -import org.thingsboard.server.queue.common.TbProtoQueueMsg; +import org.thingsboard.server.queue.TbQueueMsg; import java.util.Set; import java.util.concurrent.Future; @@ -30,12 +29,12 @@ import java.util.concurrent.TimeUnit; @RequiredArgsConstructor @Slf4j -public class TbQueueConsumerTask { +public class TbQueueConsumerTask { @Getter private final Object key; @Getter - private final TbQueueConsumer> consumer; + private final TbQueueConsumer consumer; @Setter private Future task; diff --git a/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineConsumerContext.java b/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineConsumerContext.java index cf876c6947..08d2931246 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineConsumerContext.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineConsumerContext.java @@ -19,8 +19,6 @@ import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import org.thingsboard.common.util.ThingsBoardExecutors; -import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.actors.ActorSystemContext; import org.thingsboard.server.common.stats.StatsFactory; import org.thingsboard.server.queue.TbQueueAdmin; @@ -33,11 +31,6 @@ import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingStr import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategyFactory; import org.thingsboard.server.service.stats.RuleEngineStatisticsService; -import javax.annotation.PostConstruct; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; - @Component @TbRuleEngineComponent @Slf4j @@ -68,22 +61,4 @@ public class TbRuleEngineConsumerContext { private final TbQueueProducerProvider producerProvider; private final TbQueueAdmin queueAdmin; - private ExecutorService consumersExecutor; - private ExecutorService mgmtExecutor; - private ScheduledExecutorService scheduler; - - private volatile boolean isReady = false; - - @PostConstruct - void init() { - this.consumersExecutor = Executors.newCachedThreadPool(ThingsBoardThreadFactory.forName("tb-rule-engine-consumer")); - this.mgmtExecutor = ThingsBoardExecutors.newWorkStealingPool(mgmtThreadPoolSize, "tb-rule-engine-mgmt"); - this.scheduler = Executors.newSingleThreadScheduledExecutor(ThingsBoardThreadFactory.forName("tb-rule-engine-consumer-scheduler")); - } - - public void stop() { - scheduler.shutdownNow(); - consumersExecutor.shutdownNow(); - mgmtExecutor.shutdownNow(); - } } diff --git a/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManager.java b/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManager.java index 2da3dbc6dc..b93313b104 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManager.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManager.java @@ -16,9 +16,8 @@ package org.thingsboard.server.service.queue.ruleengine; import com.google.protobuf.ProtocolStringList; -import lombok.Getter; +import lombok.Builder; import lombok.extern.slf4j.Slf4j; -import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityIdFactory; import org.thingsboard.server.common.data.id.TenantId; @@ -38,171 +37,52 @@ import org.thingsboard.server.queue.discovery.QueueKey; import org.thingsboard.server.service.queue.TbMsgPackCallback; import org.thingsboard.server.service.queue.TbMsgPackProcessingContext; import org.thingsboard.server.service.queue.TbRuleEngineConsumerStats; +import org.thingsboard.server.service.queue.consumer.QueueConsumerManager; import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingDecision; import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingResult; import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingStrategy; import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategy; -import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.Future; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; @Slf4j -public class TbRuleEngineQueueConsumerManager { +public class TbRuleEngineQueueConsumerManager extends QueueConsumerManager, Queue> { public static final String SUCCESSFUL_STATUS = "successful"; public static final String FAILED_STATUS = "failed"; private final TbRuleEngineConsumerContext ctx; - private final QueueKey queueKey; private final TbRuleEngineConsumerStats stats; - private final ReentrantLock lock = new ReentrantLock(); //NonfairSync - @Getter - private volatile Queue queue; - @Getter - private volatile Set partitions; - private volatile ConsumerWrapper consumerWrapper; - - private volatile boolean stopped; - - private final java.util.Queue tasks = new ConcurrentLinkedQueue<>(); - - public TbRuleEngineQueueConsumerManager(TbRuleEngineConsumerContext ctx, QueueKey queueKey) { + @Builder(builderMethodName = "create") // not to conflict with super.builder() + public TbRuleEngineQueueConsumerManager(TbRuleEngineConsumerContext ctx, + QueueKey queueKey, + ExecutorService consumerExecutor, + ScheduledExecutorService scheduler, + ExecutorService taskExecutor) { + super(queueKey, null, null, ctx.getQueueFactory()::createToRuleEngineMsgConsumer, consumerExecutor, scheduler, taskExecutor); this.ctx = ctx; - this.queueKey = queueKey; this.stats = new TbRuleEngineConsumerStats(queueKey, ctx.getStatsFactory()); } - public void init(Queue queue) { - this.queue = queue; - if (queue.isConsumerPerPartition()) { - this.consumerWrapper = new ConsumerPerPartitionWrapper(); - } else { - this.consumerWrapper = new SingleConsumerWrapper(); - } - log.debug("[{}] Initialized consumer for queue: {}", queueKey, queue); - } - - public void update(Queue queue) { - addTask(TbQueueConsumerManagerTask.configUpdate(queue)); - } - - public void update(Set partitions) { - addTask(TbQueueConsumerManagerTask.partitionChange(partitions)); - } - public void delete(boolean drainQueue) { addTask(TbQueueConsumerManagerTask.delete(drainQueue)); } - private void addTask(TbQueueConsumerManagerTask todo) { - if (stopped) { - return; + @Override + protected void processTask(TbQueueConsumerManagerTask task) { + if (task.getEvent() == QueueEvent.DELETE) { + doDelete(task.isDrainQueue()); } - tasks.add(todo); - log.trace("[{}] Added task: {}", queueKey, todo); - tryProcessTasks(); - } - - private void tryProcessTasks() { - if (!ctx.isReady()) { - log.debug("[{}] TbRuleEngineConsumerContext is not ready yet, will process tasks later", queueKey); - ctx.getScheduler().schedule(this::tryProcessTasks, 1, TimeUnit.SECONDS); - return; - } - ctx.getMgmtExecutor().submit(() -> { - if (lock.tryLock()) { - try { - Queue newConfiguration = null; - Set newPartitions = null; - while (!stopped) { - TbQueueConsumerManagerTask task = tasks.poll(); - if (task == null) { - break; - } - log.trace("[{}] Processing task: {}", queueKey, task); - - if (task.getEvent() == QueueEvent.PARTITION_CHANGE) { - newPartitions = task.getPartitions(); - } else if (task.getEvent() == QueueEvent.CONFIG_UPDATE) { - newConfiguration = task.getQueue(); - } else if (task.getEvent() == QueueEvent.DELETE) { - doDelete(task.isDrainQueue()); - return; - } - } - if (stopped) { - return; - } - if (newConfiguration != null) { - doUpdate(newConfiguration); - } - if (newPartitions != null) { - doUpdate(newPartitions); - } - } catch (Exception e) { - log.error("[{}] Failed to process tasks", queueKey, e); - } finally { - lock.unlock(); - } - } else { - log.trace("[{}] Failed to acquire lock", queueKey); - ctx.getScheduler().schedule(this::tryProcessTasks, 1, TimeUnit.SECONDS); - } - }); - } - - private void doUpdate(Queue newQueue) { - log.info("[{}] Processing queue update: {}", queueKey, newQueue); - var oldQueue = this.queue; - this.queue = newQueue; - if (log.isTraceEnabled()) { - log.trace("[{}] Old queue configuration: {}", queueKey, oldQueue); - log.trace("[{}] New queue configuration: {}", queueKey, newQueue); - } - - if (oldQueue == null) { - init(queue); - } else if (newQueue.isConsumerPerPartition() != oldQueue.isConsumerPerPartition()) { - consumerWrapper.getConsumers().forEach(TbQueueConsumerTask::initiateStop); - consumerWrapper.getConsumers().forEach(TbQueueConsumerTask::awaitCompletion); - - init(queue); - if (partitions != null) { - doUpdate(partitions); // even if partitions number was changed, there can be no partition change event - } - } else { - // do nothing, because partitions change (if they changed) will be handled on PartitionChangeEvent, - // and changes to pollInterval/packProcessingTimeout/submitStrategy/processingStrategy will be picked up by consumer on the fly, - // and queue topic and name are immutable - } - } - - private void doUpdate(Set partitions) { - this.partitions = partitions; - consumerWrapper.updatePartitions(partitions); - } - - public void stop() { - log.debug("[{}] Stopping consumers", queueKey); - consumerWrapper.getConsumers().forEach(TbQueueConsumerTask::initiateStop); - stopped = true; - } - - public void awaitStop() { - consumerWrapper.getConsumers().forEach(TbQueueConsumerTask::awaitCompletion); - log.debug("[{}] Unsubscribed and stopped consumers", queueKey); } private void doDelete(boolean drainQueue) { @@ -212,7 +92,7 @@ public class TbRuleEngineQueueConsumerManager { List>> queueConsumers = consumerWrapper.getConsumers().stream() .map(TbQueueConsumerTask::getConsumer).collect(Collectors.toList()); - ctx.getConsumersExecutor().submit(() -> { + consumerExecutor.submit(() -> { if (drainQueue) { drainQueue(queueConsumers); } @@ -235,47 +115,10 @@ public class TbRuleEngineQueueConsumerManager { }); } - private void launchConsumer(TbQueueConsumerTask consumerTask) { - log.info("[{}] Launching consumer", consumerTask.getKey()); - Future consumerLoop = ctx.getConsumersExecutor().submit(() -> { - ThingsBoardThreadFactory.updateCurrentThreadName(consumerTask.getKey().toString()); - try { - consumerLoop(consumerTask.getConsumer()); - } catch (Throwable e) { - log.error("Failure in consumer loop", e); - } - }); - consumerTask.setTask(consumerLoop); - } - - private void consumerLoop(TbQueueConsumer> consumer) { - while (!stopped && !consumer.isStopped()) { - try { - List> msgs = consumer.poll(queue.getPollInterval()); - if (msgs.isEmpty()) { - continue; - } - processMsgs(msgs, consumer, queue); - } catch (Exception e) { - if (!consumer.isStopped()) { - log.warn("Failed to process messages from queue", e); - try { - Thread.sleep(ctx.getPollDuration()); - } catch (InterruptedException e2) { - log.trace("Failed to wait until the server has capacity to handle new requests", e2); - } - } - } - } - if (consumer.isStopped()) { - consumer.unsubscribe(); - } - log.info("Rule Engine consumer stopped"); - } - - private void processMsgs(List> msgs, - TbQueueConsumer> consumer, - Queue queue) throws InterruptedException { + @Override + protected void processMsgs(List> msgs, + TbQueueConsumer> consumer, + Queue queue) throws Exception { TbRuleEngineSubmitStrategy submitStrategy = getSubmitStrategy(queue); TbRuleEngineProcessingStrategy ackStrategy = getProcessingStrategy(queue); submitStrategy.init(msgs); @@ -320,7 +163,7 @@ public class TbRuleEngineQueueConsumerManager { } private void submitMessage(TbMsgPackProcessingContext packCtx, UUID id, TbProtoQueueMsg msg) { - log.trace("[{}] Creating callback for topic {} message: {}", id, queue.getName(), msg.getValue()); + log.trace("[{}] Creating callback for topic {} message: {}", id, config.getName(), msg.getValue()); ToRuleEngineMsg toRuleEngineMsg = msg.getValue(); TenantId tenantId = TenantId.fromUUID(new UUID(toRuleEngineMsg.getTenantIdMSB(), toRuleEngineMsg.getTenantIdLSB())); TbMsgCallback callback = ctx.isPrometheusStatsEnabled() ? @@ -328,7 +171,7 @@ public class TbRuleEngineQueueConsumerManager { new TbMsgPackCallback(id, tenantId, packCtx); try { if (!toRuleEngineMsg.getTbMsg().isEmpty()) { - forwardToRuleEngineActor(queue.getName(), tenantId, toRuleEngineMsg, callback); + forwardToRuleEngineActor(config.getName(), tenantId, toRuleEngineMsg, callback); } else { callback.onSuccess(); } @@ -356,7 +199,7 @@ public class TbRuleEngineQueueConsumerManager { log.info("[{}] {} to process [{}] messages", queueKey, prefix, map.size()); for (Map.Entry> pending : map.entrySet()) { ToRuleEngineMsg tmp = pending.getValue().getValue(); - TbMsg tmpMsg = TbMsg.fromBytes(queue.getName(), tmp.getTbMsg().toByteArray(), TbMsgCallback.EMPTY); + TbMsg tmpMsg = TbMsg.fromBytes(config.getName(), tmp.getTbMsg().toByteArray(), TbMsgCallback.EMPTY); RuleNodeInfo ruleNodeInfo = ctx.getLastVisitedRuleNode(pending.getKey()); if (printAll) { log.trace("[{}][{}] {} to process message: {}, Last Rule Node: {}", queueKey, TenantId.fromUUID(new UUID(tmp.getTenantIdMSB(), tmp.getTenantIdLSB())), prefix, tmpMsg, ruleNodeInfo); @@ -379,7 +222,7 @@ public class TbRuleEngineQueueConsumerManager { int n = 0; while (System.currentTimeMillis() <= finishTs) { for (TbQueueConsumer> consumer : consumers) { - List> msgs = consumer.poll(queue.getPollInterval()); + List> msgs = consumer.poll(config.getPollInterval()); if (msgs.isEmpty()) { continue; } @@ -388,7 +231,7 @@ public class TbRuleEngineQueueConsumerManager { MsgProtos.TbMsgProto tbMsgProto = MsgProtos.TbMsgProto.parseFrom(msg.getValue().getTbMsg().toByteArray()); EntityId originator = EntityIdFactory.getByTypeAndUuid(tbMsgProto.getEntityType(), new UUID(tbMsgProto.getEntityIdMSB(), tbMsgProto.getEntityIdLSB())); - TopicPartitionInfo tpi = ctx.getPartitionService().resolve(ServiceType.TB_RULE_ENGINE, queue.getName(), TenantId.SYS_TENANT_ID, originator); + TopicPartitionInfo tpi = ctx.getPartitionService().resolve(ServiceType.TB_RULE_ENGINE, config.getName(), TenantId.SYS_TENANT_ID, originator); ctx.getProducerProvider().getRuleEngineMsgProducer().send(tpi, msg, null); n++; } catch (Throwable e) { @@ -399,90 +242,11 @@ public class TbRuleEngineQueueConsumerManager { } } if (n > 0) { - log.info("Moved {} messages from {} to system {}", n, queueKey, queue.getName()); + log.info("Moved {} messages from {} to system {}", n, queueKey, config.getName()); } } catch (Exception e) { log.error("[{}] Failed to drain queue", queueKey, e); } } - private static String partitionsToString(Collection partitions) { - return partitions.stream().map(TopicPartitionInfo::getFullTopicName).collect(Collectors.joining(", ", "[", "]")); - } - - interface ConsumerWrapper { - - void updatePartitions(Set partitions); - - Collection getConsumers(); - - } - - class ConsumerPerPartitionWrapper implements ConsumerWrapper { - private final Map consumers = new HashMap<>(); - - @Override - public void updatePartitions(Set partitions) { - Set addedPartitions = new HashSet<>(partitions); - addedPartitions.removeAll(consumers.keySet()); - - Set removedPartitions = new HashSet<>(consumers.keySet()); - removedPartitions.removeAll(partitions); - log.info("[{}] Added partitions: {}, removed partitions: {}", queueKey, partitionsToString(addedPartitions), partitionsToString(removedPartitions)); - - removedPartitions.forEach((tpi) -> { - consumers.get(tpi).initiateStop(); - }); - removedPartitions.forEach((tpi) -> { - consumers.remove(tpi).awaitCompletion(); - }); - - addedPartitions.forEach((tpi) -> { - String key = queueKey + "-" + tpi.getPartition().orElse(-999999); - TbQueueConsumerTask consumer = new TbQueueConsumerTask(key, ctx.getQueueFactory().createToRuleEngineMsgConsumer(queue)); - consumers.put(tpi, consumer); - consumer.subscribe(Set.of(tpi)); - launchConsumer(consumer); - }); - } - - @Override - public Collection getConsumers() { - return consumers.values(); - } - } - - class SingleConsumerWrapper implements ConsumerWrapper { - private TbQueueConsumerTask consumer; - - @Override - public void updatePartitions(Set partitions) { - log.info("[{}] New partitions: {}", queueKey, partitionsToString(partitions)); - if (partitions.isEmpty()) { - if (consumer != null && consumer.isRunning()) { - consumer.initiateStop(); - consumer.awaitCompletion(); - } - consumer = null; - return; - } - - if (consumer == null) { - consumer = new TbQueueConsumerTask(queueKey, ctx.getQueueFactory().createToRuleEngineMsgConsumer(queue)); - } - consumer.subscribe(partitions); - if (!consumer.isRunning()) { - launchConsumer(consumer); - } - } - - @Override - public Collection getConsumers() { - if (consumer == null) { - return Collections.emptyList(); - } - return List.of(consumer); - } - } - } diff --git a/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java b/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java index 6bd0cd9c0e..a00f45b8db 100644 --- a/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java +++ b/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java @@ -27,6 +27,8 @@ import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; import org.testcontainers.shaded.org.apache.commons.lang3.RandomUtils; import org.thingsboard.common.util.JacksonUtil; +import org.thingsboard.common.util.ThingsBoardExecutors; +import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.actors.ActorSystemContext; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.QueueId; @@ -65,6 +67,9 @@ import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; @@ -86,7 +91,6 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @@ -112,6 +116,9 @@ public class TbRuleEngineQueueConsumerManagerTest { @Mock private TbQueueAdmin queueAdmin; private TbRuleEngineConsumerContext ruleEngineConsumerContext; + private ExecutorService consumersExecutor; + private ScheduledExecutorService scheduler; + private ExecutorService mgmtExecutor; private TbRuleEngineQueueConsumerManager consumerManager; private Queue queue; @@ -141,10 +148,10 @@ public class TbRuleEngineQueueConsumerManagerTest { }).when(actorContext).tell(any()); ruleEngineMsgProducer = mock(TbQueueProducer.class); when(producerProvider.getRuleEngineMsgProducer()).thenReturn(ruleEngineMsgProducer); - ruleEngineConsumerContext.setMgmtThreadPoolSize(2); + consumersExecutor = Executors.newCachedThreadPool(ThingsBoardThreadFactory.forName("tb-rule-engine-consumer")); + mgmtExecutor = ThingsBoardExecutors.newWorkStealingPool(3, "tb-rule-engine-mgmt"); + scheduler = Executors.newSingleThreadScheduledExecutor(ThingsBoardThreadFactory.forName("tb-rule-engine-consumer-scheduler")); ruleEngineConsumerContext.setTopicDeletionDelayInSec(5); - ruleEngineConsumerContext.init(); - ruleEngineConsumerContext.setReady(false); queue = new Queue(); queue.setName("Test"); @@ -174,14 +181,23 @@ public class TbRuleEngineQueueConsumerManagerTest { }).when(queueFactory).createToRuleEngineMsgConsumer(any()); QueueKey queueKey = new QueueKey(ServiceType.TB_RULE_ENGINE, queue); - consumerManager = new TbRuleEngineQueueConsumerManager(ruleEngineConsumerContext, queueKey); + consumerManager = TbRuleEngineQueueConsumerManager.create() + .ctx(ruleEngineConsumerContext) + .queueKey(queueKey) + .consumerExecutor(consumersExecutor) + .scheduler(scheduler) + .taskExecutor(mgmtExecutor) + .build(); } @After public void afterEach() { consumerManager.stop(); consumerManager.awaitStop(); - ruleEngineConsumerContext.stop(); + + consumersExecutor.shutdownNow(); + scheduler.shutdownNow(); + mgmtExecutor.shutdownNow(); if (generateQueueMsgs) { await().atMost(10, TimeUnit.SECONDS) @@ -199,14 +215,7 @@ public class TbRuleEngineQueueConsumerManagerTest { Set partitions = createTpis(2, 3, 4); consumerManager.update(partitions); - partitions = createTpis(3, 4, 5); - consumerManager.update(partitions); - partitions = createTpis(1, 2, 3); - consumerManager.update(partitions); - // simulated multiple partition change events before consumer is ready; only latest partitions should be processed - verifyNoInteractions(queueFactory); - ruleEngineConsumerContext.setReady(true); await().atMost(2, TimeUnit.SECONDS) .until(() -> consumers.size() == 3); for (TopicPartitionInfo partition : partitions) { @@ -222,14 +231,7 @@ public class TbRuleEngineQueueConsumerManagerTest { Set partitions = createTpis(2, 3, 4); consumerManager.update(partitions); - partitions = createTpis(3, 4, 5); - consumerManager.update(partitions); - partitions = createTpis(1, 2, 3); - consumerManager.update(partitions); - verifyNoInteractions(queueFactory); - - ruleEngineConsumerContext.setReady(true); await().atMost(2, TimeUnit.SECONDS) .until(() -> consumers.size() == 1); TestConsumer consumer = getConsumer(); @@ -240,7 +242,6 @@ public class TbRuleEngineQueueConsumerManagerTest { public void testPartitionsUpdate_singleConsumer() { queue.setConsumerPerPartition(false); consumerManager.init(queue); - ruleEngineConsumerContext.setReady(true); Set partitions = Collections.emptySet(); consumerManager.update(partitions); @@ -273,7 +274,6 @@ public class TbRuleEngineQueueConsumerManagerTest { public void testPartitionsUpdate_consumerPerPartition() { queue.setConsumerPerPartition(true); consumerManager.init(queue); - ruleEngineConsumerContext.setReady(true); consumerManager.update(Collections.emptySet()); verify(queueFactory, after(1000).never()).createToRuleEngineMsgConsumer(any()); @@ -316,7 +316,6 @@ public class TbRuleEngineQueueConsumerManagerTest { public void testConfigUpdate_singleConsumer() { queue.setConsumerPerPartition(false); consumerManager.init(queue); - ruleEngineConsumerContext.setReady(true); Set partitions = createTpis(1, 2, 3); consumerManager.update(partitions); TestConsumer consumer = getConsumer(); @@ -342,7 +341,6 @@ public class TbRuleEngineQueueConsumerManagerTest { public void testConfigUpdate_consumerPerPartition() { queue.setConsumerPerPartition(true); consumerManager.init(queue); - ruleEngineConsumerContext.setReady(true); Set partitions = createTpis(1, 2, 3); consumerManager.update(partitions); TestConsumer consumer1 = getConsumer(1); @@ -375,7 +373,6 @@ public class TbRuleEngineQueueConsumerManagerTest { public void testConfigUpdate_fromSingleToConsumerPerPartition() { queue.setConsumerPerPartition(false); consumerManager.init(queue); - ruleEngineConsumerContext.setReady(true); Set partitions = createTpis(1, 2, 3); consumerManager.update(partitions); TestConsumer consumer = getConsumer(); @@ -395,7 +392,6 @@ public class TbRuleEngineQueueConsumerManagerTest { public void testConfigUpdate_fromConsumerPerPartitionToSingle() { queue.setConsumerPerPartition(true); consumerManager.init(queue); - ruleEngineConsumerContext.setReady(true); Set partitions = createTpis(1, 2, 3); consumerManager.update(partitions); TestConsumer consumer1 = getConsumer(1); @@ -419,7 +415,6 @@ public class TbRuleEngineQueueConsumerManagerTest { public void testStop() { queue.setConsumerPerPartition(true); consumerManager.init(queue); - ruleEngineConsumerContext.setReady(true); consumerManager.update(createTpis(1)); TestConsumer consumer = getConsumer(1); verifySubscribedAndLaunched(consumer, 1); @@ -437,7 +432,6 @@ public class TbRuleEngineQueueConsumerManagerTest { public void testDelete_consumerPerPartition() { queue.setConsumerPerPartition(true); consumerManager.init(queue); - ruleEngineConsumerContext.setReady(true); Set partitions = createTpis(1, 2); consumerManager.update(partitions); TestConsumer consumer1 = getConsumer(1); @@ -459,7 +453,7 @@ public class TbRuleEngineQueueConsumerManagerTest { int msgCount = totalConsumedMsgs.get(); await().atLeast(2, TimeUnit.SECONDS) // based on topicDeletionDelayInSec(5) = 5 - ( 3 seconds the code may execute starting consumerManager.delete() call) - .atMost(7, TimeUnit.SECONDS) + .atMost(10, TimeUnit.SECONDS) .untilAsserted(() -> { partitions.stream() .map(TopicPartitionInfo::getFullTopicName) @@ -481,7 +475,6 @@ public class TbRuleEngineQueueConsumerManagerTest { public void testDelete_singleConsumer() { queue.setConsumerPerPartition(false); consumerManager.init(queue); - ruleEngineConsumerContext.setReady(true); Set partitions = createTpis(1, 2); consumerManager.update(partitions); TestConsumer consumer = getConsumer(); @@ -499,7 +492,7 @@ public class TbRuleEngineQueueConsumerManagerTest { int msgCount = totalConsumedMsgs.get(); await().atLeast(2, TimeUnit.SECONDS) // based on topicDeletionDelayInSec(5) = 5 - ( 3 seconds the code may execute starting consumerManager.delete() call) - .atMost(7, TimeUnit.SECONDS) + .atMost(10, TimeUnit.SECONDS) .untilAsserted(() -> { partitions.stream() .map(TopicPartitionInfo::getFullTopicName) @@ -520,10 +513,9 @@ public class TbRuleEngineQueueConsumerManagerTest { public void testManyDifferentUpdates() throws Exception { queue.setConsumerPerPartition(RandomUtils.nextBoolean()); consumerManager.init(queue); - ruleEngineConsumerContext.setReady(true); Supplier queueConfigUpdater = () -> { - Queue oldConfig = consumerManager.getQueue(); + Queue oldConfig = consumerManager.getConfig(); Queue newConfig = JacksonUtil.clone(oldConfig); newConfig.setConsumerPerPartition(RandomUtils.nextBoolean()); newConfig.setPollInterval(RandomUtils.nextInt(100, 501)); @@ -571,7 +563,7 @@ public class TbRuleEngineQueueConsumerManagerTest { Set expectedPartitions = latestPartitions; await().atMost(5, TimeUnit.SECONDS) .untilAsserted(() -> { - assertThat(consumerManager.getQueue()).isEqualTo(expectedConfig); + assertThat(consumerManager.getConfig()).isEqualTo(expectedConfig); assertThat(consumerManager.getPartitions()).isEqualTo(expectedPartitions); }); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/queue/Queue.java b/common/data/src/main/java/org/thingsboard/server/common/data/queue/Queue.java index e3c6836aab..1c08072e61 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/queue/Queue.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/queue/Queue.java @@ -30,7 +30,7 @@ import org.thingsboard.server.common.data.validation.NoXss; import java.util.Optional; @Data -public class Queue extends BaseDataWithAdditionalInfo implements HasName, HasTenantId { +public class Queue extends BaseDataWithAdditionalInfo implements HasName, HasTenantId, QueueConfig { private TenantId tenantId; @NoXss @Length(fieldName = "name") diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/queue/QueueConfig.java b/common/data/src/main/java/org/thingsboard/server/common/data/queue/QueueConfig.java new file mode 100644 index 0000000000..383c613a38 --- /dev/null +++ b/common/data/src/main/java/org/thingsboard/server/common/data/queue/QueueConfig.java @@ -0,0 +1,24 @@ +/** + * Copyright © 2016-2024 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.common.data.queue; + +public interface QueueConfig { + + boolean isConsumerPerPartition(); + + int getPollInterval(); + +} diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java index 3459096e08..88470296ed 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java @@ -39,8 +39,8 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.kafka.TbKafkaAdmin; import org.thingsboard.server.queue.kafka.TbKafkaConsumerStatsService; import org.thingsboard.server.queue.kafka.TbKafkaConsumerTemplate; @@ -212,7 +212,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); consumerBuilder.topic(topicService.buildTopicName(coreSettings.getTopic())); - consumerBuilder.clientId("monolith-core-consumer-" + serviceInfoProvider.getServiceId()); + consumerBuilder.clientId("monolith-core-consumer-" + serviceInfoProvider.getServiceId() + "-" + consumerCount.incrementAndGet()); consumerBuilder.groupId(topicService.buildTopicName("monolith-core-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(coreAdmin); diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java index 1852693304..21078d7f94 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java @@ -38,8 +38,8 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.kafka.TbKafkaAdmin; import org.thingsboard.server.queue.kafka.TbKafkaConsumerStatsService; import org.thingsboard.server.queue.kafka.TbKafkaConsumerTemplate; @@ -55,6 +55,7 @@ import org.thingsboard.server.queue.settings.TbQueueVersionControlSettings; import javax.annotation.PreDestroy; import java.nio.charset.StandardCharsets; +import java.util.concurrent.atomic.AtomicLong; @Component @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='tb-core'") @@ -81,6 +82,8 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { private final TbQueueAdmin fwUpdatesAdmin; private final TbQueueAdmin vcAdmin; + private final AtomicLong consumerCount = new AtomicLong(); + public KafkaTbCoreQueueFactory(TopicService topicService, TbKafkaSettings kafkaSettings, TbServiceInfoProvider serviceInfoProvider, @@ -169,7 +172,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); consumerBuilder.topic(topicService.buildTopicName(coreSettings.getTopic())); - consumerBuilder.clientId("tb-core-consumer-" + serviceInfoProvider.getServiceId()); + consumerBuilder.clientId("tb-core-consumer-" + serviceInfoProvider.getServiceId() + "-" + consumerCount.incrementAndGet()); consumerBuilder.groupId(topicService.buildTopicName("tb-core-node")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(coreAdmin); diff --git a/common/util/src/main/java/org/thingsboard/common/util/ThingsBoardThreadFactory.java b/common/util/src/main/java/org/thingsboard/common/util/ThingsBoardThreadFactory.java index de097cfd6c..dc263b80e7 100644 --- a/common/util/src/main/java/org/thingsboard/common/util/ThingsBoardThreadFactory.java +++ b/common/util/src/main/java/org/thingsboard/common/util/ThingsBoardThreadFactory.java @@ -51,6 +51,11 @@ public class ThingsBoardThreadFactory implements ThreadFactory { Thread.currentThread().setName(name); } + public static void addThreadNamePrefix(String prefix) { + String name = Thread.currentThread().getName(); + name = prefix + name; + Thread.currentThread().setName(name); + } @Override public Thread newThread(Runnable r) { From 134db4249472f094523e35d2bb3efeb6f64be26f Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Tue, 19 Mar 2024 13:49:46 +0200 Subject: [PATCH 02/17] Configurable consumer per partition for tb-core queue --- .../server/service/queue/DefaultTbCoreConsumerService.java | 5 ++++- .../service/queue/processing/AbstractConsumerService.java | 3 +-- application/src/main/resources/thingsboard.yml | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java index c0ccaea9d0..474efc5ed7 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java @@ -126,6 +126,8 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService, CoreQueueConfig>builder() .queueKey(new QueueKey(ServiceType.TB_CORE)) - .config(CoreQueueConfig.of(true, (int) pollInterval)) + .config(CoreQueueConfig.of(consumerPerPartitionEnabled, (int) pollInterval)) .msgPackProcessor(this::processMsgs) .consumerCreator(config -> queueFactory.createToCoreMsgConsumer()) .consumerExecutor(consumersExecutor) @@ -764,6 +766,7 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService Date: Wed, 20 Mar 2024 12:49:40 +0200 Subject: [PATCH 03/17] Minor refactoring for consumer managers --- .../service/queue/DefaultTbCoreConsumerService.java | 12 ++++++++---- .../queue/DefaultTbRuleEngineConsumerService.java | 5 +---- .../queue/consumer/BasicQueueConsumerManager.java | 2 +- .../service/queue/consumer/QueueConsumerManager.java | 8 +++++--- .../queue/processing/AbstractConsumerService.java | 2 +- application/src/main/resources/thingsboard.yml | 2 +- .../TbRuleEngineQueueConsumerManagerTest.java | 4 ++-- 7 files changed, 19 insertions(+), 16 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java index a2bed09151..e1bd18c7bf 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java @@ -127,8 +127,8 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService, CoreQueueConfig>builder() .queueKey(new QueueKey(ServiceType.TB_CORE)) - .config(CoreQueueConfig.of(consumerPerPartitionEnabled, (int) pollInterval)) + .config(CoreQueueConfig.of(consumerPerPartition, (int) pollInterval)) .msgPackProcessor(this::processMsgs) .consumerCreator(config -> queueFactory.createToCoreMsgConsumer()) .consumerExecutor(consumersExecutor) @@ -325,7 +325,9 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService log.debug("[{}] Timeout to process message: {}", id, msg.getValue())); + if (log.isDebugEnabled()) { + ctx.getAckMap().forEach((id, msg) -> log.debug("[{}] Timeout to process message: {}", id, msg.getValue())); + } ctx.getFailedMap().forEach((id, msg) -> log.warn("[{}] Failed to process message: {}", id, msg.getValue())); } consumer.commit(); @@ -452,6 +454,8 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService { } catch (Throwable e) { log.error("Failure in consumer loop", e); } + log.info("[{}] Consumer stopped", name); }); } @@ -94,7 +95,6 @@ public class BasicQueueConsumerManager { } } } - log.info("{} Consumer stopped", name); } public void stop() { diff --git a/application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java b/application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java index 04538289ea..acd28f25ba 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java @@ -176,8 +176,9 @@ public class QueueConsumerManager { doUpdate(partitions); // even if partitions number was changed, there can be no partition change event } } else { + log.trace("[{}] Silently applied new config, because consumer-per-partition not changed", queueKey); // do nothing, because partitions change (if they changed) will be handled on PartitionChangeEvent, - // and changes to pollInterval/packProcessingTimeout/submitStrategy/processingStrategy will be picked up by consumer on the fly, + // and changes to other config values will be picked up by consumer on the fly, // and queue topic and name are immutable } } @@ -196,6 +197,7 @@ public class QueueConsumerManager { } catch (Throwable e) { log.error("Failure in consumer loop", e); } + log.info("[{}] Consumer stopped", consumerTask.getKey()); }); consumerTask.setTask(consumerLoop); } @@ -222,7 +224,6 @@ public class QueueConsumerManager { if (consumer.isStopped()) { consumer.unsubscribe(); } - log.info("{} Consumer stopped", queueKey); } protected void processMsgs(List msgs, TbQueueConsumer consumer, C config) throws Exception { @@ -236,6 +237,7 @@ public class QueueConsumerManager { } public void awaitStop() { + log.debug("[{}] Waiting for consumers to stop", queueKey); consumerWrapper.getConsumers().forEach(TbQueueConsumerTask::awaitCompletion); log.debug("[{}] Unsubscribed and stopped consumers", queueKey); } @@ -272,7 +274,7 @@ public class QueueConsumerManager { removedPartitions.forEach((tpi) -> consumers.remove(tpi).awaitCompletion()); addedPartitions.forEach((tpi) -> { - String key = queueKey + "-" + tpi.getPartition().orElse(-999999); + String key = queueKey + "-" + tpi.getPartition().orElse(-1); TbQueueConsumerTask consumer = new TbQueueConsumerTask<>(key, consumerCreator.apply(config)); consumers.put(tpi, consumer); consumer.subscribe(Set.of(tpi)); diff --git a/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java index fa43eaa78d..79942cf6df 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.service.queue.processing; +import jakarta.annotation.PreDestroy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationEventPublisher; @@ -48,7 +49,6 @@ import org.thingsboard.server.service.queue.TbPackProcessingContext; import org.thingsboard.server.service.queue.consumer.BasicQueueConsumerManager; import org.thingsboard.server.service.security.auth.jwt.settings.JwtSettingsService; -import jakarta.annotation.PreDestroy; import java.util.List; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index d38c83a9ef..ca186ed0a5 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -1596,7 +1596,7 @@ queue: # Timeout for processing a message pack by Core microservices pack-processing-timeout: "${TB_QUEUE_CORE_PACK_PROCESSING_TIMEOUT_MS:2000}" # Enable/disable a separate consumer per partition for Core queue - consumer-per-partition-enabled: "${TB_QUEUE_CORE_CONSUMER_PER_PARTITION_ENABLED:true}" + consumer-per-partition: "${TB_QUEUE_CORE_CONSUMER_PER_PARTITION:true}" ota: # Default topic name for OTA updates topic: "${TB_QUEUE_CORE_OTA_TOPIC:tb_ota_package}" diff --git a/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java b/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java index a00f45b8db..75df04333d 100644 --- a/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java +++ b/application/src/test/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManagerTest.java @@ -453,7 +453,7 @@ public class TbRuleEngineQueueConsumerManagerTest { int msgCount = totalConsumedMsgs.get(); await().atLeast(2, TimeUnit.SECONDS) // based on topicDeletionDelayInSec(5) = 5 - ( 3 seconds the code may execute starting consumerManager.delete() call) - .atMost(10, TimeUnit.SECONDS) + .atMost(20, TimeUnit.SECONDS) .untilAsserted(() -> { partitions.stream() .map(TopicPartitionInfo::getFullTopicName) @@ -492,7 +492,7 @@ public class TbRuleEngineQueueConsumerManagerTest { int msgCount = totalConsumedMsgs.get(); await().atLeast(2, TimeUnit.SECONDS) // based on topicDeletionDelayInSec(5) = 5 - ( 3 seconds the code may execute starting consumerManager.delete() call) - .atMost(10, TimeUnit.SECONDS) + .atMost(20, TimeUnit.SECONDS) .untilAsserted(() -> { partitions.stream() .map(TopicPartitionInfo::getFullTopicName) From 47cfebe2a7a8646df5ef225a0f2034129031efb6 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Wed, 20 Mar 2024 13:25:30 +0200 Subject: [PATCH 04/17] Use QueueConsumerManager for other consumers --- .../queue/DefaultTbCoreConsumerService.java | 20 ++--- ...ger.java => MainQueueConsumerManager.java} | 15 ++-- .../processing/AbstractConsumerService.java | 8 +- .../TbRuleEngineQueueConsumerManager.java | 4 +- .../common/consumer/QueueConsumerManager.java | 14 ++- .../service/DefaultTransportService.java | 71 +++++++-------- .../common/util/ThingsBoardThreadFactory.java | 2 +- .../DefaultClusterVersionControlService.java | 87 ++++++++----------- 8 files changed, 96 insertions(+), 125 deletions(-) rename application/src/main/java/org/thingsboard/server/service/queue/consumer/{QueueConsumerManager.java => MainQueueConsumerManager.java} (95%) rename application/src/main/java/org/thingsboard/server/service/queue/consumer/BasicQueueConsumerManager.java => common/queue/src/main/java/org/thingsboard/server/queue/common/consumer/QueueConsumerManager.java (87%) diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java index e1bd18c7bf..fdbbde3222 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java @@ -90,8 +90,8 @@ import org.thingsboard.server.service.notification.NotificationSchedulerService; import org.thingsboard.server.service.ota.OtaPackageStateService; import org.thingsboard.server.service.profile.TbAssetProfileCache; import org.thingsboard.server.service.profile.TbDeviceProfileCache; -import org.thingsboard.server.service.queue.consumer.BasicQueueConsumerManager; -import org.thingsboard.server.service.queue.consumer.QueueConsumerManager; +import org.thingsboard.server.queue.common.consumer.QueueConsumerManager; +import org.thingsboard.server.service.queue.consumer.MainQueueConsumerManager; import org.thingsboard.server.service.queue.processing.AbstractConsumerService; import org.thingsboard.server.service.queue.processing.IdMsgPair; import org.thingsboard.server.service.resource.TbImageService; @@ -151,9 +151,9 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService, CoreQueueConfig> mainConsumer; - private BasicQueueConsumerManager> usageStatsConsumer; - private BasicQueueConsumerManager> firmwareStatesConsumer; + private MainQueueConsumerManager, CoreQueueConfig> mainConsumer; + private QueueConsumerManager> usageStatsConsumer; + private QueueConsumerManager> firmwareStatesConsumer; private volatile ListeningExecutorService deviceActivityEventsExecutor; @@ -199,7 +199,7 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService, CoreQueueConfig>builder() + this.mainConsumer = MainQueueConsumerManager., CoreQueueConfig>builder() .queueKey(new QueueKey(ServiceType.TB_CORE)) .config(CoreQueueConfig.of(consumerPerPartition, (int) pollInterval)) .msgPackProcessor(this::processMsgs) @@ -208,19 +208,19 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService>builder() + this.usageStatsConsumer = QueueConsumerManager.>builder() .key("usage-stats") .name("TB Usage Stats") - .pollInterval(pollInterval) .msgPackProcessor(this::processUsageStatsMsg) + .pollInterval(pollInterval) .consumerCreator(queueFactory::createToUsageStatsServiceMsgConsumer) .consumerExecutor(consumersExecutor) .build(); - this.firmwareStatesConsumer = BasicQueueConsumerManager.>builder() + this.firmwareStatesConsumer = QueueConsumerManager.>builder() .key("firmware") .name("TB Ota Package States") - .pollInterval(pollInterval) .msgPackProcessor(this::processFirmwareMsgs) + .pollInterval(pollInterval) .consumerCreator(queueFactory::createToOtaPackageStateServiceMsgConsumer) .consumerExecutor(consumersExecutor) .build(); diff --git a/application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java b/application/src/main/java/org/thingsboard/server/service/queue/consumer/MainQueueConsumerManager.java similarity index 95% rename from application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java rename to application/src/main/java/org/thingsboard/server/service/queue/consumer/MainQueueConsumerManager.java index acd28f25ba..6792422b57 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/consumer/MainQueueConsumerManager.java @@ -45,7 +45,7 @@ import java.util.function.Function; import java.util.stream.Collectors; @Slf4j -public class QueueConsumerManager { +public class MainQueueConsumerManager { protected final QueueKey queueKey; @Getter @@ -65,13 +65,12 @@ public class QueueConsumerManager { protected volatile boolean stopped; @Builder - public QueueConsumerManager(QueueKey queueKey, - C config, - MsgPackProcessor msgPackProcessor, - Function> consumerCreator, - ExecutorService consumerExecutor, - ScheduledExecutorService scheduler, - ExecutorService taskExecutor) { + public MainQueueConsumerManager(QueueKey queueKey, C config, + MsgPackProcessor msgPackProcessor, + Function> consumerCreator, + ExecutorService consumerExecutor, + ScheduledExecutorService scheduler, + ExecutorService taskExecutor) { this.queueKey = queueKey; this.config = config; this.msgPackProcessor = msgPackProcessor; diff --git a/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java index 79942cf6df..3c769c911a 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java @@ -46,7 +46,7 @@ import org.thingsboard.server.service.profile.TbAssetProfileCache; import org.thingsboard.server.service.profile.TbDeviceProfileCache; import org.thingsboard.server.service.queue.TbPackCallback; import org.thingsboard.server.service.queue.TbPackProcessingContext; -import org.thingsboard.server.service.queue.consumer.BasicQueueConsumerManager; +import org.thingsboard.server.queue.common.consumer.QueueConsumerManager; import org.thingsboard.server.service.security.auth.jwt.settings.JwtSettingsService; import java.util.List; @@ -73,7 +73,7 @@ public abstract class AbstractConsumerService> nfConsumer; + protected QueueConsumerManager> nfConsumer; protected ExecutorService consumersExecutor; protected ExecutorService mgmtExecutor; @@ -84,11 +84,11 @@ public abstract class AbstractConsumerService>builder() + this.nfConsumer = QueueConsumerManager.>builder() .key("notifications") .name("TB Notifications") - .pollInterval(getNotificationPollDuration()) .msgPackProcessor(this::processNotifications) + .pollInterval(getNotificationPollDuration()) .consumerCreator(this::createNotificationsConsumer) .consumerExecutor(consumersExecutor) .build(); diff --git a/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManager.java b/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManager.java index b93313b104..c2823d3c00 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManager.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/ruleengine/TbRuleEngineQueueConsumerManager.java @@ -37,7 +37,7 @@ import org.thingsboard.server.queue.discovery.QueueKey; import org.thingsboard.server.service.queue.TbMsgPackCallback; import org.thingsboard.server.service.queue.TbMsgPackProcessingContext; import org.thingsboard.server.service.queue.TbRuleEngineConsumerStats; -import org.thingsboard.server.service.queue.consumer.QueueConsumerManager; +import org.thingsboard.server.service.queue.consumer.MainQueueConsumerManager; import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingDecision; import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingResult; import org.thingsboard.server.service.queue.processing.TbRuleEngineProcessingStrategy; @@ -55,7 +55,7 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Slf4j -public class TbRuleEngineQueueConsumerManager extends QueueConsumerManager, Queue> { +public class TbRuleEngineQueueConsumerManager extends MainQueueConsumerManager, Queue> { public static final String SUCCESSFUL_STATUS = "successful"; public static final String FAILED_STATUS = "failed"; diff --git a/application/src/main/java/org/thingsboard/server/service/queue/consumer/BasicQueueConsumerManager.java b/common/queue/src/main/java/org/thingsboard/server/queue/common/consumer/QueueConsumerManager.java similarity index 87% rename from application/src/main/java/org/thingsboard/server/service/queue/consumer/BasicQueueConsumerManager.java rename to common/queue/src/main/java/org/thingsboard/server/queue/common/consumer/QueueConsumerManager.java index 4b4866c6b4..bf103bef60 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/consumer/BasicQueueConsumerManager.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/common/consumer/QueueConsumerManager.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.server.service.queue.consumer; +package org.thingsboard.server.queue.common.consumer; import lombok.Builder; import lombok.Getter; @@ -29,12 +29,12 @@ import java.util.concurrent.ExecutorService; import java.util.function.Supplier; @Slf4j -public class BasicQueueConsumerManager { +public class QueueConsumerManager { private final String key; private final String name; - private final long pollInterval; private final MsgPackProcessor msgPackProcessor; + private final long pollInterval; private final ExecutorService consumerExecutor; @Getter @@ -42,11 +42,9 @@ public class BasicQueueConsumerManager { private volatile boolean stopped; @Builder - public BasicQueueConsumerManager(String key, String name, - long pollInterval, - MsgPackProcessor msgPackProcessor, - Supplier> consumerCreator, - ExecutorService consumerExecutor) { + public QueueConsumerManager(String key, String name, MsgPackProcessor msgPackProcessor, + long pollInterval, Supplier> consumerCreator, + ExecutorService consumerExecutor) { this.key = key; this.name = name; this.pollInterval = pollInterval; diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java index 8854ad3a7d..8f814ec052 100644 --- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java @@ -20,6 +20,8 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; import com.google.gson.Gson; import com.google.gson.JsonObject; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -96,6 +98,7 @@ import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.AsyncCallbackTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; +import org.thingsboard.server.queue.common.consumer.QueueConsumerManager; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.discovery.TopicService; @@ -105,14 +108,12 @@ import org.thingsboard.server.queue.scheduler.SchedulerComponent; import org.thingsboard.server.queue.util.AfterStartUp; import org.thingsboard.server.queue.util.TbTransportComponent; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.PreDestroy; -import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Random; +import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; @@ -179,19 +180,17 @@ public class DefaultTransportService extends TransportActivityManager implements protected TbQueueRequestTemplate, TbProtoQueueMsg> transportApiRequestTemplate; protected TbQueueProducer> ruleEngineMsgProducer; protected TbQueueProducer> tbCoreMsgProducer; - protected TbQueueConsumer> transportNotificationsConsumer; + protected QueueConsumerManager> transportNotificationsConsumer; protected MessagesStats ruleEngineProducerStats; protected MessagesStats tbCoreProducerStats; protected MessagesStats transportApiStats; protected ExecutorService transportCallbackExecutor; - private ExecutorService mainConsumerExecutor; + private ExecutorService consumerExecutor; private final Map toServerRpcPendingMap = new ConcurrentHashMap<>(); - private volatile boolean stopped = false; - public DefaultTransportService(PartitionService partitionService, TbServiceInfoProvider serviceInfoProvider, TbTransportQueueFactory queueProvider, @@ -232,42 +231,34 @@ public class DefaultTransportService extends TransportActivityManager implements transportApiRequestTemplate.setMessagesStats(transportApiStats); ruleEngineMsgProducer = producerProvider.getRuleEngineMsgProducer(); tbCoreMsgProducer = producerProvider.getTbCoreMsgProducer(); - transportNotificationsConsumer = queueProvider.createTransportNotificationsConsumer(); - TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, serviceInfoProvider.getServiceId()); - transportNotificationsConsumer.subscribe(Collections.singleton(tpi)); transportApiRequestTemplate.init(); - mainConsumerExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("transport-consumer")); + consumerExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("consumer")); + transportNotificationsConsumer = QueueConsumerManager.>builder() + .key("transport") + .name("TB Transport") + .msgPackProcessor(this::processNotificationMsgs) + .pollInterval(notificationsPollDuration) + .consumerCreator(queueProvider::createTransportNotificationsConsumer) + .consumerExecutor(consumerExecutor) + .build(); } @AfterStartUp(order = AfterStartUp.TRANSPORT_SERVICE) public void start() { - mainConsumerExecutor.execute(() -> { - while (!stopped) { - try { - List> records = transportNotificationsConsumer.poll(notificationsPollDuration); - if (records.size() == 0) { - continue; - } - records.forEach(record -> { - try { - processToTransportMsg(record.getValue()); - } catch (Throwable e) { - log.warn("Failed to process the notification.", e); - } - }); - transportNotificationsConsumer.commit(); - } catch (Exception e) { - if (!stopped) { - log.warn("Failed to obtain messages from queue.", e); - try { - Thread.sleep(notificationsPollDuration); - } catch (InterruptedException e2) { - log.trace("Failed to wait until the server has capacity to handle new requests", e2); - } - } - } + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, serviceInfoProvider.getServiceId()); + transportNotificationsConsumer.subscribe(Set.of(tpi)); + transportNotificationsConsumer.launch(); + } + + private void processNotificationMsgs(List> msgs, TbQueueConsumer> consumer) { + msgs.forEach(msg -> { + try { + processToTransportMsg(msg.getValue()); + } catch (Throwable e) { + log.warn("Failed to process the notification.", e); } }); + consumer.commit(); } private void invalidateRateLimits() { @@ -276,16 +267,14 @@ public class DefaultTransportService extends TransportActivityManager implements @PreDestroy public void destroy() { - stopped = true; - if (transportNotificationsConsumer != null) { - transportNotificationsConsumer.unsubscribe(); + transportNotificationsConsumer.stop(); } if (transportCallbackExecutor != null) { transportCallbackExecutor.shutdownNow(); } - if (mainConsumerExecutor != null) { - mainConsumerExecutor.shutdownNow(); + if (consumerExecutor != null) { + consumerExecutor.shutdownNow(); } if (transportApiRequestTemplate != null) { transportApiRequestTemplate.stop(); diff --git a/common/util/src/main/java/org/thingsboard/common/util/ThingsBoardThreadFactory.java b/common/util/src/main/java/org/thingsboard/common/util/ThingsBoardThreadFactory.java index dc263b80e7..4d0876bf8e 100644 --- a/common/util/src/main/java/org/thingsboard/common/util/ThingsBoardThreadFactory.java +++ b/common/util/src/main/java/org/thingsboard/common/util/ThingsBoardThreadFactory.java @@ -53,7 +53,7 @@ public class ThingsBoardThreadFactory implements ThreadFactory { public static void addThreadNamePrefix(String prefix) { String name = Thread.currentThread().getName(); - name = prefix + name; + name = prefix + "-" + name; Thread.currentThread().setName(name); } diff --git a/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java b/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java index edf998dc8e..a5a7021d8d 100644 --- a/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java +++ b/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java @@ -21,14 +21,13 @@ import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.checkerframework.checker.nullness.qual.Nullable; import org.eclipse.jgit.errors.LargeObjectException; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.event.EventListener; -import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.common.data.EntityType; @@ -68,16 +67,16 @@ import org.thingsboard.server.gen.transport.TransportProtos.VersionedEntityInfoP import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; +import org.thingsboard.server.queue.common.consumer.QueueConsumerManager; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.discovery.TbApplicationEventListener; import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.queue.provider.TbVersionControlQueueFactory; +import org.thingsboard.server.queue.util.AfterStartUp; import org.thingsboard.server.queue.util.TbVersionControlComponent; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.PreDestroy; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -115,9 +114,8 @@ public class DefaultClusterVersionControlService extends TbApplicationEventListe private final Map pendingCommitMap = new HashMap<>(); private volatile ExecutorService consumerExecutor; - private volatile TbQueueConsumer> consumer; + private volatile QueueConsumerManager> consumer; private volatile TbQueueProducer> producer; - private volatile boolean stopped = false; @Value("${queue.vc.poll-interval:25}") private long pollDuration; @@ -134,20 +132,26 @@ public class DefaultClusterVersionControlService extends TbApplicationEventListe @PostConstruct public void init() { - consumerExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("vc-consumer")); + consumerExecutor = Executors.newCachedThreadPool(ThingsBoardThreadFactory.forName("consumer")); var threadFactory = ThingsBoardThreadFactory.forName("vc-io-thread"); for (int i = 0; i < ioPoolSize; i++) { ioThreads.add(MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor(threadFactory))); } producer = producerProvider.getTbCoreNotificationsMsgProducer(); - consumer = queueFactory.createToVersionControlMsgConsumer(); + consumer = QueueConsumerManager.>builder() + .key("vc") + .name("TB Version Control") + .msgPackProcessor(this::processMsgs) + .pollInterval(pollDuration) + .consumerCreator(queueFactory::createToVersionControlMsgConsumer) + .consumerExecutor(consumerExecutor) + .build(); } @PreDestroy public void stop() { - stopped = true; if (consumer != null) { - consumer.unsubscribe(); + consumer.stop(); } if (consumerExecutor != null) { consumerExecutor.shutdownNow(); @@ -179,48 +183,29 @@ public class DefaultClusterVersionControlService extends TbApplicationEventListe return ServiceType.TB_VC_EXECUTOR.equals(event.getServiceType()); } - @EventListener(ApplicationReadyEvent.class) - @Order(value = 2) - public void onApplicationEvent(ApplicationReadyEvent event) { - consumerExecutor.execute(() -> consumerLoop(consumer)); + @AfterStartUp(order = 2) + public void afterStartUp() { + consumer.launch(); } - void consumerLoop(TbQueueConsumer> consumer) { - while (!stopped && !consumer.isStopped()) { - List> futures = new ArrayList<>(); - try { - List> msgs = consumer.poll(pollDuration); - if (msgs.isEmpty()) { - continue; - } - for (TbProtoQueueMsg msgWrapper : msgs) { - ToVersionControlServiceMsg msg = msgWrapper.getValue(); - var ctx = new VersionControlRequestCtx(msg, msg.hasClearRepositoryRequest() ? null : ProtoUtils.fromProto(msg.getVcSettings())); - long startTs = System.currentTimeMillis(); - log.trace("[{}][{}] RECEIVED task: {}", ctx.getTenantId(), ctx.getRequestId(), msg); - int threadIdx = Math.abs(ctx.getTenantId().hashCode() % ioPoolSize); - ListenableFuture future = ioThreads.get(threadIdx).submit(() -> processMessage(ctx, msg)); - logTaskExecution(ctx, future, startTs); - futures.add(future); - } - try { - Futures.allAsList(futures).get(packProcessingTimeout, TimeUnit.MILLISECONDS); - } catch (TimeoutException e) { - log.info("Timeout for processing the version control tasks.", e); - } - consumer.commit(); - } catch (Exception e) { - if (!stopped) { - log.warn("Failed to obtain version control requests from queue.", e); - try { - Thread.sleep(pollDuration); - } catch (InterruptedException e2) { - log.trace("Failed to wait until the server has capacity to handle new version control messages", e2); - } - } - } + void processMsgs(List> msgs, TbQueueConsumer> consumer) throws Exception { + List> futures = new ArrayList<>(); + for (TbProtoQueueMsg msgWrapper : msgs) { + ToVersionControlServiceMsg msg = msgWrapper.getValue(); + var ctx = new VersionControlRequestCtx(msg, msg.hasClearRepositoryRequest() ? null : ProtoUtils.fromProto(msg.getVcSettings())); + long startTs = System.currentTimeMillis(); + log.trace("[{}][{}] RECEIVED task: {}", ctx.getTenantId(), ctx.getRequestId(), msg); + int threadIdx = Math.abs(ctx.getTenantId().hashCode() % ioPoolSize); + ListenableFuture future = ioThreads.get(threadIdx).submit(() -> processMessage(ctx, msg)); + logTaskExecution(ctx, future, startTs); + futures.add(future); } - log.info("TB Version Control request consumer stopped."); + try { + Futures.allAsList(futures).get(packProcessingTimeout, TimeUnit.MILLISECONDS); + } catch (TimeoutException e) { + log.info("Timeout for processing the version control tasks.", e); + } + consumer.commit(); } private Void processMessage(VersionControlRequestCtx ctx, ToVersionControlServiceMsg msg) { @@ -273,7 +258,7 @@ public class DefaultClusterVersionControlService extends TbApplicationEventListe var ids = vcService.listEntitiesAtVersion(ctx.getTenantId(), request.getVersionId(), path) .stream().skip(request.getOffset()).limit(request.getLimit()).collect(Collectors.toList()); if (!ids.isEmpty()) { - for (int i = 0; i < ids.size(); i++){ + for (int i = 0; i < ids.size(); i++) { VersionedEntityInfo info = ids.get(i); var data = vcService.getFileContentAtCommit(ctx.getTenantId(), getRelativePath(info.getExternalId().getEntityType(), info.getExternalId().getId().toString()), request.getVersionId()); From 39cff913f21910effe2cab9edf426bed2dbe4ec9 Mon Sep 17 00:00:00 2001 From: nick Date: Sun, 5 May 2024 19:43:16 +0300 Subject: [PATCH 05/17] lwm2m: object-id-version --- ...ile-transport-configuration.component.html | 27 ++++--------------- ...ofile-transport-configuration.component.ts | 12 ++++++--- .../lwm2m/lwm2m-profile-config.models.ts | 16 +++++++++-- .../assets/locale/locale.constant-ar_AE.json | 5 +++- .../assets/locale/locale.constant-ca_ES.json | 5 +++- .../assets/locale/locale.constant-cs_CZ.json | 7 +++-- .../assets/locale/locale.constant-en_US.json | 5 +++- .../assets/locale/locale.constant-es_ES.json | 5 +++- .../assets/locale/locale.constant-nl_BE.json | 5 +++- .../assets/locale/locale.constant-pl_PL.json | 5 +++- .../assets/locale/locale.constant-tr_TR.json | 5 +++- .../assets/locale/locale.constant-zh_CN.json | 5 +++- .../assets/locale/locale.constant-zh_TW.json | 5 +++- 13 files changed, 69 insertions(+), 38 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.html b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.html index 677d45c6b0..4617c58275 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.html +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.html @@ -91,28 +91,11 @@ - {{ 'device-profile.lwm2m.composite-operations-support' | translate }} - - - - - - - - - - - - - - - - - - - - + + + {{ objectIDVerTranslationMap.get(objectIDVer) | translate}} + + diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.ts index b3516501cb..8655b70b6b 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.ts @@ -40,9 +40,11 @@ import { ObjectLwM2M, OBSERVE, PowerMode, + ObjectIDVer, RESOURCES, ServerSecurityConfig, - TELEMETRY + TELEMETRY, + ObjectIDVerTranslationMap } from './lwm2m-profile-config.models'; import { DeviceProfileService } from '@core/http/device-profile.service'; import { deepClone, isDefinedAndNotNull, isEmpty, isUndefined } from '@core/utils'; @@ -80,6 +82,10 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro lwm2mDeviceProfileFormGroup: UntypedFormGroup; configurationValue: Lwm2mProfileConfigModels; + + objectIDVers = Object.values(ObjectIDVer); + objectIDVerTranslationMap = ObjectIDVerTranslationMap; + sortFunction: (key: string, value: object) => object; get required(): boolean { @@ -117,7 +123,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro edrxCycle: [{disabled: true, value: 0}, Validators.required], psmActivityTimer: [{disabled: true, value: 0}, Validators.required], pagingTransmissionWindow: [{disabled: true, value: 0}, Validators.required], - compositeOperationsSupport: [false] + defaultObjectIDVer: [ObjectIDVer.V1_1, Validators.required] }) }); @@ -276,7 +282,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro pagingTransmissionWindow: this.configurationValue.clientLwM2mSettings.pagingTransmissionWindow || DEFAULT_PAGING_TRANSMISSION_WINDOW, psmActivityTimer: this.configurationValue.clientLwM2mSettings.psmActivityTimer || DEFAULT_PSM_ACTIVITY_TIMER, - compositeOperationsSupport: this.configurationValue.clientLwM2mSettings.compositeOperationsSupport || false + defaultObjectIDVer: this.configurationValue.clientLwM2mSettings.defaultObjectIDVer || ObjectIDVer.V1_1 } }, {emitEvent: false}); diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-profile-config.models.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-profile-config.models.ts index e5c292ef0a..79e9bb6514 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-profile-config.models.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-profile-config.models.ts @@ -122,6 +122,18 @@ export const PowerModeTranslationMap = new Map( ] ); +export enum ObjectIDVer { + V1_0 = '1.0', + V1_1 = '1.1' +} + +export const ObjectIDVerTranslationMap = new Map( + [ + [ObjectIDVer.V1_0, 'device-profile.lwm2m.default-object-id-ver.v1-0'], + [ObjectIDVer.V1_1, 'device-profile.lwm2m.default-object-id-ver.v1-1'] + ] +); + export interface ServerSecurityConfig { host?: string; port?: number; @@ -163,7 +175,7 @@ export interface ClientLwM2mSettings { edrxCycle?: number; pagingTransmissionWindow?: number; psmActivityTimer?: number; - compositeOperationsSupport: boolean; + defaultObjectIDVer: string; } export interface ObservableAttributes { @@ -190,7 +202,7 @@ export function getDefaultProfileClientLwM2mSettingsConfig(): ClientLwM2mSetting fwUpdateStrategy: 1, swUpdateStrategy: 1, powerMode: PowerMode.DRX, - compositeOperationsSupport: false + defaultObjectIDVer: ObjectIDVer.V1_1 }; } diff --git a/ui-ngx/src/assets/locale/locale.constant-ar_AE.json b/ui-ngx/src/assets/locale/locale.constant-ar_AE.json index 104eb18abd..30de473035 100644 --- a/ui-ngx/src/assets/locale/locale.constant-ar_AE.json +++ b/ui-ngx/src/assets/locale/locale.constant-ar_AE.json @@ -2079,7 +2079,10 @@ "min-evaluation-period": "الفترة الدنيا للتقييم", "max-evaluation-period": "الفترة القصوى للتقييم" }, - "composite-operations-support": "يدعم عمليات القراءة/الكتابة/المراقبة المركبة" + "default-object-id-ver": { + "v1-0": "\"1.0\" هي قيمة إصدار الكائن إذا كان إصدار الكائن فارغًا.", + "v1-1": "\"1.1\" هي قيمة إصدار الكائن إذا كان إصدار الكائن فارغًا." + } }, "snmp": { "add-communication-config": "إضافة تكوين الاتصال", diff --git a/ui-ngx/src/assets/locale/locale.constant-ca_ES.json b/ui-ngx/src/assets/locale/locale.constant-ca_ES.json index d530dae430..35f15ed95a 100644 --- a/ui-ngx/src/assets/locale/locale.constant-ca_ES.json +++ b/ui-ngx/src/assets/locale/locale.constant-ca_ES.json @@ -1711,7 +1711,10 @@ "min-evaluation-period": "Període mínim d'avaluació", "max-evaluation-period": "Període màxim d'avaluació" }, - "composite-operations-support": "Admet operacions compostes de lectura/escriptura/observació" + "default-object-id-ver": { + "v1-0": "\"1.0\" és el valor de la versió de l'objecte si la versió de l'objecte està buida.", + "v1-1": "\"1.1\" és el valor de la versió de l'objecte si la versió de l'objecte està buida." + } }, "snmp": { "add-communication-config": "Afegeix la configuració de comunicació", diff --git a/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json b/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json index fa23dddb45..6ee55ab303 100644 --- a/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json +++ b/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json @@ -1302,8 +1302,11 @@ "min-evaluation-period": "Minimální interval evaluace", "max-evaluation-period": "Maximální interval evaluace" }, - "composite-operations-support": "Podporuje kompozitní Read/Write/Observe operace" - }, + "default-object-id-ver": { + "v1-0": "\"1.0\" je hodnota verze objektu, pokud je verze objektu prázdná.", + "v1-1": "\"1.1\" je hodnota verze objektu, pokud je verze objektu prázdná." + } + }, "snmp": { "add-communication-config": "Přidat konfiguraci komunikace", "add-mapping": "Přidat mapování", diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json index b13d169cdc..feb6b7ea75 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -1899,7 +1899,10 @@ "min-evaluation-period": "Minimum evaluation period", "max-evaluation-period": "Maximum evaluation period" }, - "composite-operations-support": "Supports composite Read/Write/Observe operations" + "default-object-id-ver": { + "v1-0": "\"1.0\" is the object's version value if the object's version is empty.", + "v1-1": "\"1.1\" is the object's version value if the object's version is empty." + } }, "snmp": { "add-communication-config": "Add communication config", diff --git a/ui-ngx/src/assets/locale/locale.constant-es_ES.json b/ui-ngx/src/assets/locale/locale.constant-es_ES.json index e80fbf6c3e..0ecc2a54eb 100644 --- a/ui-ngx/src/assets/locale/locale.constant-es_ES.json +++ b/ui-ngx/src/assets/locale/locale.constant-es_ES.json @@ -1836,7 +1836,10 @@ "min-evaluation-period": "Período mínimo de evaluación", "max-evaluation-period": "Período máximo de evaluación" }, - "composite-operations-support": "Soporta operaciones Lectura/Escritura/Observación Compuestas" + "default-object-id-ver": { + "v1-0": "\"1.0\" es el valor de la versión del objeto si la versión del objeto está vacía.", + "v1-1": "\"1.1\" es el valor de la versión del objeto si la versión del objeto está vacía." + } }, "snmp": { "add-communication-config": "Añadir configuración de comunicaciones", diff --git a/ui-ngx/src/assets/locale/locale.constant-nl_BE.json b/ui-ngx/src/assets/locale/locale.constant-nl_BE.json index 4cd3bb1e49..223e896e61 100644 --- a/ui-ngx/src/assets/locale/locale.constant-nl_BE.json +++ b/ui-ngx/src/assets/locale/locale.constant-nl_BE.json @@ -1936,7 +1936,10 @@ "min-evaluation-period": "Minimale evaluatieperiode", "max-evaluation-period": "Maximale evaluatieperiode" }, - "composite-operations-support": "Ondersteunt samengestelde lees-/schrijf-/observatiebewerkingen" + "default-object-id-ver": { + "v1-0": "\"1.0\" is de versiewaarde van het object als de versie van het object leeg is..", + "v1-1": "\"1.1\" is de versiewaarde van het object als de versie van het object leeg is." + } }, "snmp": { "add-communication-config": "Communicatieconfiguratie toevoegen", diff --git a/ui-ngx/src/assets/locale/locale.constant-pl_PL.json b/ui-ngx/src/assets/locale/locale.constant-pl_PL.json index 58d4a0168f..d60314ed67 100644 --- a/ui-ngx/src/assets/locale/locale.constant-pl_PL.json +++ b/ui-ngx/src/assets/locale/locale.constant-pl_PL.json @@ -1873,7 +1873,10 @@ "min-evaluation-period":"Minimalny okres oceny", "max-evaluation-period":"Maksymalny okres oceny" }, - "composite-operations-support":"Obsługuje operacje złożone Odczyt/Zapis/Obserwacja" + "default-object-id-ver": { + "v1-0": "\"1.0\" to wartość wersji obiektu, jeśli wersja obiektu jest pusta.", + "v1-1": "\"1.1\" to wartość wersji obiektu, jeśli wersja obiektu jest pusta." + } }, "snmp":{ "add-communication-config":"Dodaj konfigurację komunikacji", diff --git a/ui-ngx/src/assets/locale/locale.constant-tr_TR.json b/ui-ngx/src/assets/locale/locale.constant-tr_TR.json index e516196b28..6b425eb2c5 100644 --- a/ui-ngx/src/assets/locale/locale.constant-tr_TR.json +++ b/ui-ngx/src/assets/locale/locale.constant-tr_TR.json @@ -1317,7 +1317,10 @@ "min-evaluation-period": "Minimum değerlendirme süresi", "max-evaluation-period": "Maksimum değerlendirme süresi" }, - "composite-operations-support": "İç içe Okuma/Yazma/Gözlemleme işlemlerini destekler" + "default-object-id-ver": { + "v1-0": "\"1.0\", nesnenin sürümü boşsa nesnenin sürüm değeridir.", + "v1-1": "\"1.1\", nesnenin sürümü boşsa nesnenin sürüm değeridir." + } }, "snmp": { "add-communication-config": "İletişim yapılandırması ekle", diff --git a/ui-ngx/src/assets/locale/locale.constant-zh_CN.json b/ui-ngx/src/assets/locale/locale.constant-zh_CN.json index 886151fdf2..ab4afacbc6 100644 --- a/ui-ngx/src/assets/locale/locale.constant-zh_CN.json +++ b/ui-ngx/src/assets/locale/locale.constant-zh_CN.json @@ -1873,7 +1873,10 @@ "min-evaluation-period": "最小评估周期", "max-evaluation-period": "最大评估周期" }, - "composite-operations-support": "支持复合读取/写入/观察操作" + "default-object-id-ver": { + "v1-0": "如果对象版本为空,则“1.0”是对象版本的值。", + "v1-1": "如果对象版本为空,则“1.1”是对象版本的值。" + } }, "snmp": { "add-communication-config": "添加通信配置", diff --git a/ui-ngx/src/assets/locale/locale.constant-zh_TW.json b/ui-ngx/src/assets/locale/locale.constant-zh_TW.json index eafc22498f..e215c8e87e 100644 --- a/ui-ngx/src/assets/locale/locale.constant-zh_TW.json +++ b/ui-ngx/src/assets/locale/locale.constant-zh_TW.json @@ -1511,7 +1511,10 @@ "min-evaluation-period": "最小評估期間", "max-evaluation-period": "最大評估期間" }, - "composite-operations-support": "支持複合讀/寫/觀察 操作" + "default-object-id-ver": { + "v1-0": "如果物件的版本為空,則「1.0」是物件的版本值。", + "v1-1": "如果物件的版本為空,則「1.1」是物件的版本值。" + } }, "snmp": { "add-communication-config": "新增通訊配置", From 405fe83e79ba6174f069bed8f2ba04d41789cffc Mon Sep 17 00:00:00 2001 From: nick Date: Sun, 5 May 2024 22:07:06 +0300 Subject: [PATCH 06/17] lwm2m: object-id-version format --- ...e-profile-transport-configuration.component.html | 13 ++++++++----- ui-ngx/src/assets/locale/locale.constant-ar_AE.json | 1 + ui-ngx/src/assets/locale/locale.constant-ca_ES.json | 1 + ui-ngx/src/assets/locale/locale.constant-cs_CZ.json | 1 + ui-ngx/src/assets/locale/locale.constant-en_US.json | 1 + ui-ngx/src/assets/locale/locale.constant-es_ES.json | 1 + ui-ngx/src/assets/locale/locale.constant-nl_BE.json | 3 ++- ui-ngx/src/assets/locale/locale.constant-pl_PL.json | 1 + ui-ngx/src/assets/locale/locale.constant-tr_TR.json | 1 + ui-ngx/src/assets/locale/locale.constant-zh_CN.json | 1 + ui-ngx/src/assets/locale/locale.constant-zh_TW.json | 1 + 11 files changed, 19 insertions(+), 6 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.html b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.html index 4617c58275..6290048f62 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.html +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.html @@ -91,11 +91,14 @@ - - - {{ objectIDVerTranslationMap.get(objectIDVer) | translate}} - - +
+ device-profile.lwm2m.default-object-id + + + {{ objectIDVerTranslationMap.get(objectIDVer) | translate}} + + +
diff --git a/ui-ngx/src/assets/locale/locale.constant-ar_AE.json b/ui-ngx/src/assets/locale/locale.constant-ar_AE.json index 30de473035..a9a7813b80 100644 --- a/ui-ngx/src/assets/locale/locale.constant-ar_AE.json +++ b/ui-ngx/src/assets/locale/locale.constant-ar_AE.json @@ -2079,6 +2079,7 @@ "min-evaluation-period": "الفترة الدنيا للتقييم", "max-evaluation-period": "الفترة القصوى للتقييم" }, + "default-object-id": "إصدار الكائن الافتراضي (السمة)", "default-object-id-ver": { "v1-0": "\"1.0\" هي قيمة إصدار الكائن إذا كان إصدار الكائن فارغًا.", "v1-1": "\"1.1\" هي قيمة إصدار الكائن إذا كان إصدار الكائن فارغًا." diff --git a/ui-ngx/src/assets/locale/locale.constant-ca_ES.json b/ui-ngx/src/assets/locale/locale.constant-ca_ES.json index 35f15ed95a..f6a20d00d9 100644 --- a/ui-ngx/src/assets/locale/locale.constant-ca_ES.json +++ b/ui-ngx/src/assets/locale/locale.constant-ca_ES.json @@ -1711,6 +1711,7 @@ "min-evaluation-period": "Període mínim d'avaluació", "max-evaluation-period": "Període màxim d'avaluació" }, + "default-object-id": "Versió de l'objecte predeterminat (atribut)", "default-object-id-ver": { "v1-0": "\"1.0\" és el valor de la versió de l'objecte si la versió de l'objecte està buida.", "v1-1": "\"1.1\" és el valor de la versió de l'objecte si la versió de l'objecte està buida." diff --git a/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json b/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json index 6ee55ab303..75d8bc0360 100644 --- a/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json +++ b/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json @@ -1302,6 +1302,7 @@ "min-evaluation-period": "Minimální interval evaluace", "max-evaluation-period": "Maximální interval evaluace" }, + "default-object-id": "VVýchozí verze objektu (atribut)", "default-object-id-ver": { "v1-0": "\"1.0\" je hodnota verze objektu, pokud je verze objektu prázdná.", "v1-1": "\"1.1\" je hodnota verze objektu, pokud je verze objektu prázdná." diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json index feb6b7ea75..e59fb8fdd6 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -1899,6 +1899,7 @@ "min-evaluation-period": "Minimum evaluation period", "max-evaluation-period": "Maximum evaluation period" }, + "default-object-id": "Default object Version (Attribute)", "default-object-id-ver": { "v1-0": "\"1.0\" is the object's version value if the object's version is empty.", "v1-1": "\"1.1\" is the object's version value if the object's version is empty." diff --git a/ui-ngx/src/assets/locale/locale.constant-es_ES.json b/ui-ngx/src/assets/locale/locale.constant-es_ES.json index 0ecc2a54eb..9e6b57536f 100644 --- a/ui-ngx/src/assets/locale/locale.constant-es_ES.json +++ b/ui-ngx/src/assets/locale/locale.constant-es_ES.json @@ -1836,6 +1836,7 @@ "min-evaluation-period": "Período mínimo de evaluación", "max-evaluation-period": "Período máximo de evaluación" }, + "default-object-id": "Versión de objeto predeterminada (atributo)", "default-object-id-ver": { "v1-0": "\"1.0\" es el valor de la versión del objeto si la versión del objeto está vacía.", "v1-1": "\"1.1\" es el valor de la versión del objeto si la versión del objeto está vacía." diff --git a/ui-ngx/src/assets/locale/locale.constant-nl_BE.json b/ui-ngx/src/assets/locale/locale.constant-nl_BE.json index 223e896e61..acdebb0bfc 100644 --- a/ui-ngx/src/assets/locale/locale.constant-nl_BE.json +++ b/ui-ngx/src/assets/locale/locale.constant-nl_BE.json @@ -1936,8 +1936,9 @@ "min-evaluation-period": "Minimale evaluatieperiode", "max-evaluation-period": "Maximale evaluatieperiode" }, + "default-object-id": "Standaard objectversie (attribuut)", "default-object-id-ver": { - "v1-0": "\"1.0\" is de versiewaarde van het object als de versie van het object leeg is..", + "v1-0": "\"1.0\" is de versiewaarde van het object als de versie van het object leeg is.", "v1-1": "\"1.1\" is de versiewaarde van het object als de versie van het object leeg is." } }, diff --git a/ui-ngx/src/assets/locale/locale.constant-pl_PL.json b/ui-ngx/src/assets/locale/locale.constant-pl_PL.json index d60314ed67..85dd037de6 100644 --- a/ui-ngx/src/assets/locale/locale.constant-pl_PL.json +++ b/ui-ngx/src/assets/locale/locale.constant-pl_PL.json @@ -1873,6 +1873,7 @@ "min-evaluation-period":"Minimalny okres oceny", "max-evaluation-period":"Maksymalny okres oceny" }, + "default-object-id": "Domyślna wersja obiektu (atrybut)", "default-object-id-ver": { "v1-0": "\"1.0\" to wartość wersji obiektu, jeśli wersja obiektu jest pusta.", "v1-1": "\"1.1\" to wartość wersji obiektu, jeśli wersja obiektu jest pusta." diff --git a/ui-ngx/src/assets/locale/locale.constant-tr_TR.json b/ui-ngx/src/assets/locale/locale.constant-tr_TR.json index 6b425eb2c5..b6cab6695a 100644 --- a/ui-ngx/src/assets/locale/locale.constant-tr_TR.json +++ b/ui-ngx/src/assets/locale/locale.constant-tr_TR.json @@ -1317,6 +1317,7 @@ "min-evaluation-period": "Minimum değerlendirme süresi", "max-evaluation-period": "Maksimum değerlendirme süresi" }, + "default-object-id": "Varsayılan Nesne Sürümü (Öznitelik)", "default-object-id-ver": { "v1-0": "\"1.0\", nesnenin sürümü boşsa nesnenin sürüm değeridir.", "v1-1": "\"1.1\", nesnenin sürümü boşsa nesnenin sürüm değeridir." diff --git a/ui-ngx/src/assets/locale/locale.constant-zh_CN.json b/ui-ngx/src/assets/locale/locale.constant-zh_CN.json index ab4afacbc6..8e45dcf705 100644 --- a/ui-ngx/src/assets/locale/locale.constant-zh_CN.json +++ b/ui-ngx/src/assets/locale/locale.constant-zh_CN.json @@ -1873,6 +1873,7 @@ "min-evaluation-period": "最小评估周期", "max-evaluation-period": "最大评估周期" }, + "default-object-id": "默认对象版本(属性", "default-object-id-ver": { "v1-0": "如果对象版本为空,则“1.0”是对象版本的值。", "v1-1": "如果对象版本为空,则“1.1”是对象版本的值。" diff --git a/ui-ngx/src/assets/locale/locale.constant-zh_TW.json b/ui-ngx/src/assets/locale/locale.constant-zh_TW.json index e215c8e87e..b2e874fb2e 100644 --- a/ui-ngx/src/assets/locale/locale.constant-zh_TW.json +++ b/ui-ngx/src/assets/locale/locale.constant-zh_TW.json @@ -1511,6 +1511,7 @@ "min-evaluation-period": "最小評估期間", "max-evaluation-period": "最大評估期間" }, + "default-object-id": "預設物件版本(屬性)", "default-object-id-ver": { "v1-0": "如果物件的版本為空,則「1.0」是物件的版本值。", "v1-1": "如果物件的版本為空,則「1.1」是物件的版本值。" From 4eba0ada30e43cf0826f9a03e8ca48996f689e91 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Mon, 6 May 2024 09:27:59 +0300 Subject: [PATCH 07/17] UI: Reset translations --- .../assets/locale/locale.constant-ar_AE.json | 5 - .../assets/locale/locale.constant-pl_PL.json | 14250 +++++++++------- 2 files changed, 7765 insertions(+), 6490 deletions(-) diff --git a/ui-ngx/src/assets/locale/locale.constant-ar_AE.json b/ui-ngx/src/assets/locale/locale.constant-ar_AE.json index a9a7813b80..ae02012787 100644 --- a/ui-ngx/src/assets/locale/locale.constant-ar_AE.json +++ b/ui-ngx/src/assets/locale/locale.constant-ar_AE.json @@ -2078,11 +2078,6 @@ "step": "خطوة", "min-evaluation-period": "الفترة الدنيا للتقييم", "max-evaluation-period": "الفترة القصوى للتقييم" - }, - "default-object-id": "إصدار الكائن الافتراضي (السمة)", - "default-object-id-ver": { - "v1-0": "\"1.0\" هي قيمة إصدار الكائن إذا كان إصدار الكائن فارغًا.", - "v1-1": "\"1.1\" هي قيمة إصدار الكائن إذا كان إصدار الكائن فارغًا." } }, "snmp": { diff --git a/ui-ngx/src/assets/locale/locale.constant-pl_PL.json b/ui-ngx/src/assets/locale/locale.constant-pl_PL.json index 85dd037de6..a46c732c6f 100644 --- a/ui-ngx/src/assets/locale/locale.constant-pl_PL.json +++ b/ui-ngx/src/assets/locale/locale.constant-pl_PL.json @@ -1,5164 +1,6520 @@ { - "access":{ - "unauthorized":"Unauthorized", - "unauthorized-access":"Unauthorized Access", - "unauthorized-access-text":"You should sign in to have access to this resource!", - "access-forbidden":"Access Forbidden", - "access-forbidden-text":"You haven't access rights to this location!
Try to sign in with different user if you still wish to gain access to this location.", - "refresh-token-expired":"Session has expired", - "refresh-token-failed":"Unable to refresh session", - "permission-denied":"Permission Denied", - "permission-denied-text":"You don't have permission to perform this operation!" + "access": { + "unauthorized": "Nieautoryzowany", + "unauthorized-access": "Nieautoryzowany dostęp", + "unauthorized-access-text": "Aby mieć dostęp do tego zasobu, musisz się zalogować!", + "access-forbidden": "Dostęp Zabroniony", + "access-forbidden-text": "Nie masz praw dostępu do tej lokalizacji!
Spróbuj zalogować się przy użyciu innego użytkownika, jeśli nadal chcesz uzyskać dostęp do tej lokalizacji.", + "refresh-token-expired": "Sesja wygasła", + "refresh-token-failed": "Nie można odświeżyć sesji", + "permission-denied": "Odmowa pozwolenia", + "permission-denied-text": "Nie masz uprawnień do wykonania tej operacji!" }, - "account":{ - "account":"Konto", - "notification-settings":"Ustawienia powiadomień" + "account": { + "account": "Konto", + "notification-settings": "Ustawienia notyfikacji" }, - "action":{ - "activate":"Aktywuj", - "suspend":"Zawieś", - "save":"Zapisz", - "saveAs":"Zapisz jako", - "move":"Przenieś", - "cancel":"Anuluj", - "ok":"OK", - "delete":"Usuń", - "add":"Dodaj", - "yes":"Tak", - "no":"Nie", - "update":"Aktualizuj", - "remove":"Usuń", - "select":"Wybierz", - "search":"Szukaj", - "clear-search":"Wyczyść wyszukiwanie", - "assign":"Przypisz", - "unassign":"Cofnij przypisanie", - "share":"Udostępnij", - "make-private":"Uczyń prywatnym", - "apply":"Zastosuj", - "apply-changes":"Zastosuj zmiany", - "edit-mode":"Tryb edycji", - "enter-edit-mode":"Wejdź w tryb edycji", - "decline-changes":"Odrzuć zmiany", - "decline":"Odrzuć", - "close":"Zamknij", - "back":"Wstecz", - "run":"Uruchom", - "sign-in":"Zaloguj się!", - "edit":"Edytuj", - "view":"Zobacz", - "create":"Utwórz", - "drag":"Przeciągnij", - "refresh":"Odśwież", - "undo":"Cofnij", - "copy":"Kopiuj", - "paste":"Wklej", - "copy-reference":"Kopiuj odniesienie", - "paste-reference":"Wklej odniesienie", - "import":"Importuj", - "export":"Eksportuj", - "share-via":"Udostępnij przez {{provider}}", - "continue":"Kontynuuj", - "discard-changes":"Porzuć zmiany", - "download":"Pobierz", - "next":"Dalej", - "next-with-label":"Następne: {{label}}", - "read-more":"Czytaj więcej", - "hide":"Ukryj", - "done":"Gotowe", - "print":"Drukuj", - "restore":"Przywróć", - "confirm":"Potwierdź", - "more":"Więcej", - "less":"Mniej", - "skip":"Pomiń", - "send":"Wyślij", - "reset":"Resetuj", - "show-more":"Pokaż więcej", - "dont-show-again":"Nie pokazuj ponownie", - "see-documentation":"Zobacz dokumentację", - "clear":"Wyczyść", - "upload":"Prześlij", - "delete-anyway":"Usuń mimo wszystko", - "delete-selected":"Usuń wybrane" + "action": { + "activate": "Aktywuj", + "suspend": "Wstrzymaj", + "save": "Zapisz", + "saveAs": "Zapisz jako", + "move": "Przenieś", + "cancel": "Anuluj", + "ok": "OK", + "delete": "Usuń", + "add": "Dodaj", + "yes": "Tak", + "no": "Nie", + "update": "Aktualizuj", + "remove": "Usuń", + "search": "Szukaj", + "clear-search": "Wyczyść wyszukiwanie", + "assign": "Przypisz", + "unassign": "Anuluj przypisanie", + "share": "Udostępnij", + "make-private": "Uczyń prywatnym", + "make-public": "Upublicznij", + "apply": "Zastosuj", + "apply-changes": "Zastosuj zmiany", + "edit-mode": "Tryb edycji", + "enter-edit-mode": "Wejdź w tryb edycji", + "decline-changes": "Odrzuć zmiany", + "open": "Otwórz", + "decline": "Decline", + "close": "Zamknij", + "back": "Wstecz", + "run": "Uruchom", + "sign-in": "Zaloguj się!", + "edit": "Edytuj", + "view": "Pogląd", + "create": "Utwórz", + "drag": "Przeciągnij", + "refresh": "Odśwież", + "undo": "Cofnij", + "copy": "Kopiuj", + "paste": "Wklej", + "copy-reference": "Skopiuj odnośnik", + "paste-reference": "Wklej odnośnik", + "import": "Importuj", + "export": "Eksportuj", + "share-via": "Udostępnij przez {{provider}}", + "select": "Wybierz", + "continue": "Kontynuuj", + "discard-changes": "Odrzuć zmiany", + "download": "Pobierz", + "next": "Dalej", + "next-with-label": "Dalej: {{label}}", + "read-more": "Czytaj więcej", + "hide": "Ukryj", + "done": "Gotowe", + "print": "Drukuj", + "restore": "Przywróć", + "confirm": "Potwierdź", + "more": "Więcej", + "less": "Mniej", + "skip": "Pomiń", + "send": "Wyślij", + "reset": "Reset", + "show-more": "Pokaż więcej", + "dont-show-again": "Nie pokazuj więcej", + "see-documentation": "Zobacz dokumentację", + "clear": "Clear" }, - "aggregation":{ - "aggregation":"Agregacja", - "function":"Funkcja agregacji danych", - "limit":"Maksymalna liczba wartości", - "group-interval":"Interwał grupowania", - "min":"Min", - "max":"Maks", - "avg":"Średnia", - "sum":"Suma", - "count":"Liczba", - "none":"Brak" + "aggregation": { + "aggregation": "Zbiór", + "function": "Funkcja zbioru danych", + "limit": "Wartości maksymalne", + "group-interval": "Interwał grupowania", + "min": "Minimum", + "max": "Maksimum", + "avg": "Średnia", + "sum": "Suma", + "count": "Ilość", + "none": "Brak" }, - "admin":{ - "settings":"Ustawienia", - "general":"Ogólne", - "general-settings":"Ustawienia Ogólne", - "home-settings":"Ustawienia Strony Głównej", - "home":"Strona Główna", - "outgoing-mail":"Serwer poczty", - "outgoing-mail-settings":"Ustawienia Serwera Poczty Wychodzącej", - "system-settings":"Ustawienia Systemowe", - "test-mail-sent":"Testowy email został wysłany pomyślnie!", - "base-url":"Podstawowy URL", - "base-url-required":"Podstawowy URL jest wymagany.", - "prohibit-different-url":"Zabroń używania nazwy hosta z nagłówków żądania klienta", - "prohibit-different-url-hint":"Ta opcja powinna być włączona w środowiskach produkcyjnych. Może powodować problemy bezpieczeństwa, gdy jest wyłączona", - "device-connectivity":{ - "device-connectivity":"Łączność urządzenia", - "http-s":"HTTP(s)", - "mqtt-s":"MQTT(s)", - "coap-s":"COAP(s)", - "http":"HTTP", - "https":"HTTPs", - "mqtt":"MQTT", - "mqtts":"MQTTs", - "coap":"COAP", - "coaps":"COAPs", - "hint":"Jeśli pola hosta lub portu są puste, zostanie użyta domyślna wartość protokołu.", - "host":"Host", - "port":"Port", - "port-pattern":"Port musi być dodatnią liczbą całkowitą.", - "port-range":"Port powinien mieścić się w zakresie od 1 do 65535." + "admin": { + "settings": "Ustawienia", + "general": "Ogólne", + "general-settings": "Ustawienia ogólne", + "home-settings": "Ustawienia strony głównej", + "home": "Strona główna", + "outgoing-mail": "Serwer poczty", + "outgoing-mail-settings": "Ustawienia serwera poczty wychodzącej", + "system-settings": "Ustawienia systemowe", + "test-mail-sent": "Testowa wiadomość została pomyślnie wysłana!", + "base-url": "Bazowy adres URL", + "base-url-required": "Bazowy adres URL jest wymagany.", + "prohibit-different-url": "Zabroń używania nazwy hosta z nagłówków żądań klienta", + "prohibit-different-url-hint": "To ustawienie powinno być włączone w środowiskach produkcyjnych. Po wyłączeniu może powodować problemy z bezpieczeństwem.", + "mail-from": "Adres E-Mail nadawcy", + "mail-from-required": "Adres E-Mail nadawcy jest wymagany.", + "smtp-protocol": "Protokół SMTP", + "smtp-host": "Host SMTP", + "smtp-host-required": "Host SMTP jest wymagany.", + "smtp-port": "Port SMTP", + "smtp-port-required": "Musisz podać port smtp.", + "smtp-port-invalid": "To nie wygląda na prawidłowy port smtp.", + "timeout-msec": "Limit czasu (ms)", + "timeout-required": "Limit czasu jest wymagany.", + "timeout-invalid": "To nie wygląda na prawidłowy limit czasu.", + "enable-tls": "Włącz TLS", + "tls-version": "Wersja TLS", + "enable-proxy": "Włącz serwer proxy", + "proxy-host": "Host proxy", + "proxy-host-required": "Host proxy jest wymagany.", + "proxy-port": "Port proxy", + "proxy-port-required": "Port proxy jest wymagany.", + "proxy-port-range": "Port proxy powinien należeć do zakresu od 1 do 65535.", + "proxy-user": "Użytkownik proxy", + "proxy-password": "Hasło proxy", + "change-password": "Zmień hasło", + "send-test-mail": "Wyślij wiadomość testową", + "use-system-mail-settings": "Użyj ustawień serwera poczty systemowej", + "mail-templates": "Szablony wiadomości", + "mail-template-settings": "Ustawienia szablonów wiadomości", + "use-system-mail-template-settings": "Użyj systemowych szablonów wiadomości", + "mail-template": { + "mail-template": "Szablon wiadomości", + "test": "Testowa wiadomość e-mail", + "activation": "Wiadomość o aktywacji konta", + "account-activated": "Wiadomość o aktywacji konta", + "account-lockout": "Komunikat o blokadzie konta", + "reset-password": "Zresetuj wiadomość dotyczącą hasła", + "password-was-reset": "Komunikat o zresetowaniu hasła", + "user-activated": "Wiadomość aktywowana przez użytkownika", + "user-registered": "Wiadomość zarejestrowana przez użytkownika", + "api-usage-state-enabled": "Stan użycia interfejsu API włączony", + "api-usage-state-warning": "Ostrzeżenie o stanie użycia interfejsu API", + "api-usage-state-disabled": "Stan użycia interfejsu API wyłączony", + "two-fa-verification": "Wiadomość weryfikacyjna 2FA" }, - "mail-from":"Nadawca", - "mail-from-required":"Nadawca jest wymagany.", - "smtp-protocol":"Protokół SMTP", - "smtp-host":"Host SMTP", - "smtp-host-required":"Host SMTP jest wymagany.", - "smtp-port":"Port SMTP", - "smtp-port-required":"Musisz podać port SMTP.", - "smtp-port-invalid":"To nie wygląda na prawidłowy port SMTP.", - "timeout-msec":"Limit czasu (ms)", - "timeout-required":"Limit czasu jest wymagany.", - "timeout-invalid":"To nie wygląda na prawidłowy limit czasu.", - "enable-tls":"Włącz TLS", - "tls-version":"Wersja TLS", - "enable-proxy":"Włącz proxy", - "proxy-host":"Host proxy", - "proxy-host-required":"Host proxy jest wymagany.", - "proxy-port":"Port proxy", - "proxy-port-required":"Port proxy jest wymagany.", - "proxy-port-range":"Port proxy powinien znajdować się w zakresie od 1 do 65535.", - "proxy-user":"Użytkownik proxy", - "proxy-password":"Hasło proxy", - "change-password":"Zmień hasło", - "send-test-mail":"Wyślij mail testowy", - "sms-provider":"Dostawca SMS", - "sms-provider-settings":"Ustawienia dostawcy SMS", - "sms-provider-type":"Typ dostawcy SMS", - "sms-provider-type-required":"Typ dostawcy SMS jest wymagany.", - "sms-provider-type-aws-sns":"Amazon SNS", - "sms-provider-type-twilio":"Twilio", - "sms-provider-type-smpp":"SMPP", - "aws-access-key-id":"ID klucza dostępu AWS", - "aws-access-key-id-required":"ID klucza dostępu AWS jest wymagane", - "aws-secret-access-key":"Tajny klucz dostępu AWS", - "aws-secret-access-key-required":"Tajny klucz dostępu AWS jest wymagany", - "aws-region":"Region AWS", - "aws-region-required":"Region AWS jest wymagany", - "number-from":"Numer telefonu nadawcy", - "number-from-required":"Numer telefonu nadawcy jest wymagany.", - "number-to":"Numer telefonu odbiorcy", - "number-to-required":"Numer telefonu odbiorcy jest wymagany.", - "phone-number-hint":"Numer telefonu w formacie E.164, np. +19995550123", - "phone-number-hint-twilio":"Numer telefonu w formacie E.164/Numer SID telefonu/SID usługi wiadomości, np. +19995550123/PNXXX/MGXXX", - "phone-number-pattern":"Nieprawidłowy numer telefonu. Powinien być w formacie E.164, np. +19995550123.", - "phone-number-pattern-twilio":"Nieprawidłowy numer telefonu. Powinien być w formacie E.164/Numer SID telefonu/SID usługi wiadomości, np. +19995550123/PNXXX/MGXXX.", - "sms-message":"Wiadomość SMS", - "sms-message-required":"Wiadomość SMS jest wymagana.", - "sms-message-max-length":"Wiadomość SMS nie może być dłuższa niż 1600 znaków", - "twilio-account-sid":"SID konta Twilio", - "twilio-account-sid-required":"SID konta Twilio jest wymagany", - "twilio-account-token":"Token konta Twilio", - "twilio-account-token-required":"Token konta Twilio jest wymagany", - "send-test-sms":"Wyślij testowego SMS-a", - "test-sms-sent":"Testowy SMS został wysłany pomyślnie!", - "security-settings":"Ustawienia bezpieczeństwa", - "password-policy":"Polityka haseł", - "minimum-password-length":"Minimalna długość hasła", - "minimum-password-length-required":"Minimalna długość hasła jest wymagana", - "minimum-password-length-range":"Minimalna długość hasła powinna wynosić od 6 do 50", - "maximum-password-length":"Maksymalna długość hasła", - "maximum-password-length-min":"Maksymalna długość hasła powinna wynosić co najmniej 6", - "maximum-password-length-less-min":"Maksymalna długość hasła powinna być większa niż minimalna długość", - "minimum-uppercase-letters":"Minimalna liczba wielkich liter", - "minimum-uppercase-letters-range":"Minimalna liczba wielkich liter nie może być ujemna", - "minimum-lowercase-letters":"Minimalna liczba małych liter", - "minimum-lowercase-letters-range":"Minimalna liczba małych liter nie może być ujemna", - "minimum-digits":"Minimalna liczba cyfr", - "minimum-digits-range":"Minimalna liczba cyfr nie może być ujemna", - "minimum-special-characters":"Minimalna liczba znaków specjalnych", - "minimum-special-characters-range":"Minimalna liczba znaków specjalnych nie może być ujemna", - "password-expiration-period-days":"Okres ważności hasła w dniach", - "password-expiration-period-days-range":"Okres ważności hasła w dniach nie może być ujemny", - "password-reuse-frequency-days":"Częstotliwość ponownego używania hasła w dniach", - "password-reuse-frequency-days-range":"Częstotliwość ponownego używania hasła w dniach nie może być ujemna", - "allow-whitespace":"Zezwól na białe znaki", - "force-reset-password-if-no-valid":"Wymuś zresetowanie hasła, jeśli nie jest ważne", - "force-reset-password-if-no-valid-hint":"Ostrożnie z włączeniem tej funkcji: będzie wymagać od użytkowników z nieaktualnymi hasłami resetowania ich poprzez email.", - "general-policy":"Ogólna polityka", - "max-failed-login-attempts":"Maksymalna liczba nieudanych prób", - "minimum-max-failed-login-attempts-range":"Maksymalna liczba nieudanych prób logowania nie może być ujemna", - "user-lockout-notification-email":"W przypadku zablokowania konta użytkownika, wyślij powiadomienie na email", - "domain-name":"Nazwa domeny", - "domain-name-unique":"Nazwa domeny i protokół muszą być unikalne.", - "domain-name-max-length":"Nazwa domeny powinna być krótsza niż 256", - "error-verification-url":"Nazwa domeny nie powinna zawierać symboli '/' i ':'. Przykład: thingsboard.io", - "connection-settings":"Ustawienia połączenia", - "oauth2":{ - "access-token-uri":"URI tokenu dostępu", - "access-token-uri-required":"URI tokenu dostępu jest wymagane.", - "activate-user":"Aktywuj użytkownika", - "add-domain":"Dodaj domenę", - "delete-domain":"Usuń domenę", - "add-provider":"Dodaj dostawcę", - "delete-provider":"Usuń dostawcę", - "allow-user-creation":"Zezwalaj na tworzenie użytkowników", - "always-fullscreen":"Zawsze na pełnym ekranie", - "authorization-uri":"URI autoryzacji", - "authorization-uri-required":"URI autoryzacji jest wymagane.", - "client-authentication-method":"Metoda uwierzytelnienia klienta", - "client-id":"ID klienta", - "client-id-required":"ID klienta jest wymagane.", - "client-id-max-length":"ID klienta powinno być krótsze niż 256", - "client-secret":"Sekret klienta", - "client-secret-required":"Sekret klienta jest wymagany.", - "client-secret-max-length":"Sekret klienta powinien być krótszy niż 2049", - "custom-setting":"Niestandardowe ustawienia", - "customer-name-pattern":"Wzorzec nazwy klienta", - "customer-name-pattern-max-length":"Wzorzec nazwy klienta powinien być krótszy niż 256", - "default-dashboard-name":"Domyślna nazwa pulpitu nawigacyjnego", - "default-dashboard-name-max-length":"Domyślna nazwa pulpitu nawigacyjnego powinna być krótsza niż 256", - "delete-domain-text":"Uważaj, po potwierdzeniu domena i wszystkie dane dostawcy będą niedostępne.", - "delete-domain-title":"Czy na pewno chcesz usunąć ustawienia domeny '{{domainName}}'?", - "delete-registration-text":"Uważaj, po potwierdzeniu dane dostawcy będą niedostępne.", - "delete-registration-title":"Czy na pewno chcesz usunąć dostawcę '{{name}}'?", - "email-attribute-key":"Klucz atrybutu email", - "email-attribute-key-required":"Klucz atrybutu email jest wymagany.", - "email-attribute-key-max-length":"Klucz atrybutu email powinien być krótszy niż 32", - "first-name-attribute-key":"Klucz atrybutu imienia", - "first-name-attribute-key-max-length":"Klucz atrybutu imienia powinien być krótszy niż 32", - "general":"Ogólne", - "jwk-set-uri":"URI klucza Web JSON", - "last-name-attribute-key":"Klucz atrybutu nazwiska", - "last-name-attribute-key-max-length":"Klucz atrybutu nazwiska powinien być krótszy niż 32", - "login-button-icon":"Ikona przycisku logowania", - "login-button-label":"Etykieta dostawcy", - "login-button-label-placeholder":"Zaloguj się przez $(Etykieta dostawcy)", - "login-button-label-required":"Etykieta jest wymagana.", - "login-provider":"Dostawca logowania", - "mapper":"Mapper", - "new-domain":"Nowa domena", - "oauth2":"OAuth2", - "password-max-length":"Hasło powinno być krótsze niż 256", - "redirect-uri-template":"Szablon URI przekierowania", - "copy-redirect-uri":"Kopiuj URI przekierowania", - "registration-id":"ID rejestracji", - "registration-id-required":"ID rejestracji jest wymagane.", - "registration-id-unique":"ID rejestracji musi być unikalne dla systemu.", - "scope":"Zakres", - "scope-required":"Zakres jest wymagany.", - "tenant-name-pattern":"Wzorzec nazwy dzierżawcy", - "tenant-name-pattern-required":"Wzorzec nazwy dzierżawcy jest wymagany.", - "tenant-name-pattern-max-length":"Wzorzec nazwy dzierżawcy powinien być krótszy niż 256", - "tenant-name-strategy":"Strategia nazewnictwa dzierżawcy", - "type":"Typ mappera", - "uri-pattern-error":"Nieprawidłowy format URI.", - "url":"URL", - "url-pattern":"Nieprawidłowy format URL.", - "url-required":"URL jest wymagany.", - "url-max-length":"URL powinien być krótszy niż 256", - "user-info-uri":"URI informacji o użytkowniku", - "user-info-uri-required":"URI informacji o użytkowniku jest wymagane.", - "username-max-length":"Nazwa użytkownika powinna być krótsza niż 256", - "user-name-attribute-name":"Klucz atrybutu nazwy użytkownika", - "user-name-attribute-name-required":"Klucz atrybutu nazwy użytkownika jest wymagany", - "protocol":"Protokół", - "domain-schema-http":"HTTP", - "domain-schema-https":"HTTPS", - "domain-schema-mixed":"HTTP+HTTPS", - "enable":"Włącz ustawienia OAuth2", - "domains":"Domeny", - "mobile-apps":"Aplikacje mobilne", - "no-mobile-apps":"Brak skonfigurowanych aplikacji", - "mobile-package":"Pakiet aplikacji", - "mobile-package-placeholder":"Np.: my.example.app", - "mobile-package-hint":"Dla Androida: unikalny ID aplikacji. Dla iOS: identyfikator paczki produktu.", - "mobile-package-unique":"Pakiet aplikacji musi być unikalny.", - "mobile-app-secret":"Sekret aplikacji", - "invalid-mobile-app-secret":"Sekret aplikacji musi zawierać tylko znaki alfanumeryczne i mieć od 16 do 2048 znaków.", - "copy-mobile-app-secret":"Kopiuj sekret aplikacji", - "add-mobile-app":"Dodaj aplikację", - "delete-mobile-app":"Usuń informacje o aplikacji", - "providers":"Dostawcy", - "platform-web":"Web", - "platform-android":"Android", - "platform-ios":"iOS", - "all-platforms":"Wszystkie platformy", - "smtp-provider":"Dostawca SMTP", - "allowed-platforms":"Dozwolone platformy", - "authentication":"Autentykacja", - "basic":"Podstawowy", - "provider":"Dostawca", - "redirect-url":"URI przekierowania", - "domain-name":"Nazwa domeny", - "redirect-url-template":"Szablon URI przekierowania", - "microsoft-tenant-id":"ID dzierżawy (tenant) Microsoft", - "microsoft-tenant-id-required":"ID dzierżawy (tenant) Microsoft jest wymagane", - "token-uri":"URI tokenu", - "token-uri-required":"URI tokenu jest wymagane", - "redirect-uri":"URI przekierowania", - "google-provider":"Google", - "microsoft-provider":"Office 365", - "sendgrid-provider":"Sendgrid", - "custom-provider":"Niestandardowy", - "generate-access-token":"Generuj token dostępu", - "update-access-token":"Aktualizuj token dostępu", - "access-token-status":"Status tokenu dostępu:", - "token-status-generated":"wygenerowany", - "token-status-not-generated":"nie wygenerowany" + "mail-subject": "Temat wiadomości", + "mail-body": "Treść wiadomości", + "sms-provider": "Dostawca SMS", + "sms-provider-settings": "Ustawienia dostawcy SMS", + "use-system-sms-settings": "Skorzystaj z systemowych ustawień dostawcy SMS", + "sms-provider-type": "Typ dostawcy SMS", + "sms-provider-type-required": "Typ dostawcy SMS jest wymagany.", + "sms-provider-type-aws-sns": "Amazon SNS", + "sms-provider-type-twilio": "Twilio", + "sms-provider-type-smpp": "SMPP", + "aws-access-key-id": "Identyfikator klucza dostępu AWS", + "aws-access-key-id-required": "Identyfikator klucza dostępu AWS jest wymagany", + "aws-secret-access-key": "Tajny klucz dostępu AWS", + "aws-secret-access-key-required": "Tajny klucz dostępu AWS jest wymagany", + "aws-region": "Region AWS", + "aws-region-required": "Region AWS jest wymagany", + "number-from": "Numer telefonu nadawcy", + "number-from-required": "Numer telefonu nadawcy jest wymagany.", + "number-to": "Numer telefonu adresata", + "number-to-required": "Numer telefonu adresata jest wymagany.", + "phone-number-hint": "Numer telefonu w formacie E.164, np. ", + "phone-number-hint-twilio": "Numer telefonu w formacie E.164/identyfikator SID numeru telefonu/SID usługi przesyłania wiadomości, np. +19995550123/PNXXX/MGXXX", + "phone-number-pattern": "Nieprawidłowy numer telefonu. Powinien być w formacie E.164, np. +19995550123.", + "phone-number-pattern-twilio": "Nieprawidłowy numer telefonu. Powinien być w formacie E.164/identyfikator SID numeru telefonu/SID usługi przesyłania wiadomości, np. +19995550123/PNXXX/MGXXX", + "sms-message": "Wiadomość SMS", + "sms-message-required": "Wiadomość SMS jest wymagana.", + "sms-message-max-length": "Wiadomość SMS nie może mieć więcej niż 1600 znaków", + "twilio-account-sid": "Identyfikator SID konta Twilio", + "twilio-account-sid-required": "Identyfikator SID konta Twilio jest wymagany", + "twilio-account-token": "Token konta Twilio", + "twilio-account-token-required": "Token konta Twilio jest wymagany", + "send-test-sms": "Wyślij testowego SMS-a", + "test-sms-sent": "Testowy SMS został pomyślnie wysłany!", + "security-settings": "Ustawienia bezpieczeństwa", + "password-policy": "Polityka haseł", + "minimum-password-length": "Minimalna długość hasła", + "minimum-password-length-required": "Minimalna długość hasła jest wymagana", + "minimum-password-length-range": "Minimalna długość hasła powinna mieścić się w zakresie od 5 do 50", + "minimum-uppercase-letters": "Minimalna liczba wielkich liter", + "minimum-uppercase-letters-range": "Minimalna liczba wielkich liter nie może być ujemna", + "minimum-lowercase-letters": "Minimalna liczba małych liter", + "minimum-lowercase-letters-range": "Minimalna liczba małych liter nie może być ujemna", + "minimum-digits": "Minimalna liczba cyfr", + "minimum-digits-range": "Minimalna liczba cyfr nie może być ujemna", + "minimum-special-characters": "Minimalna liczba znaków specjalnych", + "minimum-special-characters-range": "Minimalna liczba znaków specjalnych nie może być ujemna", + "password-expiration-period-days": "Okres ważności hasła w dniach", + "password-expiration-period-days-range": "Okres ważności hasła w dniach nie może być ujemny", + "password-reuse-frequency-days": "Częstotliwość ponownego użycia hasła w dniach", + "password-reuse-frequency-days-range": "Częstotliwość ponownego użycia hasła w dniach nie może być ujemna", + "allow-whitespace": "Zezwalaj na białe znaki", + "general-policy": "Polityka ogólna", + "max-failed-login-attempts": "Maksymalna liczba nieudanych prób logowania, zanim konto zostanie zablokowane", + "minimum-max-failed-login-attempts-range": "Maksymalna liczba nieudanych prób logowania nie może być ujemna", + "user-lockout-notification-email": "W przypadku blokady konta użytkownika wyślij powiadomienie na e-mail", + "domain-name": "Nazwa domeny", + "domain-name-unique": "Nazwa domeny i protokół muszą być unikalne.", + "domain-name-max-length": "Nazwa domeny powinna być mniejsza niż 256", + "error-verification-url": "Nazwa domeny nie powinna zawierać symboli „/” i „:”. ", + "connection-settings": "Connection settings", + "oauth2": { + "access-token-uri": "URI tokena dostępu", + "access-token-uri-required": "Identyfikator URI tokenu dostępu jest wymagany.", + "activate-user": "Aktywuj użytkownika", + "add-domain": "Dodaj domenę", + "delete-domain": "Usuń domenę", + "add-provider": "Dodaj dostawcę", + "delete-provider": "Usuń dostawcę", + "allow-user-creation": "Zezwalaj na tworzenie użytkowników", + "always-fullscreen": "Zawsze w trybie pełnoekranowym", + "authorization-uri": "URI autoryzacji", + "authorization-uri-required": "Identyfikator URI autoryzacji jest wymagany.", + "client-authentication-method": "Metoda uwierzytelniania klienta", + "client-id": "Identyfikator klienta", + "client-id-required": "Identyfikator klienta jest wymagany.", + "client-id-max-length": "Identyfikator klienta powinien być mniejszy niż 256", + "client-secret": "Tajny klucz klienta", + "client-secret-required": "Tajny klucz klienta jest wymagany.", + "client-secret-max-length": "Tajny klucz klienta powinien być mniejszy niż 2049", + "custom-setting": "Ustawienia niestandardowe", + "customer-name-pattern": "Wzorzec nazwy klienta", + "customer-name-pattern-max-length": "Wzorzec nazwy klienta powinien być mniejszy niż 256", + "parent-customer-name-pattern": "Wzorzec nazwy klienta nadrzędnego", + "user-groups-name-pattern": "Wzorzec nazw grup użytkowników", + "default-dashboard-name": "Domyślna nazwa panelu", + "default-dashboard-name-max-length": "Domyślna nazwa panelu powinna być mniejsza niż 256", + "delete-domain-text": "Uważaj, po potwierdzeniu domena i wszystkie dane dostawcy będą niedostępne.", + "delete-domain-title": "Czy na pewno chcesz usunąć domenę '{{domainName}}'?", + "delete-registration-text": "Uważaj, po potwierdzeniu dane dostawcy będą niedostępne.", + "delete-registration-title": "Czy na pewno chcesz usunąć dostawcę '{{name}}'?", + "email-attribute-key": "Klucz atrybutu adresu e-mail", + "email-attribute-key-required": "Klucz atrybutu adresu e-mail jest wymagany.", + "email-attribute-key-max-length": "Klucz atrybutu adresu e-mail powinien być mniejszy niż 32", + "first-name-attribute-key": "Klucz atrybutu imienia", + "first-name-attribute-key-max-length": "Klucz atrybutu imienia powinien być mniejszy niż 32", + "general": "Ogólne", + "jwk-set-uri": "URI klucza internetowego JSON", + "last-name-attribute-key": "Klucz atrybutu nazwiska", + "last-name-attribute-key-max-length": "Klucz atrybutu nazwiska powinien być mniejszy niż 32", + "login-button-icon": "Ikona przycisku logowania", + "login-button-label": "Etykieta dostawcy", + "login-button-label-placeholder": "Zaloguj się za pomocą $(Provider label)", + "login-button-label-required": "Etykieta jest wymagana.", + "login-provider": "Dostawca logowania", + "mapper": "Maper", + "new-domain": "Nowa domena", + "oauth2": "OAuth2", + "password-max-length": "Hasło powinno być mniejsze niż 256", + "redirect-uri-template": "Szablon przekierowania URI", + "copy-redirect-uri": "Skopiuj identyfikator przekierowania URI", + "registration-id": "Identyfikator rejestracji", + "registration-id-required": "Identyfikator rejestracyjny jest wymagany.", + "registration-id-unique": "Identyfikator rejestracyjny musi być unikalny dla systemu.", + "scope": "Zakres", + "scope-required": "Zakres jest wymagany.", + "tenant-name-pattern": "Wzór nazwy najemcy", + "tenant-name-pattern-required": "Wzorzec nazwy dzierżawy jest wymagany.", + "tenant-name-pattern-max-length": "Wzorzec nazwy dzierżawy powinien być mniejszy niż 256", + "tenant-name-strategy": "Strategia dotycząca nazwy najemcy", + "type": "Typ mapera", + "uri-pattern-error": "Nieprawidłowy format URI.", + "url": "Adres URL", + "url-pattern": "Nieprawidłowy format adresu URL.", + "url-required": "Adres URL jest wymagany.", + "url-max-length": "Adres URL powinien być mniejszy niż 256", + "user-info-uri": "URI informacji o użytkowniku", + "user-info-uri-required": "Identyfikator URI informacji o użytkowniku jest wymagany.", + "username-max-length": "Nazwa użytkownika powinna być mniejsza niż 256", + "user-name-attribute-name": "Klucz atrybutu nazwy użytkownika", + "user-name-attribute-name-required": "Klucz atrybutu nazwy użytkownika jest wymagany", + "protocol": "Protokół", + "domain-schema-http": "HTTP", + "domain-schema-https": "HTTPS", + "domain-schema-mixed": "HTTP+HTTPS", + "enable": "Włącz ustawienia OAuth2", + "domains": "Domeny", + "mobile-apps": "Aplikacje mobilne", + "no-mobile-apps": "Nie skonfigurowano żadnych aplikacji", + "mobile-package": "Pakiet aplikacji", + "mobile-package-placeholder": "Np.: moja.przykładowa.aplikacja", + "mobile-package-hint": "Dla Androida: Twój własny, unikalny identyfikator aplikacji. Dla iOS: identyfikator Bundle ID", + "mobile-package-unique": "Pakiet aplikacji musi być unikalny.", + "mobile-app-secret": "Tajny klucz aplikacji", + "invalid-mobile-app-secret": "Tajny klucz aplikacji może zawierać wyłącznie znaki alfanumeryczne i mieć długość od 16 do 2048 znaków.", + "copy-mobile-app-secret": "Skopiuj tajny klucz aplikacji", + "add-mobile-app": "Dodaj aplikację", + "delete-mobile-app": "Usuń informacje o aplikacji", + "providers": "Dostawcy", + "platform-web": "Sieć", + "platform-android": "Android", + "platform-ios": "iOS", + "all-platforms": "Wszystkie platformy", + "smtp-provider": "SMTP provider", + "allowed-platforms": "Dozwolone platformy", + "authentication": "Authentication", + "basic": "Basic", + "provider": "Provider", + "redirect-url": "Redirect URI", + "domain-name": "Domain name", + "redirect-url-template": "Redirect URI template", + "microsoft-tenant-id": "Directory (tenant) Id", + "microsoft-tenant-id-required": "Directory (tenant) Id is required", + "token-uri": "Token URI", + "token-uri-required": "Token URI is required", + "redirect-uri": "Redirect URI", + "google-provider": "Google", + "microsoft-provider": "Office 365", + "sendgrid-provider": "Sendgrid", + "custom-provider": "Custom", + "generate-access-token": "Generate access token", + "update-access-token": "Update access token", + "access-token-status": "Access token status:", + "token-status-generated": "generated", + "token-status-not-generated": "not generated" }, - "smpp-provider":{ - "smpp-version":"Wersja SMPP", - "smpp-host":"Host SMPP", - "smpp-host-required":"Host SMPP jest wymagany", - "smpp-port":"Port SMPP", - "smpp-port-required":"Port SMPP jest wymagany", - "system-id":"ID systemu", - "system-id-required":"ID systemu jest wymagane", - "password":"Hasło", - "password-required":"Hasło jest wymagane", - "type-settings":"Ustawienia typu", - "source-settings":"Ustawienia źródła", - "destination-settings":"Ustawienia docelowe", - "additional-settings":"Dodatkowe ustawienia", - "system-type":"Typ systemu", - "bind-type":"Typ powiązania", - "service-type":"Typ usługi", - "source-address":"Adres źródłowy", - "source-ton":"TON źródłowy", - "source-npi":"NPI źródłowy", - "destination-ton":"TON docelowy (Typ Numeru)", - "destination-npi":"NPI docelowy (Identyfikacja Planu Numeracji)", - "address-range":"Zakres adresów", - "coding-scheme":"Schemat kodowania", - "bind-type-tx":"Nadajnik", - "bind-type-rx":"Odbiornik", - "bind-type-trx":"Nadawczo-odbiorczy", - "ton-unknown":"Nieznany", - "ton-international":"Międzynarodowy", - "ton-national":"Krajowy", - "ton-network-specific":"Specyficzny dla sieci", - "ton-subscriber-number":"Numer abonenta", - "ton-alphanumeric":"Alfanumeryczny", - "ton-abbreviated":"Skrócony", - "npi-unknown":"0 - Nieznany", - "npi-isdn":"1 - ISDN/plan numeracji telefonicznej (E163/E164)", - "npi-data-numbering-plan":"3 - Plan numeracji danych (X.121)", - "npi-telex-numbering-plan":"4 - Plan numeracji telexu (F.69)", - "npi-land-mobile":"6 - Mobilny lądowy (E.212)", - "npi-national-numbering-plan":"8 - Krajowy plan numeracji", - "npi-private-numbering-plan":"9 - Prywatny plan numeracji", - "npi-ermes-numbering-plan":"10 - Plan numeracji ERMES (ETSI DE/PS 3 01-3)", - "npi-internet":"13 - Internet (IP)", - "npi-wap-client-id":"18 - Identyfikator klienta WAP (do zdefiniowania przez Forum WAP)", - "scheme-smsc":"0 - Domyślny alfabet SMSC (ASCII dla krótkiego i długiego kodu oraz do GSM dla bezpłatnych)", - "scheme-ia5":"1 - IA5 (ASCII dla krótkiego i długiego kodu, łaciński 9 dla bezpłatnych (ISO-8859-9))", - "scheme-octet-unspecified-2":"2 - Oktet nieokreślony (binarny 8-bitowy)", - "scheme-latin-1":"3 - Łaciński 1 (ISO-8859-1)", - "scheme-octet-unspecified-4":"4 - Oktet nieokreślony (binarny 8-bitowy)", - "scheme-jis":"5 - JIS (X 0208-1990)", - "scheme-cyrillic":"6 - Cyrylica (ISO-8859-5)", - "scheme-latin-hebrew":"7 - Łaciński/hebrajski (ISO-8859-8)", - "scheme-ucs-utf":"8 - UCS2/UTF-16 (ISO/IEC-10646)", - "scheme-pictogram-encoding":"9 - Kodowanie piktogramów", - "scheme-music-codes":"10 - Kody muzyczne (ISO-2022-JP)", - "scheme-extended-kanji-jis":"13 - Rozszerzony Kanji JIS (X 0212-1990)", - "scheme-korean-graphic-character-set":"14 - Zestaw koreańskich znaków graficznych (KS C 5601/KS X 1001)" + "smpp-provider": { + "smpp-version": "Wersja SMPP", + "smpp-host": "Host SMPP", + "smpp-host-required": "Host SMPP jest wymagany", + "smpp-port": "Port SMPP", + "smpp-port-required": "Port SMPP jest wymagany", + "system-id": "Identyfikator systemu", + "system-id-required": "Identyfikator systemu jest wymagany", + "password": "Hasło", + "password-required": "Hasło jest wymagane", + "type-settings": "Ustawienia typu", + "source-settings": "Ustawienia źródła", + "destination-settings": "Ustawienia celu", + "additional-settings": "Ustawienia dodatkowe", + "system-type": "Rodzaj systemu", + "bind-type": "Typ wiązania", + "service-type": "Rodzaj usługi", + "source-address": "Adres źródłowy", + "source-ton": "TON źródłowy", + "source-npi": "NPI źródłowy", + "destination-ton": "TON celu (Type of Number)", + "destination-npi": "NPI celu (Numbering Plan Identification)", + "address-range": "Zakres adresów", + "coding-scheme": "System kodowania", + "bind-type-tx": "Nadajnik", + "bind-type-rx": "Odbiornik", + "bind-type-trx": "Przekaźnik", + "ton-unknown": "Nieznany", + "ton-international": "Międzynarodowy", + "ton-national": "Krajowy", + "ton-network-specific": "Specyficzny dla sieci", + "ton-subscriber-number": "Numer subskrybenta", + "ton-alphanumeric": "Alfanumeryczny", + "ton-abbreviated": "Skrócony", + "npi-unknown": "0 - Nieznane", + "npi-isdn": "1 - Plan numeracji ISDN/telefonu (E163/E164)", + "npi-data-numbering-plan": "3 - Plan numeracji danych (X.121)", + "npi-telex-numbering-plan": "4 - Plan numeracji teleksu (F.69)", + "npi-land-mobile": "6 – Land mobile (E.212)", + "npi-national-numbering-plan": "8 - Krajowy plan numeracji", + "npi-private-numbering-plan": "9 - Plan numeracji prywatnej", + "npi-ermes-numbering-plan": "10 - Plan numeracji ERMES (ETSI DE/PS 3 01-3)", + "npi-internet": "13 - Internet (IP)", + "npi-wap-client-id": "18 - Identyfikator klienta WAP (określony przez Forum WAP)", + "scheme-smsc": "0 - Domyślny alfabet SMSC (ASCII dla krótkiego i długiego kodu oraz GSM dla numeru bezpłatnego)", + "scheme-ia5": "1 - IA5 (ASCII dla krótkiego i długiego kodu, Latin 9 dla numeru bezpłatnego (ISO-8859-9))", + "scheme-octet-unspecified-2": "2 — oktet nieokreślony (8-bitów binarnie)", + "scheme-latin-1": "3 - Łacina 1 (ISO-8859-1)", + "scheme-octet-unspecified-4": "4 — oktet nieokreślony (8-bitowy plik binarny)", + "scheme-jis": "5 - JIS (X 0208-1990)", + "scheme-cyrillic": "6 – Cyrylica (ISO-8859-5)", + "scheme-latin-hebrew": "7 – Łacina/Hebrajski (ISO-8859-8)", + "scheme-ucs-utf": "8 - UCS2/UTF-16 (ISO/IEC-10646)", + "scheme-pictogram-encoding": "9 - Kodowanie piktogramów", + "scheme-music-codes": "10 - Kody muzyczne (ISO-2022-JP)", + "scheme-extended-kanji-jis": "13 - Rozszerzone Kanji JIS (X 0212-1990)", + "scheme-korean-graphic-character-set": "14 - Koreański zestaw znaków graficznych (KS C 5601/KS X 1001)" }, - "queue-select-name":"Wybierz nazwę kolejki", - "queue-name":"Nazwa", - "queue-name-required":"Nazwa kolejki jest wymagana!", - "queues":"Kolejki", - "queue-partitions":"Partycje", - "queue-submit-strategy":"Strategia zgłaszania", - "queue-processing-strategy":"Strategia przetwarzania", - "queue-configuration":"Konfiguracja kolejki", - "repository-settings":"Ustawienia repozytorium", - "repository":"Repozytorium", - "repository-url":"URL repozytorium", - "repository-url-required":"URL repozytorium jest wymagany.", - "default-branch":"Domyślna nazwa gałęzi", - "repository-read-only":"Tylko do odczytu", - "show-merge-commits":"Pokaż commity scalające", - "authentication-settings":"Ustawienia autentykacji", - "auth-method":"Metoda uwierzytelniania", - "auth-method-username-password":"Hasło / token dostępu", - "auth-method-username-password-hint":"Użytkownicy GitHub muszą używać tokenów dostępu z uprawnieniami do zapisu w repozytorium.", - "auth-method-private-key":"Klucz prywatny", - "password-access-token":"Hasło / token dostępu", - "change-password-access-token":"Zmień hasło / token dostępu", - "private-key":"Klucz prywatny", - "drop-private-key-file-or":"Przeciągnij i upuść plik klucza prywatnego lub", - "passphrase":"Hasło", - "enter-passphrase":"Wprowadź hasło", - "change-passphrase":"Zmień hasło", - "check-access":"Sprawdź dostęp", - "check-repository-access-success":"Dostęp do repozytorium pomyślnie zweryfikowany!", - "delete-repository-settings-title":"Czy na pewno chcesz usunąć ustawienia repozytorium?", - "delete-repository-settings-text":"Uważaj, po potwierdzeniu ustawienia repozytorium zostaną usunięte, a funkcja kontroli wersji będzie niedostępna.", - "auto-commit-settings":"Ustawienia automatycznego zatwierdzania", - "auto-commit":"Automatyczne zatwierdzanie", - "auto-commit-entities":"Automatyczne zatwierdzanie encji", - "no-auto-commit-entities-prompt":"Brak skonfigurowanych encji do automatycznego zatwierdzania", - "delete-auto-commit-settings-title":"Czy na pewno chcesz usunąć ustawienia automatycznego zatwierdzania?", - "delete-auto-commit-settings-text":"Uważaj, po potwierdzeniu ustawienia automatycznego zatwierdzania zostaną usunięte, a automatyczne zatwierdzanie zostanie wyłączone dla wszystkich encji.", - "2fa":{ - "2fa":"Dwuetapowa autentykacja", - "available-providers":"Dostępni dostawcy", - "issuer-name":"Nazwa wydawcy", - "issuer-name-required":"Nazwa wydawcy jest wymagana.", - "max-verification-failures-before-user-lockout":"Maksymalna liczba nieudanych weryfikacji przed zablokowaniem użytkownika", - "max-verification-failures-before-user-lockout-pattern":"Maksymalna liczba nieudanych weryfikacji musi być dodatnią liczbą całkowitą.", - "number-of-checking-attempts":"Liczba prób sprawdzenia", - "number-of-checking-attempts-pattern":"Liczba prób sprawdzenia musi być dodatnią liczbą całkowitą.", - "number-of-checking-attempts-required":"Liczba prób sprawdzenia jest wymagana.", - "number-of-codes":"Liczba kodów", - "number-of-codes-pattern":"Liczba kodów musi być dodatnią liczbą całkowitą.", - "number-of-codes-required":"Liczba kodów jest wymagana.", - "provider":"Dostawca", - "retry-verification-code-period":"Okres ponownego próbowania kodu weryfikacyjnego (sek)", - "retry-verification-code-period-pattern":"Minimalny czas okresu to 5 sek", - "retry-verification-code-period-required":"Okres ponownego próbowania kodu weryfikacyjnego jest wymagany.", - "total-allowed-time-for-verification":"Całkowity dozwolony czas na weryfikację (sek)", - "total-allowed-time-for-verification-pattern":"Minimalny całkowity dozwolony czas to 60 sek", - "total-allowed-time-for-verification-required":"Całkowity dozwolony czas jest wymagany.", - "use-system-two-factor-auth-settings":"Użyj systemowych ustawień dwuetapowej autentykacji", - "verification-code-check-rate-limit":"Limit częstotliwości sprawdzania kodu weryfikacyjnego", - "verification-code-lifetime":"Czas życia kodu weryfikacyjnego (sek)", - "verification-code-lifetime-pattern":"Czas życia kodu weryfikacyjnego musi być dodatnią liczbą całkowitą.", - "verification-code-lifetime-required":"Czas życia kodu weryfikacyjnego jest wymagany.", - "verification-message-template":"Szablon wiadomości weryfikacyjnej", - "verification-limitations":"Ograniczenia weryfikacji", - "verification-message-template-pattern":"Wiadomość weryfikacyjna musi zawierać wzór: ${code}", - "verification-message-template-required":"Szablon wiadomości weryfikacyjnej jest wymagany.", - "within-time":"W czasie (sek)", - "within-time-pattern":"Czas musi być dodatnią liczbą całkowitą.", - "within-time-required":"Czas jest wymagany." + "queue-select-name": "Wybierz nazwę kolejki", + "queue-name": "Nazwa", + "queue-name-required": "Nazwa kolejki jest wymagana!", + "queues": "Kolejki", + "queue-partitions": "Partycje", + "queue-submit-strategy": "Prześlij strategię", + "queue-processing-strategy": "Strategia przetwarzania", + "queue-configuration": "Konfiguracja kolejki", + "repository-settings": "Ustawienia repozytorium", + "repository": "Repozytorium", + "repository-url": "Adres URL repozytorium", + "repository-url-required": "Adres URL repozytorium jest wymagany.", + "default-branch": "Domyślna nazwa gałęzi", + "repository-read-only": "Tylko do odczytu", + "show-merge-commits": "Pokaż zmiany scalające (merge commits)", + "authentication-settings": "Ustawienia uwierzytelniania", + "auth-method": "Metoda Uwierzytelnienia", + "auth-method-username-password": "Hasło / token dostępu", + "auth-method-username-password-hint": "Użytkownicy GitHuba muszą korzystać z tokenów dostępu z uprawnieniami do zapisu w repozytorium.", + "auth-method-private-key": "Klucz prywatny", + "password-access-token": "Hasło / token dostępu", + "change-password-access-token": "Zmień hasło/token dostępu", + "private-key": "Klucz prywatny", + "drop-private-key-file-or": "Przeciągnij i upuść plik klucza prywatnego lub", + "passphrase": "Hasło", + "enter-passphrase": "Wprowadź hasło", + "change-passphrase": "Zmień hasło", + "check-access": "Sprawdź dostęp", + "check-repository-access-success": "Dostęp do repozytorium pomyślnie zweryfikowany!", + "delete-repository-settings-title": "Czy na pewno chcesz usunąć ustawienia repozytorium?", + "delete-repository-settings-text": "Uważaj, po potwierdzeniu ustawienia repozytorium zostaną usunięte, a funkcja kontroli wersji będzie niedostępna.", + "auto-commit-settings": "Ustawienia automatycznego zatwierdzania", + "auto-commit": "Automatyczne zatwierdzanie", + "auto-commit-entities": "Obiekty automatycznego zatwierdzania", + "no-auto-commit-entities-prompt": "Brak obiektów skonfigurowanych do automatycznego zatwierdzania", + "delete-auto-commit-settings-title": "Czy na pewno chcesz usunąć ustawienia automatycznego zatwierdzania?", + "delete-auto-commit-settings-text": "Bądź ostrożny, po potwierdzeniu ustawienia automatycznego zatwierdzania zostaną usunięte, a automatyczne zatwierdzanie zostanie wyłączone dla wszystkich obiektów.", + "2fa": { + "2fa": "Weryfikacja dwuetapowa", + "available-providers": "Dostępni dostawcy", + "issuer-name": "Nazwa emitenta", + "issuer-name-required": "Nazwa emitenta jest wymagana.", + "max-verification-failures-before-user-lockout": "Maksymalna liczba błędów weryfikacji przed zablokowaniem użytkownika", + "max-verification-failures-before-user-lockout-pattern": "Maksymalna liczba niepowodzeń weryfikacji musi być dodatnią liczbą całkowitą.", + "number-of-checking-attempts": "Liczba prób sprawdzenia", + "number-of-checking-attempts-pattern": "Liczba prób sprawdzenia musi być dodatnią liczbą całkowitą.", + "number-of-checking-attempts-required": "Liczba prób sprawdzenia jest wymagana.", + "number-of-codes": "Liczba kodów", + "number-of-codes-pattern": "Liczba kodów musi być dodatnią liczbą całkowitą.", + "number-of-codes-required": "Liczba kodów jest wymagana.", + "provider": "Dostawca", + "retry-verification-code-period": "Okres ponownej próby weryfikacji kodu (s)", + "retry-verification-code-period-pattern": "Minimalny czas trwania okresu wynosi 5 sekund", + "retry-verification-code-period-required": "Okres ponownej próby weryfikacji kodu jest wymagany.", + "total-allowed-time-for-verification": "Całkowity dozwolony czas weryfikacji (s)", + "total-allowed-time-for-verification-pattern": "Minimalny całkowity dozwolony czas wynosi 60 sekund", + "total-allowed-time-for-verification-required": "Całkowity dozwolony czas jest wymagany.", + "use-system-two-factor-auth-settings": "Użyj systemowych ustawień weryfikacji dwuetapowej", + "verification-code-check-rate-limit": "Limit szybkości sprawdzania kodu weryfikacyjnego", + "verification-code-lifetime": "Okres ważności kodu weryfikacyjnego (s)", + "verification-code-lifetime-pattern": "Okres ważności kodu weryfikacyjnego musi być dodatnią liczbą całkowitą.", + "verification-code-lifetime-required": "Okres ważności kodu weryfikacyjnego jest wymagany.", + "verification-message-template": "Szablon wiadomości weryfikacyjnej", + "verification-limitations": "Ograniczenia weryfikacji", + "verification-message-template-pattern": "Wiadomość weryfikacyjna musi zawierać wzór: ${code}", + "verification-message-template-required": "Szablon wiadomości weryfikacyjnej jest wymagany.", + "within-time": "W ciągu (sek)", + "within-time-pattern": "Czas musi być dodatnią liczbą całkowitą.", + "within-time-required": "Czas jest wymagany." }, - "jwt":{ - "security-settings":"Ustawienia bezpieczeństwa JWT", - "issuer-name":"Nazwa wydawcy", - "issuer-name-required":"Nazwa wydawcy jest wymagana.", - "signings-key":"Klucz podpisujący", - "signings-key-hint":"Kodowany Base64 ciąg reprezentujący co najmniej 256 bitów danych.", - "signings-key-required":"Klucz podpisujący jest wymagany.", - "signings-key-min-length":"Klucz podpisujący musi reprezentować co najmniej 256 bitów danych.", - "signings-key-base64":"Klucz podpisujący musi być w formacie base64.", - "expiration-time":"Czas wygaśnięcia tokena (sek)", - "expiration-time-required":"Czas wygaśnięcia tokena jest wymagany.", - "expiration-time-pattern":"Czas wygaśnięcia tokena musi być dodatnią liczbą całkowitą.", - "expiration-time-min":"Minimalny czas to 60 sekund (1 minuta).", - "refresh-expiration-time":"Czas wygaśnięcia tokena odświeżającego (sek)", - "refresh-expiration-time-required":"Czas wygaśnięcia tokena odświeżającego jest wymagany.", - "refresh-expiration-time-pattern":"Czas wygaśnięcia tokena odświeżającego musi być dodatnią liczbą całkowitą.", - "refresh-expiration-time-min":"Minimalny czas to 900 sekund (15 minut).", - "refresh-expiration-time-less-token":"Czas tokena odświeżającego musi być dłuższy niż czas tokena.", - "generate-key":"Wygeneruj klucz", - "info-header":"Wszyscy użytkownicy będą musieli ponownie się zalogować", - "info-message":"Zmiana klucza podpisującego JWT spowoduje unieważnienie wszystkich wydanych tokenów. Wszyscy użytkownicy będą musieli ponownie się zalogować. Dotyczy to również skryptów korzystających z Rest API/Websockets." + "jwt": { + "security-settings": "Ustawienia zabezpieczeń JWT", + "issuer-name": "Nazwa emitenta", + "issuer-name-required": "Nazwa emitenta jest wymagana.", + "signings-key": "Klucz do podpisu", + "signings-key-hint": "Ciąg zakodowany w formacie Base64 reprezentujący co najmniej 256 bitów danych.", + "signings-key-required": "Klucz do podpisu jest wymagany.", + "signings-key-min-length": "Klucz podpisujący musi mieć co najmniej 256 bitów danych.", + "signings-key-base64": "Klucz podpisujący musi być w formacie base64.", + "expiration-time": "Czas ważności tokena (s)", + "expiration-time-required": "Czas ważności tokena jest wymagany.", + "expiration-time-pattern": "Czas ważności tokena musi być dodatnią liczbą całkowitą.", + "expiration-time-min": "Minimalny czas to 60 sekund (1 minuta).", + "refresh-expiration-time": "Czas wygaśnięcia tokena odświeżenia (s)", + "refresh-expiration-time-required": "Czas ważności tokena odświeżania jest wymagany.", + "refresh-expiration-time-pattern": "Czas wygaśnięcia tokena odświeżenia powinien być dodatnią liczbą całkowitą.", + "refresh-expiration-time-min": "Minimalny czas to 900 sekund (15 minut).", + "refresh-expiration-time-less-token": "Czas odświeżania tokenu musi być dłuższy.", + "generate-key": "Wygeneruj klucz", + "info-header": "Wszyscy użytkownicy będą musieli się ponownie zalogować", + "info-message": "Zmiana klucza podpisującego JWT spowoduje, że wszystkie wydane tokeny staną się nieważne. " }, - "resources":"Zasoby", - "notifications":"Powiadomienia", - "notifications-settings":"Ustawienia powiadomień", - "slack-api-token":"Token API Slack", - "slack":"Slack", - "slack-settings":"Ustawienia Slack" + "resources": "Biblioteki", + "notifications": "Powiadomienia", + "notifications-settings": "Ustawienia powiadomień", + "slack-api-token": "Token API Slacka", + "slack": "Slack", + "slack-settings": "Ustawienia Slacka" }, - "alarm":{ - "alarm":"Alarm", - "alarms":"Alarmy", - "all-alarms":"Wszystkie alarmy", - "select-alarm":"Wybierz alarm", - "no-alarms-matching":"Nie znaleziono alarmów pasujących do '{{entity}}'.", - "alarm-required":"Alarm jest wymagany", - "alarm-filter":"Filtr alarmów", - "filter":"Filtr", - "alarm-status":"Status alarmu", - "alarm-status-list":"Lista statusów alarmów", - "any-status":"Dowolny status", - "search-status":{ - "ANY":"Dowolny", - "ACTIVE":"Aktywny", - "CLEARED":"Wyczyszczony", - "ACK":"Potwierdzony", - "UNACK":"Niepotwierdzony" + "alarm": { + "alarm": "Alarm", + "alarms": "Alarmy", + "all-alarms": "Wszystkie alarmy", + "select-alarm": "Wybierz alarm", + "no-alarms-matching": "Nie znaleziono alarmów pasujących do '{{entity}}'.", + "alarm-required": "Alarm jest wymagany", + "alarm-filter": "Filtr alarmu", + "filter": "Filtr", + "alarm-status": "Stan alarmu", + "alarm-status-list": "Lista stanów alarmów", + "any-status": "Dowolny stan", + "search-status": { + "ANY": "Dowolny", + "ACTIVE": "Aktywny", + "CLEARED": "Wyczyszczony", + "ACK": "Potwierdzony", + "UNACK": "Niepotwierdzony" }, - "display-status":{ - "ACTIVE_UNACK":"Aktywny Niepotwierdzony", - "ACTIVE_ACK":"Aktywny Potwierdzony", - "CLEARED_UNACK":"Wyczyszczony Niepotwierdzony", - "CLEARED_ACK":"Wyczyszczony Potwierdzony" + "display-status": { + "ACTIVE_UNACK": "Aktywny Niepotwierdzony", + "ACTIVE_ACK": "Aktywny Potwierdzony", + "CLEARED_UNACK": "Wyczyszczony Niepotwierdzony", + "CLEARED_ACK": "Wyszczony Potwierdzony" }, - "no-alarms-prompt":"Nie znaleziono alarmów", - "created-time":"Czas utworzenia", - "type":"Typ", - "severity":"Waga", - "originator":"Inicjator", - "originator-type":"Typ inicjatora", - "details":"Szczegóły", - "originator-label":"Etykieta inicjatora", - "assign":"Przypisz", - "assignments":"Przypisania", - "assignee":"Przypisany", - "assignee-id":"ID przypisanego", - "assignee-first-name":"Imię przypisanego", - "assignee-last-name":"Nazwisko przypisanego", - "assignee-email":"Email przypisanego", - "unassigned":"Nieprzypisany", - "assignee-not-set":"Wszystkie", - "status":"Status", - "alarm-details":"Szczegóły alarmu", - "start-time":"Czas rozpoczęcia", - "assign-time":"Czas przypisania", - "end-time":"Czas zakończenia", - "ack-time":"Czas potwierdzenia", - "clear-time":"Czas wyczyszczenia", - "duration":"Czas trwania", - "alarm-severity-list":"Lista ważności alarmów", - "any-severity":"Dowolna ważność", - "severity-critical":"Krytyczna", - "severity-major":"Poważna", - "severity-minor":"Mniejsza", - "severity-warning":"Ostrzeżenie", - "severity-indeterminate":"Nieokreślona", - "acknowledge":"Potwierdź", - "clear":"Wyczyść", - "delete":"Usuń", - "search":"Szukaj alarmów", - "selected-alarms":"{ count, plural, =1 {1 alarm} other {# alarmów} } wybrano", - "no-data":"Brak danych do wyświetlenia", - "polling-interval":"Interwał odpytywania alarmów (sek)", - "polling-interval-required":"Interwał odpytywania alarmów jest wymagany.", - "min-polling-interval-message":"Dozwolony jest minimalny interwał odpytywania 1 sek.", - "aknowledge-alarms-title":"Potwierdź { count, plural, =1 {1 alarm} other {# alarmów} }", - "aknowledge-alarms-text":"Czy na pewno chcesz potwierdzić { count, plural, =1 {1 alarm} other {# alarmów} }?", - "aknowledge-alarm-title":"Potwierdź alarm", - "aknowledge-alarm-text":"Czy na pewno chcesz potwierdzić alarm?", - "selected-alarms-are-acknowledged":"Wybrane alarmy zostały już potwierdzone", - "clear-alarms-title":"Wyczyść { count, plural, =1 {1 alarm} other {# alarmów} }", - "clear-alarms-text":"Czy na pewno chcesz wyczyścić { count, plural, =1 {1 alarm} other {# alarmów} }?", - "clear-alarm-title":"Wyczyść alarm", - "clear-alarm-text":"Czy na pewno chcesz wyczyścić alarm?", - "delete-alarms-title":"Usuń { count, plural, =1 {1 alarm} other {# alarmów} }", - "delete-alarms-text":"Czy na pewno chcesz usunąć { count, plural, =1 {1 alarm} other {# alarmów} }?", - "selected-alarms-are-cleared":"Wybrane alarmy zostały już wyczyszczone", - "alarm-status-filter":"Filtr statusu alarmów", - "alarm-filter-title":"Filtr alarmów", - "assigned":"Przypisane", - "filter-title":"Filtr", - "max-count-load":"Maksymalna liczba alarmów do załadowania (0 - bez limitu)", - "max-count-load-required":"Maksymalna liczba alarmów do załadowania jest wymagana.", - "max-count-load-error-min":"Minimalna wartość to 0.", - "fetch-size":"Rozmiar pobrania", - "fetch-size-required":"Rozmiar pobrania jest wymagany.", - "fetch-size-error-min":"Minimalna wartość to 10.", - "alarm-type-list":"Lista typów alarmów", - "any-type":"Dowolny typ", - "assigned-to-current-user":"Przypisane do aktualnego użytkownika", - "assigned-to-me":"Przypisane do mnie", - "search-propagated-alarms":"Szukaj propagowanych alarmów", - "comments":"Komentarze do alarmu", - "show-more":"Pokaż więcej", - "additional-info":"Dodatkowe informacje", - "alarm-type":"Typ alarmu", - "enter-alarm-type":"Wpisz typ alarmu", - "no-alarm-types-matching":"Nie znaleziono typów alarmów pasujących do '{{entitySubtype}}'.", - "alarm-type-list-empty":"Nie wybrano typów alarmów." + "no-alarms-prompt": "Nie znaleziono alarmów", + "created-time": "Czas utworzenia", + "type": "Typ", + "severity": "Waga", + "originator": "Inicjator", + "originator-type": "Typ inicjatora", + "details": "Szczegóły", + "originator-label": "Etykieta twórcy", + "assign": "Przydziel", + "assignments": "Przydziały", + "assignee": "Przydzielony", + "assignee-id": "Identyfikator przydzielonego", + "assignee-first-name": "Imię przydzielonego", + "assignee-last-name": "Nazwisko przydzielonego", + "assignee-email": "Adres e-mail przydzielonej osoby", + "unassigned": "Nieprzydzielony", + "assignee-not-set": "Wszyscy", + "status": "Status", + "alarm-details": "Szczegóły alarmu", + "start-time": "Czas rozpoczęcia", + "assign-time": "Przypisz czas", + "end-time": "Czas końcowy", + "ack-time": "Potwierdzony czas", + "clear-time": "Wyzerowany czas", + "duration": "Czas trwania", + "alarm-severity-list": "Lista wag alarmów", + "any-severity": "Dowolna waga", + "severity-critical": "Krytyczny", + "severity-major": "Ważny", + "severity-minor": "Mało ważny", + "severity-warning": "Ostrzeżenie", + "severity-indeterminate": "Nieokreślony", + "acknowledge": "Potwierdź", + "clear": "Wyczyść", + "delete": "Delete", + "search": "Wyszukaj alarmy", + "selected-alarms": "Wybrano { count, plural, =1 {1 alarm} other {# alarmów} }", + "no-data": "Brak danych do wyświetlenia", + "polling-interval": "Czas między odpytywaniem alarmów (s)", + "polling-interval-required": "Czas między odpytywaniem nalarmówi jest wymagay.", + "min-polling-interval-message": "Dozwolony jest czas między odpytywaniem wynoszący co najmniej 1 sekundę.", + "aknowledge-alarms-title": "Potwierdź { count, plural, =1 {1 alarm} other {# alarmów} }", + "aknowledge-alarms-text": "Czy na pewno chcesz potwierdzić { count, plural, =1 {1 alarm} other {# alarmów} }?", + "aknowledge-alarm-title": "Potwierdź alarm", + "aknowledge-alarm-text": "Czy na pewno chcesz potwierdzić Alarm?", + "selected-alarms-are-acknowledged": "Selected alarms are already acknowledged", + "clear-alarms-title": "Wyczyść { count, plural, =1 {1 alarm} other {# alarmów} }", + "clear-alarms-text": "Czy na pewno chcesz wyczyścić { count, plural, =1 {1 alarm} other {# alarmów} }?", + "clear-alarm-title": "Wyczyść alarm", + "clear-alarm-text": "Czy na pewno chcesz wyczyścić Alarm?", + "delete-alarms-title": "Delete { count, plural, =1 {1 alarm} other {# alarms} }", + "delete-alarms-text": "Are you sure you want to delete { count, plural, =1 {1 alarm} other {# alarms} }?", + "selected-alarms-are-cleared": "Selected alarms are already cleared", + "alarm-status-filter": "Filtr stanów alarmów", + "alarm-filter-title": "Filtr alarmów", + "assigned": "Przydzielony", + "filter-title": "Filtr", + "max-count-load": "Maksymalna liczba alarmów do załadowania (0 - nieograniczona)", + "max-count-load-required": "Maksymalna liczba alarmów do załadowania jest wymagana.", + "max-count-load-error-min": "Minimalna wartość to 0.", + "fetch-size": "Rozmiar pobierania", + "fetch-size-required": "Rozmiar pobierania jest wymagany.", + "fetch-size-error-min": "Minimalna wartość to 10.", + "alarm-type-list": "Lista typów alarmów", + "any-type": "Dowolny typ", + "assigned-to-current-user": "Przypisany do bieżącego użytkownika", + "assigned-to-me": "Przydzielony do mnie", + "search-propagated-alarms": "Wyszukaj propagowane alarmy", + "comments": "Komentarze alarmów", + "show-more": "Pokaż więcej", + "additional-info": "Dodatkowe informacje", + "alarm-type": "Alarm type", + "enter-alarm-type": "Enter alarm type", + "no-alarm-types-matching": "No alarm types matching '{{entitySubtype}}' were found.", + "alarm-type-list-empty": "No alarm types selected." }, - "alarm-activity":{ - "add":"Dodaj komentarz...", - "alarm-comment":"Komentarz do alarmu", - "comments":"Komentarze", - "delete-alarm-comment":"Czy chcesz usunąć ten komentarz?", - "refresh":"Odśwież", - "oldest-first":"Najstarsze najpierw", - "newest-first":"Najnowsze najpierw", - "activity":"Aktywność", - "export":"Eksportuj do CSV", - "author":"Autor", - "created-date":"Data utworzenia", - "edited-date":"Data edycji", - "text":"Tekst", - "system":"System" + "alarm-activity": { + "add": "Dodaj komentarz...", + "alarm-comment": "Komentarz alarmu", + "comments": "Komentarze", + "delete-alarm-comment": "Czy chcesz usunąć ten komentarz?", + "refresh": "Odśwież", + "oldest-first": "Najpierw najstarsze", + "newest-first": "Najpierw najnowsze", + "activity": "Aktywność", + "export": "Eksportuj do CSV", + "author": "Autor", + "created-date": "Data utworzenia", + "edited-date": "Data edycji", + "text": "Tekst", + "system": "System" }, - "alias":{ - "add":"Dodaj alias", - "edit":"Edytuj alias", - "name":"Nazwa aliasu", - "name-required":"Nazwa aliasu jest wymagana", - "duplicate-alias":"Alias o tej samej nazwie już istnieje.", - "filter-type-single-entity":"Pojedyncza encja", - "filter-type-entity-list":"Lista encji", - "filter-type-entity-name":"Nazwa encji", - "filter-type-entity-type":"Typ encji", - "filter-type-state-entity":"Encja ze stanu pulpitu nawigacyjnego", - "filter-type-state-entity-description":"Encja pobrana z parametrów stanu pulpitu nawigacyjnego", - "filter-type-asset-type":"Typ aktywa", - "filter-type-asset-type-description":"Aktywa typu '{{assetTypes}}'", - "filter-type-asset-type-and-name-description":"Aktywa typu '{{assetTypes}}' o nazwie rozpoczynającej się od '{{prefix}}'", - "filter-type-device-type":"Typ urządzenia", - "filter-type-device-type-description":"Urządzenia typu '{{deviceTypes}}'", - "filter-type-device-type-and-name-description":"Urządzenia typu '{{deviceTypes}}' o nazwie rozpoczynającej się od '{{prefix}}'", - "filter-type-entity-view-type":"Typ widoku encji", - "filter-type-entity-view-type-description":"Widoki encji typu '{{entityViewTypes}}'", - "filter-type-entity-view-type-and-name-description":"Widoki encji typu '{{entityViewTypes}}' o nazwie rozpoczynającej się od '{{prefix}}'", - "filter-type-edge-type":"Typ krawędzi", - "filter-type-edge-type-description":"Krawędzie typu '{{edgeTypes}}'", - "filter-type-edge-type-and-name-description":"Krawędzie typu '{{edgeTypes}}' o nazwie rozpoczynającej się od '{{prefix}}'", - "filter-type-relations-query":"Zapytanie o relacje", - "filter-type-relations-query-description":"{{entities}} mające relację typu {{relationType}} {{direction}} {{rootEntity}}", - "filter-type-asset-search-query":"Zapytanie wyszukiwania aktywów", - "filter-type-asset-search-query-description":"Aktywa typu {{assetTypes}} mające relację typu {{relationType}} {{direction}} {{rootEntity}}", - "filter-type-device-search-query":"Zapytanie wyszukiwania urządzeń", - "filter-type-device-search-query-description":"Urządzenia typu {{deviceTypes}} mające relację typu {{relationType}} {{direction}} {{rootEntity}}", - "filter-type-entity-view-search-query":"Zapytanie wyszukiwania widoków encji", - "filter-type-entity-view-search-query-description":"Widoki encji typu {{entityViewTypes}} mające relację typu {{relationType}} {{direction}} {{rootEntity}}", - "filter-type-apiUsageState":"Stan użycia API", - "filter-type-edge-search-query":"Zapytanie wyszukiwania krawędzi", - "filter-type-edge-search-query-description":"Krawędzie typu {{edgeTypes}} mające relację typu {{relationType}} {{direction}} {{rootEntity}}", - "entity-filter":"Filtr encji", - "resolve-multiple":"Rozwiąż jako wiele encji", - "filter-type":"Typ filtra", - "filter-type-required":"Typ filtra jest wymagany.", - "entity-filter-no-entity-matched":"Nie znaleziono encji pasujących do określonego filtra.", - "no-entity-filter-specified":"Nie określono filtra encji", - "root-state-entity":"Użyj encji stanu pulpitu nawigacyjnego jako korzenia", - "last-level-relation":"Pobierz tylko relacje ostatniego poziomu", - "root-entity":"Encja główna", - "state-entity-parameter-name":"Nazwa parametru encji stanu", - "default-state-entity":"Domyślna encja stanu", - "default-entity-parameter-name":"Domyślnie", - "max-relation-level":"Maksymalny poziom relacji", - "unlimited-level":"Nieograniczony poziom", - "state-entity":"Encja stanu pulpitu nawigacyjnego", - "all-entities":"Wszystkie encje", - "any-relation":"dowolna" + "alias": { + "add": "Dodaj alias", + "edit": "Edytuj alias", + "name": "Nazwa aliasu", + "name-required": "Alias jest wymagany", + "duplicate-alias": "Alias o tej samej nazwie już istnieje.", + "filter-type-single-entity": "Pojedyńczy obiekt", + "filter-type-entity-group": "Grupa obietków", + "filter-type-entity-list": "Lista obiektów", + "filter-type-entity-name": "Nazwa obiektu", + "filter-type-entity-type": "Typ obiektu", + "filter-type-entity-group-list": "Lista grup obiektów", + "filter-type-entity-group-name": "Nazwa grupy obiektu", + "filter-type-entities-by-group-name": "Obiekty według nazwy grupy", + "filter-type-state-entity": "Obiekt ze stanu panelu", + "filter-type-state-entity-description": "Obiekt pobrany z parametrów stanu panelu", + "filter-type-state-entity-owner": "Właściciel obiektu ze stanu panelu", + "filter-type-state-entity-owner-description": "Właściciel obiektu pobrany z parametrów stanu panelu", + "filter-type-asset-type": "Typ zasobu", + "filter-type-asset-type-description": "Zasoby typu '{{assetTypes}}'", + "filter-type-asset-type-and-name-description": "Zasoby typu '{{assetTypes}}' i z nazwą zaczynającą się od '{{prefix}}'", + "filter-type-device-type": "Typ urządzenia", + "filter-type-device-type-description": "Urządzenia typu '{{deviceTypes}}'", + "filter-type-device-type-and-name-description": "Urządzenia typu '{{deviceTypes}}' i z nazwą zaczynającą się od '{{prefix}}'", + "filter-type-entity-view-type": "Typ widoku obiektu", + "filter-type-entity-view-type-description": "Widoki obiektów typu '{{entityViewTypes}}'", + "filter-type-entity-view-type-and-name-description": "Widoki obiektów typu '{{entityViewTypes}}' i z nazwą zaczynającą się od '{{prefix}}'", + "filter-type-edge-type": "Typ Edge", + "filter-type-edge-type-description": "Edge typu '{{edgeTypes}}'", + "filter-type-edge-type-and-name-description": "Edge typu '{{edgeTypes}}' i z nazwą zaczynającą się od '{{prefix}}'", + "filter-type-relations-query": "Zapytanie o relacje", + "filter-type-relations-query-description": "{{entities}} które mają {{relationType}} relację {{direction}} {{rootEntity}}", + "filter-type-edge-search-query": "Zapytanie wyszukiwania Edge", + "filter-type-edge-search-query-description": "Edge typu {{edgeTypes}} które mają {{relationType}} relacja {{direction}} {{rootEntity}}", + "filter-type-scheduler-event": "Zdarzenia planisty", + "filter-type-scheduler-event-type-description": "Zdarzenia planisty typu '{{eventType}}'", + "filter-type-scheduler-event-originator-description": "Zdarzenia planisty określonego inicjatora", + "filter-type-scheduler-event-type-originator-description": "Zdarzenia planisty określonego inicjatora typu '{{eventType}}'", + "filter-type-asset-search-query": "Zapytanie wyszukiwania zasobów", + "filter-type-asset-search-query-description": "Zasoby typów {{assetTypes}} które mają {{relationType}} relację {{direction}} {{rootEntity}}", + "filter-type-device-search-query": "Zapytanie wyszukiwania urządzenia", + "filter-type-device-search-query-description": "Urządzenia typów {{deviceTypes}} które mają {{relationType}} relację {{direction}} {{rootEntity}}", + "filter-type-entity-view-search-query": "Zapytanie wyszukiwania widoku obiektów", + "filter-type-entity-view-search-query-description": "Widoki obiektów typów {{entityViewTypes}} które mają {{relationType}} relację {{direction}} {{rootEntity}}", + "filter-type-apiUsageState": "Stan użycia interfejsu API", + "entity-filter": "Filtr obiektu", + "resolve-multiple": "Rozwiąż jako wiele obiektów", + "filter-type": "Typ filtra", + "filter-type-required": "Typ filtra jest wymagany.", + "entity-filter-no-entity-matched": "Nie znaleziono żadnych obiektów pasujących do określonego filtra.", + "no-entity-filter-specified": "Nie określono filtra obiektów", + "root-state-entity": "Użyj obiektu stanu panelu jako root", + "group-state-entity": "Użyj obiektu stanu panelu jako grupy obiektu", + "group-state-entity-owner": "Użyj obiektu stanu panelu jako właściciela grupy obiektu", + "last-level-relation": "Pobierz tylko relację ostatniego poziomu", + "root-entity": "Obiekt root", + "state-entity-parameter-name": "Nazwa parametru obiektu stanu", + "default-state-entity": "Domyślny obiekt stanu", + "default-state-entity-group": "Domyślna grupa obiektów stanu", + "default-entity-parameter-name": "Domyślnie", + "max-relation-level": "Maksymalny poziom relacji", + "unlimited-level": "Nieograniczony poziom", + "state-entity": "Obiekt stanu panelu", + "entities-of-group-state-entity": "Obiekty z grupy obiektów stanu panelu", + "all-entities": "Wszystkie obiekty", + "any-relation": "każda", + "originator": "Inicjator", + "originator-state-entity": "Użyj obiektu stanu panelu jako inicjatora", + "scheduler-event-type": "Typ zdarzenia planisty" }, - "asset":{ - "asset":"Aktywa", - "assets":"Aktywa", - "management":"Zarządzanie aktywami", - "view-assets":"Wyświetl aktywa", - "add":"Dodaj aktywa", - "asset-type-max-length":"Typ aktywa powinien być krótszy niż 256", - "assign-to-customer":"Przypisz do klienta", - "assign-asset-to-customer":"Przypisz aktywa do klienta", - "assign-asset-to-customer-text":"Proszę wybrać aktywa do przypisania klientowi", - "no-assets-text":"Nie znaleziono aktywów", - "assign-to-customer-text":"Proszę wybrać klienta do przypisania aktywów", - "public":"Publiczne", - "assignedToCustomer":"Przypisane do klienta", - "make-public":"Upublicznij aktywa", - "make-private":"Prywatyzuj aktywa", - "unassign-from-customer":"Usuń przypisanie od klienta", - "delete":"Usuń aktywa", - "asset-public":"Aktywa są publiczne", - "asset-type":"Typ aktywa", - "asset-type-required":"Typ aktywa jest wymagany.", - "select-asset-type":"Wybierz typ aktywa", - "enter-asset-type":"Wprowadź typ profilu aktywa", - "any-asset":"Dowolne aktywa", - "no-asset-types-matching":"Nie znaleziono typów aktywów pasujących do '{{entitySubtype}}'.", - "asset-type-list-empty":"Nie wybrano typów aktywów.", - "asset-types":"Typy aktywów", - "name":"Nazwa", - "name-required":"Nazwa jest wymagana.", - "name-max-length":"Nazwa powinna być krótsza niż 256", - "label-max-length":"Etykieta powinna być krótsza niż 256", - "description":"Opis", - "type":"Typ", - "type-required":"Typ jest wymagany.", - "details":"Szczegóły", - "events":"Wydarzenia", - "add-asset-text":"Dodaj nowe aktywa", - "asset-details":"Szczegóły aktywa", - "assign-assets":"Przypisz aktywa", - "assign-assets-text":"Przypisz { count, plural, =1 {1 aktywa} other {# aktywów} } do klienta", - "assign-asset-to-edge-title":"Przypisz aktywa do krawędzi", - "assign-asset-to-edge-text":"Proszę wybrać aktywa do przypisania do krawędzi", - "delete-assets":"Usuń aktywa", - "unassign-assets":"Usuń przypisanie aktywów", - "unassign-assets-action-title":"Usuń przypisanie { count, plural, =1 {1 aktywa} other {# aktywów} } od klienta", - "assign-new-asset":"Przypisz nowe aktywa", - "delete-asset-title":"Czy na pewno chcesz usunąć aktywa '{{assetName}}'?", - "delete-asset-text":"Ostrożnie, po potwierdzeniu aktywa oraz wszystkie powiązane dane staną się nieodwracalne.", - "delete-assets-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 aktywa} other {# aktywów} }?", - "delete-assets-action-title":"Usuń { count, plural, =1 {1 aktywa} other {# aktywów} }", - "delete-assets-text":"Ostrożnie, po potwierdzeniu wszystkie wybrane aktywa oraz wszystkie powiązane dane staną się nieodwracalne.", - "make-public-asset-title":"Czy na pewno chcesz uczynić aktywa '{{assetName}}' publicznymi?", - "make-public-asset-text":"Po potwierdzeniu aktywa oraz wszystkie jego dane staną się publicznie dostępne.", - "make-private-asset-title":"Czy na pewno chcesz uczynić aktywa '{{assetName}}' prywatnymi?", - "make-private-asset-text":"Po potwierdzeniu aktywa oraz wszystkie jego dane staną się prywatne i niedostępne dla innych.", - "unassign-asset-title":"Czy na pewno chcesz usunąć przypisanie aktywów '{{assetName}}'?", - "unassign-asset-text":"Po potwierdzeniu aktywa zostaną usunięte z przypisania i nie będą dostępne dla klienta.", - "unassign-asset":"Usuń przypisanie aktywów", - "unassign-assets-title":"Czy na pewno chcesz usunąć przypisanie { count, plural, =1 {1 aktywa} other {# aktywów} }?", - "unassign-assets-text":"Po potwierdzeniu wszystkie wybrane aktywa zostaną usunięte z przypisania i nie będą dostępne dla klienta.", - "unassign-assets-from-edge":"Usuń przypisanie aktywów od krawędzi", - "copyId":"Kopiuj ID aktywów", - "idCopiedMessage":"ID aktywów zostało skopiowane do schowka", - "select-asset":"Wybierz aktywa", - "no-assets-matching":"Nie znaleziono aktywów pasujących do '{{entity}}'.", - "asset-required":"Aktywa są wymagane", - "name-starts-with":"Wyrażenie nazwy aktywów", - "help-text":"Użyj '%', zgodnie z potrzebą: '%nazwa_zawiera_aktywa%', '%nazwa_kończy_się_aktywami', 'nazwa_rozpoczyna_się_aktywami'.", - "import":"Importuj aktywa", - "asset-file":"Plik aktywów", - "label":"Etykieta", - "search":"Wyszukaj aktywa", - "assign-asset-to-edge":"Przypisz aktywa do krawędzi", - "unassign-asset-from-edge":"Usuń przypisanie aktywów od krawędzi", - "unassign-asset-from-edge-title":"Czy na pewno chcesz usunąć przypisanie aktywów '{{assetName}}' od krawędzi?", - "unassign-asset-from-edge-text":"Po potwierdzeniu aktywa zostaną usunięte z przypisania od krawędzi i nie będą dostępne dla tej krawędzi.", - "unassign-assets-from-edge-title":"Czy na pewno chcesz usunąć przypisanie { count, plural, =1 {1 aktywa} other {# aktywów} } od krawędzi?", - "unassign-assets-from-edge-text":"Po potwierdzeniu wszystkie wybrane aktywa zostaną usunięte z przypisania od krawędzi i nie będą dostępne dla tej krawędzi.", - "selected-assets":"{ count, plural, =1 {1 aktywo} other {# aktywów} } wybrane" + "asset": { + "all": "Wszystko", + "all-assets": "Wszystkie zasoby", + "groups": "Grupy", + "shared": "Współdzielony", + "asset": "Zasób", + "assets": "Zasoby", + "management": "Zarządzanie zasobami", + "view-assets": "Zobacz zasoby", + "add": "Dodaj zasób", + "asset-type-max-length": "Typ zasobu powinien być mniejszy niż 256", + "assign-to-customer": "Przypisz do klienta", + "assign-asset-to-customer": "Przypisz zasoby do klienta", + "assign-asset-to-customer-text": "Wybierz zasoby, które chcesz przypisać klientowi", + "no-assets-text": "Nie znaleziono żadnych zasobów", + "assign-to-customer-text": "Wybierz klienta, któremu chcesz przypisać zasoby", + "public": "Publiczny", + "assignedToCustomer": "Przypisany do klienta", + "make-public": "Ustaw zasób jako publiczny", + "make-private": "Ustaw zasób jako prywatny", + "unassign-from-customer": "Usuń przypisanie do klienta", + "delete": "Usuń zasób", + "asset-public": "Zasób jest publiczny", + "asset-type": "Typ zasobu", + "asset-type-required": "Typ zasobu jest wymagany.", + "select-asset-type": "Wybierz typ zasobu", + "enter-asset-type": "Wpisz typ zasobu", + "any-asset": "Dowolny zasób", + "no-asset-types-matching": "Nie znaleziono zasobów pasujących do '{{entitySubtype}}'.", + "asset-type-list-empty": "Nie wybrano typów zasobów.", + "asset-types": "Typy zasobów", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana.", + "name-max-length": "Nazwa powinna być mniejsza niż 256", + "label-max-length": "Etykieta powinna być mniejsza niż 256", + "description": "Opis", + "type": "Typ", + "type-required": "Typ jest wymagany.", + "details": "Szczegóły", + "events": "Wydarzenia", + "add-asset-text": "Dodaj nowy zasób", + "asset-details": "Szczegóły zasobu", + "assign-assets": "Przypisz zasoby", + "assign-assets-text": "Przypisz {count, plural, =1 {1 zasób} other {# zasobów} }", + "assign-asset-to-edge-title": "Przypisz zasoby do edge", + "assign-asset-to-edge-text": "Wybierz zasoby, które chcesz przypisać do Edge", + "delete-assets": "Usuń zasoby", + "unassign-assets": "Cofnij przypisanie zasobów", + "unassign-assets-action-title": "Anuluj przypisanie {count, plural, =1 {1 zasobu} other {# zasobów} }", + "assign-new-asset": "Przypisz nowy zasób", + "delete-asset-title": "Czy na pewno chcesz usunąć zasób '{{assetName}}'?", + "delete-asset-text": "Bądź ostrożny, po potwierdzeniu zasobu i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-assets-title": "Czy na pewno chcesz usunąć {count, plural, =1 {1 zasób} other {# zasobów} }?", + "delete-assets-action-title": "Usuń {count, plural, =1 {1 zasób} other {# zasobów} }", + "delete-assets-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane zasoby zostaną usunięte, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "make-public-asset-title": "Czy na pewno chcesz uczynić zasób '{{assetName}}' publicznym?", + "make-public-asset-text": "Po potwierdzeniu zasób i wszystkie jego dane zostaną upublicznione i dostępne dla innych.", + "make-private-asset-title": "Czy na pewno chcesz uczynić zasób '{{assetName}}' prywatnym?", + "make-private-asset-text": "Po potwierdzeniu zasób i wszystkie jego dane staną się prywatne i nie będą dostępne dla innych.", + "unassign-asset-title": "Czy na pewno chcesz cofnąć przypisanie zasobu '{{assetName}}'?", + "unassign-asset-text": "Po potwierdzeniu zasób zostanie usunięty i nie będzie dostępny dla klienta.", + "unassign-asset": "Cofnij przypisanie zasobu", + "unassign-assets-title": "Czy na pewno chcesz cofnąć przypisanie {count, plural, =1 {1 zasobu} other {# zasobów} }?", + "unassign-assets-text": "Po potwierdzeniu wszystkie wybrane zasoby zostaną anulowane i nie będą dostępne dla klienta.", + "copyId": "Skopiuj identyfikator zasobu", + "idCopiedMessage": "Identyfikator zasobu został skopiowany do schowka", + "select-asset": "Wybierz zasób", + "no-assets-matching": "Nie znaleziono zasobów pasujących do '{{entity}}'.", + "asset-required": "Zasób jest wymagany", + "name-starts-with": "Wyrażenie nazwy zasobu", + "help-text": "Użyj „%” w zależności od potrzeb: „%asset_name_contains%”, „%asset_name_ends”, „%asset_starts_with”.", + "search": "Wyszukaj zasoby", + "select-group-to-add": "Wybierz grupę docelową, aby dodać wybrane zasoby", + "select-group-to-move": "Wybierz grupę docelową, aby przenieść wybrane zasoby", + "remove-assets-from-group": "Czy na pewno chcesz usunąć {count, plural, =1 {1 zasób} other {# zasobów} } z grupy '{{{entityGroup}}'?", + "group": "Grupa zasobów", + "list-of-groups": "{count, plural, =1 {Jedna grupa zasobów} other {Lista # grup zasobów} }", + "group-name-starts-with": "Grupy zasobów, których nazwy zaczynają się od '{{prefix}}'", + "import": "Importuj zasoby", + "asset-file": "Plik zasobów", + "label": "Etykieta", + "assign-asset-to-edge": "Przypisz zasoby do Edge", + "unassign-asset-from-edge": "Cofnij przypisanie zasobu", + "unassign-asset-from-edge-title": "Czy na pewno chcesz cofnąć przypisanie zasobu '{{assetName}}'?", + "unassign-asset-from-edge-text": "Po potwierdzeniu zasób zostanie usunięty i nie będzie dostępny na urządzeniu Edge.", + "unassign-assets-from-edge-title": "Czy na pewno chcesz cofnąć przypisanie { count, plural, =1 {1 zasobu} other {# zasobów} }?", + "unassign-assets-from-edge-text": "Po potwierdzeniu wszystkie wybrane zasoby zostaną anulowane i nie będą dostępne na urządzeniu Edge.", + "selected-assets": "Wybrano { count, plural, =1 {1 zasób} other {# zasobów} }" }, - "attribute":{ - "attributes":"Atrybuty", - "latest-telemetry":"Najnowsza telemetria", - "no-latest-telemetry":"Brak najnowszej telemetrii", - "attributes-scope":"Zakres atrybutów encji", - "scope-telemetry":"Telemetria", - "scope-latest-telemetry":"Najnowsza telemetria", - "scope-client":"Atrybuty klienta", - "scope-server":"Atrybuty serwera", - "scope-shared":"Atrybuty współdzielone", - "add":"Dodaj atrybut", - "key":"Klucz", - "key-max-length":"Klucz powinien być krótszy niż 256", - "last-update-time":"Czas ostatniej aktualizacji", - "key-required":"Klucz atrybutu jest wymagany.", - "value":"Wartość", - "value-required":"Wartość atrybutu jest wymagana.", - "telemetry-key-required":"Klucz telemetrii jest wymagany", - "telemetry-value-required":"Wartość telemetrii jest wymagana", - "delete-attributes-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 atrybut} other {# atrybutów} }?", - "delete-attributes-text":"Ostrożnie, po potwierdzeniu wszystkie wybrane atrybuty zostaną usunięte.", - "delete-attributes":"Usuń atrybuty", - "enter-attribute-value":"Wprowadź wartość atrybutu", - "show-on-widget":"Pokaż na widżecie", - "widget-mode":"Tryb widżetu", - "next-widget":"Następny widżet", - "prev-widget":"Poprzedni widżet", - "add-to-dashboard":"Dodaj do pulpitu nawigacyjnego", - "add-widget-to-dashboard":"Dodaj widżet do pulpitu nawigacyjnego", - "selected-attributes":"{ count, plural, =1 {1 atrybut} other {# atrybutów} } wybrano", - "selected-telemetry":"{ count, plural, =1 {1 jednostka telemetrii} other {# jednostek telemetrii} } wybrano", - "no-attributes-text":"Nie znaleziono atrybutów", - "no-telemetry-text":"Nie znaleziono telemetrii", - "copy-key":"Kopiuj klucz", - "add-telemetry":"Dodaj telemetrię", - "copy-value":"Kopiuj wartość", - "delete-timeseries":{ - "start-time":"Czas rozpoczęcia", - "ends-on":"Kończy się", - "strategy":"Strategia", - "delete-strategy":"Strategia usuwania", - "all-data":"Usuń wszystkie dane", - "all-data-except-latest-value":"Usuń wszystkie dane oprócz najnowszej wartości", - "latest-value":"Usuń najnowszą wartość", - "all-data-for-time-period":"Usuń wszystkie dane za okres czasu", - "rewrite-latest-value":"Zastąp najnowszą wartość" + "attribute": { + "attributes": "Atrybuty", + "latest-telemetry": "Najnowsza telemetria", + "no-latest-telemetry": "Brak telemetrii", + "attributes-scope": "Zakres atrybutów encji", + "scope-telemetry": "Telemetry", + "scope-latest-telemetry": "Najnowsza telemetria", + "scope-client": "Atrybuty klienta", + "scope-server": "Atrybuty serwera", + "scope-shared": "Wspólne atrybuty", + "add": "Dodaj atrybut", + "add-attribute-prompt": "Proszę dodać atrybut", + "key": "Klucz", + "key-max-length": "Klucz powinien być krótszy niż 256 znaków", + "last-update-time": "Ostatnia aktualizacja", + "key-required": "Klucz atrybutu jest wymagany.", + "value": "Wartość", + "value-required": "Wartość atrybutu jest wymagana.", + "telemetry-key-required": "Telemetry key is required", + "telemetry-value-required": "Telemetry value is required", + "delete-attributes-title": "Czy na pewno chcesz usunąć {count, plural, =1 {1 atrybut} other {# atrybutów} }?", + "delete-attributes-text": "Uważaj, po potwierdzeniu wszystkie wybrane atrybuty zostaną usunięte.", + "delete-attributes": "Usuń atrybuty", + "enter-attribute-value": "Wprowadź wartość atrybutu", + "show-on-widget": "Pokaż na widżecie", + "widget-mode": "Tryb widgetu", + "next-widget": "Następny widżet", + "prev-widget": "Poprzedni widżet", + "add-to-dashboard": "Dodaj do panelu", + "add-widget-to-dashboard": "Dodaj widżet do panelu", + "selected-attributes": "Wybrano {count, plural, =1 {1 atrybut} other {# atrybutów} }", + "selected-telemetry": "Wybrano {count, plural, =1 {1 jednostkę telemetrii} other {# jednostek telemetrii} }", + "no-attributes-text": "Nie znaleziono atrybutów", + "no-telemetry-text": "Nie znaleziono danych telemetrycznych", + "copy-key": "Skopiuj klucz", + "add-telemetry": "Dodaj telemetrię", + "copy-value": "Skopiuj wartość", + "delete-timeseries": { + "start-time": "Start time", + "ends-on": "Ends on", + "strategy": "Strategy", + "delete-strategy": "Delete strategy", + "all-data": "Delete all data", + "all-data-except-latest-value": "Delete all data except latest value", + "latest-value": "Delete latest value", + "all-data-for-time-period": "Delete all data for time period", + "rewrite-latest-value": "Rewrite latest value" } }, - "api-usage":{ - "api-features":"Funkcje API", - "api-usage":"Użycie API", - "alarm":"Alarm", - "alarms-created":"Utworzone alarmy", - "alarms-created-daily-activity":"Dzienna aktywność utworzonych alarmów", - "alarms-created-hourly-activity":"Godzinna aktywność utworzonych alarmów", - "alarms-created-monthly-activity":"Miesięczna aktywność utworzonych alarmów", - "data-points":"Punkty danych", - "data-points-storage-days":"Dni przechowywania punktów danych", - "device-api":"API urządzenia", - "email":"Email", - "email-messages":"Wiadomości e-mail", - "email-messages-daily-activity":"Dzienna aktywność wiadomości e-mail", - "email-messages-monthly-activity":"Miesięczna aktywność wiadomości e-mail", - "exceptions":"Wyjątki", - "executions":"Wykonania", - "scripts":"Skrypty", - "scripts-hourly-activity":"Godzinna aktywność skryptów", - "scripts-daily-activity":"Dzienna aktywność skryptów", - "scripts-monthly-activity":"Miesięczna aktywność skryptów", - "javascript":"JavaScript", - "javascript-executions":"Wykonania JavaScript", - "tbel":"TBEL", - "tbel-executions":"Wykonania TBEL", - "latest-error":"Ostatni błąd", - "messages":"Wiadomości", - "notifications":"Powiadomienia", - "notifications-email-sms":"Powiadomienia (Email/SMS)", - "notifications-hourly-activity":"Godzinna aktywność powiadomień", - "permanent-failures":"Stałe awarie ${entityName}", - "permanent-timeouts":"Stałe przekroczenia czasu ${entityName}", - "processing-failures":"Błędy przetwarzania ${entityName}", - "processing-failures-and-timeouts":"Błędy przetwarzania i przekroczenia czasu", - "processing-timeouts":"Przekroczenia czasu przetwarzania ${entityName}", - "queue-stats":"Statystyki kolejki", - "rule-chain":"Łańcuch reguł", - "rule-engine":"Silnik reguł", - "rule-engine-daily-activity":"Dzienna aktywność silnika reguł", - "rule-engine-executions":"Wykonania silnika reguł", - "rule-engine-hourly-activity":"Godzinna aktywność silnika reguł", - "rule-engine-monthly-activity":"Miesięczna aktywność silnika reguł", - "rule-engine-statistics":"Statystyki silnika reguł", - "rule-node":"Węzeł reguł", - "sms":"SMS", - "sms-messages":"Wiadomości SMS", - "sms-messages-daily-activity":"Dzienna aktywność wiadomości SMS", - "sms-messages-monthly-activity":"Miesięczna aktywność wiadomości SMS", - "successful":"Udane ${entityName}", - "telemetry":"Telemetria", - "telemetry-persistence":"Przechowywanie telemetrii", - "telemetry-persistence-daily-activity":"Dzienna aktywność przechowywania telemetrii", - "telemetry-persistence-hourly-activity":"Godzinna aktywność przechowywania telemetrii", - "telemetry-persistence-monthly-activity":"Miesięczna aktywność przechowywania telemetrii", - "transport":"Transport", - "transport-daily-activity":"Dzienna aktywność transportu", - "transport-data-points":"Punkty danych transportu", - "transport-hourly-activity":"Godzinna aktywność transportu", - "transport-messages":"Wiadomości transportu", - "transport-monthly-activity":"Miesięczna aktywność transportu", - "view-details":"Wyświetl szczegóły", - "view-statistics":"Wyświetl statystyki" + "api-usage": { + "api-features": "Funkcje API", + "api-usage": "Użycie API", + "alarm": "Alarm", + "alarms-created": "Utworzono alarmy", + "alarms-created-daily-activity": "Alarmy tworzyły codzienną aktywność", + "alarms-created-hourly-activity": "Alarmy utworzyły aktywność godzinową", + "alarms-created-monthly-activity": "Alarmy utworzyły miesięczną aktywność", + "data-points": "Punkty danych", + "data-points-storage-days": "Dni przechowywania punktów danych", + "device-api": "Interfejs API urządzenia", + "email": "E-mail", + "email-messages": "Wiadomości e-mailowe", + "email-messages-daily-activity": "Codzienna aktywność związana z wiadomościami e-mail", + "email-messages-monthly-activity": "Miesięczna aktywność dotycząca wiadomości e-mail", + "exceptions": "Wyjątki", + "executions": "Wywołania", + "javascript": "JavaScript", + "javascript-executions": "Wykonania JavaScript", + "javascript-functions": "Funkcje JavaScriptu", + "javascript-functions-daily-activity": "Funkcje JavaScript w codziennej działalności", + "javascript-functions-hourly-activity": "Funkcje JavaScript, aktywność godzinowa", + "javascript-functions-monthly-activity": "Funkcje JavaScript, aktywność miesięczna", + "latest-error": "Ostatni błąd", + "messages": "Wiadomości", + "notifications": "Powiadomienia", + "notifications-email-sms": "Powiadomienia (e-mail/sms)", + "notifications-hourly-activity": "Powiadomienia o aktywności godzinowej", + "permanent-failures": "${entityName} Trwałe awarie", + "permanent-timeouts": "${entityName} Stałe przekroczenia limitu czasu", + "processing-failures": "${entityName} Błędy przetwarzania", + "processing-failures-and-timeouts": "Błędy przetwarzania i przekroczenia limitu czasu", + "processing-timeouts": "${entityName} Przekroczono limity czasu przetwarzania", + "queue-stats": "Statystyki kolejek", + "rule-chain": "Łańcuch reguł", + "rule-engine": "Silnik reguł", + "rule-engine-daily-activity": "Dzienna aktywność silnika reguł", + "rule-engine-executions": "Wykonania silnika reguł", + "rule-engine-hourly-activity": "Aktywność godzinowa silnika reguły", + "rule-engine-monthly-activity": "Miesięczna aktywność silnika reguł", + "rule-engine-statistics": "Statystyki silnika reguł", + "rule-node": "Węzeł reguły", + "sms": "SMS-em", + "sms-messages": "Wiadomości SMS", + "sms-messages-daily-activity": "Codzienna aktywność związana z wiadomościami SMS", + "sms-messages-monthly-activity": "Miesięczna aktywność wiadomości SMS", + "successful": "${entityName} Pomyślne", + "telemetry": "Telemetria", + "telemetry-persistence": "Trwałość telemetrii", + "telemetry-persistence-daily-activity": "Telemetria utrzymująca codzienną aktywność", + "telemetry-persistence-hourly-activity": "Aktywność godzinowa trwałości telemetrii", + "telemetry-persistence-monthly-activity": "Miesięczna aktywność dotycząca trwałości telemetrii", + "transport": "Transport", + "transport-daily-activity": "Codzienna aktywność transportowa", + "transport-data-points": "Punkty danych dotyczących transportu", + "transport-hourly-activity": "Godzinowa aktywność transportowa", + "transport-messages": "Komunikaty transportowe", + "transport-monthly-activity": "Miesięczna aktywność transportowa", + "view-details": "Pokaż szczegóły", + "view-statistics": "Zobacz statystyki" }, - "api-limit":{ - "cassandra-queries":"Zapytania do Cassandry", - "entity-version-creation":"Tworzenie wersji encji", - "entity-version-load":"Ładowanie wersji encji", - "notification-requests":"Żądania powiadomień", - "notification-requests-per-rule":"Żądania powiadomień na regułę", - "rest-api-requests":"Żądania REST API", - "rest-api-requests-per-customer":"Żądania REST API na klienta", - "transport-messages":"Wiadomości transportowe", - "transport-messages-per-device":"Wiadomości transportowe na urządzenie", - "ws-updates-per-session":"Aktualizacje WS na sesję" + "api-limit": { + "cassandra-queries": "Cassandra queries", + "entity-version-creation": "Entity version creation", + "entity-version-load": "Entity version load", + "integration-messages": "Integration messages", + "integration-messages-per-device": "Integration messages per device", + "notification-requests": "Notification requests", + "notification-requests-per-rule": "Notification requests per rule", + "reports-generation": "Reports generation", + "rest-api-requests": "REST API requests", + "rest-api-requests-per-customer": "REST API requests per customer", + "transport-messages": "Transport messages", + "transport-messages-per-device": "Transport messages per device", + "ws-updates-per-session": "WS updates per session" }, - "audit-log":{ - "audit":"Audyt", - "audit-logs":"Dzienniki audytu", - "timestamp":"Znacznik czasu", - "entity-type":"Typ encji", - "entity-name":"Nazwa encji", - "user":"Użytkownik", - "type":"Typ", - "status":"Status", - "details":"Szczegóły", - "type-added":"Dodano", - "type-deleted":"Usunięto", - "type-updated":"Zaktualizowano", - "type-attributes-updated":"Zaktualizowano atrybuty", - "type-attributes-deleted":"Usunięto atrybuty", - "type-rpc-call":"Wywołanie RPC", - "type-credentials-updated":"Zaktualizowano dane uwierzytelniające", - "type-assigned-to-customer":"Przypisano do klienta", - "type-unassigned-from-customer":"Usunięto przypisanie od klienta", - "type-assigned-to-edge":"Przypisano do krawędzi", - "type-unassigned-from-edge":"Usunięto przypisanie od krawędzi", - "type-activated":"Aktywowano", - "type-suspended":"Zawieszono", - "type-credentials-read":"Odczytano dane uwierzytelniające", - "type-attributes-read":"Odczytano atrybuty", - "type-relation-add-or-update":"Zaktualizowano relację", - "type-relation-delete":"Usunięto relację", - "type-relations-delete":"Usunięto wszystkie relacje", - "type-alarm-ack":"Potwierdzono", - "type-alarm-clear":"Wyczyszczono", - "type-alarm-assign":"Przypisano", - "type-alarm-unassign":"Usunięto przypisanie", - "type-added-comment":"Dodano komentarz", - "type-updated-comment":"Zaktualizowano komentarz", - "type-deleted-comment":"Usunięto komentarz", - "type-login":"Logowanie", - "type-logout":"Wylogowanie", - "type-lockout":"Blokada", - "status-success":"Sukces", - "status-failure":"Niepowodzenie", - "audit-log-details":"Szczegóły dziennika audytu", - "no-audit-logs-prompt":"Nie znaleziono dzienników", - "action-data":"Dane akcji", - "failure-details":"Szczegóły niepowodzenia", - "search":"Szukaj w dziennikach audytu", - "clear-search":"Wyczyść wyszukiwanie", - "type-assigned-from-tenant":"Przypisano od dzierżawcy", - "type-assigned-to-tenant":"Przypisano do dzierżawcy", - "type-provision-success":"Pomyślne przygotowanie urządzenia", - "type-provision-failure":"Niepowodzenie przygotowania urządzenia", - "type-timeseries-updated":"Zaktualizowano telemetrię", - "type-timeseries-deleted":"Usunięto telemetrię", - "type-sms-sent":"Wysłano SMS" + "audit-log": { + "audit": "Rewizja", + "audit-logs": "Dzienniki audytu", + "timestamp": "Znak czasu", + "entity-type": "Typ obiektu", + "entity-name": "Nazwa obiektu", + "user": "Użytkownik", + "type": "Typ", + "status": "Status", + "details": "Szczegóły", + "type-added": "Dodany", + "type-deleted": "Usunięto", + "type-updated": "Zaktualizowano", + "type-attributes-updated": "Zaktualizowano atrybuty", + "type-attributes-deleted": "Atrybuty usunięte", + "type-rpc-call": "Zadzwoń do RPC", + "type-credentials-updated": "Dane uwierzytelniające zaktualizowane", + "type-assigned-to-customer": "Przypisane do Klienta", + "type-unassigned-from-customer": "Nieprzypisane od klienta", + "type-assigned-to-edge": "Przypisany do Edge", + "type-unassigned-from-edge": "Nieprzypisany do Edge", + "type-activated": "Aktywowany", + "type-suspended": "Zawieszony", + "type-credentials-read": "Poświadczenia przeczytane", + "type-attributes-read": "Odczytane atrybuty", + "type-added-to-entity-group": "Dodano do grupy", + "type-removed-from-entity-group": "Usunięto z grupy", + "type-relation-add-or-update": "Relacja zaktualizowana", + "type-relation-delete": "Relacja usunięta", + "type-relations-delete": "Wszystkie relacje usunięte", + "type-alarm-ack": "Uznany", + "type-alarm-clear": "Wyczyszczone", + "type-alarm-assign": "Przydzielony", + "type-alarm-unassign": "Nieprzypisany", + "type-added-comment": "Dodano komentarz", + "type-updated-comment": "Zaktualizowany komentarz", + "type-deleted-comment": "Usunięty komentarz", + "type-rest-api-rule-engine-call": "Wywołanie API REST mechanizmu reguł", + "type-made-public": "Upublicznione", + "type-made-private": "Zrobione prywatnie", + "type-login": "Zaloguj się", + "type-logout": "Wyloguj", + "type-lockout": "Lokaut", + "status-success": "Powodzenie", + "status-failure": "Awaria", + "audit-log-details": "Szczegóły dziennika audytu", + "no-audit-logs-prompt": "Nie znaleziono logów", + "action-data": "Dane akcji", + "failure-details": "Szczegóły awarii", + "search": "Przeszukaj dzienniki kontroli", + "clear-search": "Wyczyść wyszukiwanie", + "type-assigned-from-tenant": "Przypisane od Najemcy", + "type-assigned-to-tenant": "Przypisane Najemcy", + "type-provision-success": "Urządzenie udostępnione", + "type-provision-failure": "Udostępnienie urządzenia nie powiodło się", + "type-timeseries-updated": "Telemetria zaktualizowana", + "type-timeseries-deleted": "Telemetria usunięta", + "type-owner-changed": "Właściciel się zmienił", + "type-sms-sent": "SMS sent" }, - "confirm-on-exit":{ - "message":"Masz niezapisane zmiany. Czy na pewno chcesz opuścić tę stronę?", - "html-message":"Masz niezapisane zmiany.
Czy na pewno chcesz opuścić tę stronę?", - "title":"Niezapisane zmiany" + "confirm-on-exit": { + "message": "Masz niezapisane zmiany. ", + "html-message": "Masz niezapisane zmiany.
Czy na pewno chcesz opuścić tę stronę?", + "title": "Niezapisane zmiany" }, - "contact":{ - "country":"Kraj", - "city":"Miasto", - "state":"Stan / Prowincja", - "postal-code":"Kod pocztowy", - "postal-code-invalid":"Nieprawidłowy format kodu pocztowego.", - "address":"Adres", - "address2":"Adres 2", - "phone":"Telefon", - "email":"Email", - "no-address":"Brak adresu", - "state-max-length":"Długość stanu powinna być mniejsza niż 256", - "phone-max-length":"Numer telefonu powinien być krótszy niż 256", - "city-max-length":"Nazwa miasta powinna być krótsza niż 256" + "contact": { + "country": "Kraj", + "city": "Miasto", + "state": "Stan/prowincja", + "postal-code": "Kod pocztowy", + "postal-code-invalid": "Nieprawidłowy format kodu pocztowego.", + "address": "Adres", + "address2": "Adres 2", + "phone": "Telefon", + "email": "E-mail", + "no-address": "Brak adresu", + "state-max-length": "Długość stanu powinna być mniejsza niż 256", + "phone-max-length": "Numer telefonu powinien być mniejszy niż 256", + "city-max-length": "Określone miasto powinno być mniejsze niż 256" }, - "common":{ - "username":"Nazwa użytkownika", - "password":"Hasło", - "enter-username":"Wprowadź nazwę użytkownika", - "enter-password":"Wprowadź hasło", - "enter-search":"Wprowadź wyszukiwanie", - "created-time":"Czas utworzenia", - "loading":"Ładowanie...", - "proceed":"Kontynuuj", - "open-details-page":"Otwórz stronę szczegółów", - "not-found":"Nie znaleziono", - "documentation":"Dokumentacja" + "common": { + "username": "Nazwa użytkownika", + "password": "Hasło", + "enter-username": "Wpisz nazwę użytkownika", + "enter-password": "Wprowadź hasło", + "enter-search": "Wprowadź wyszukiwanie", + "created-time": "Stworzony czas", + "loading": "Ładowanie...", + "proceed": "Przystępować", + "open-details-page": "Otwórz stronę szczegółów", + "not-found": "Not found", + "documentation": "Documentation" }, - "content-type":{ - "json":"Json", - "text":"Tekst", - "binary":"Binarny (Base64)" + "converter": { + "converter": "Konwerter danych", + "converters": "Konwertery danych", + "select-converter": "Wybierz konwerter danych", + "no-converters-matching": "Brak znalezionych konwerterów danych pasujących do '{{entity}}'.", + "no-converters-found": "Nie znaleziono konwerterów danych.", + "converter-required": "Konwerter danych jest wymagany", + "delete": "Usuń konwerter", + "management": "Zarządzanie konwerterami danych", + "add-converter-text": "Dodaj nowy konwerter danych", + "no-converters-text": "Nie znaleziono konwerterów danych", + "selected-converters": "Wybrano {count, plural, =1 {1 konwerter danych} other {# konwerterów danych} }", + "delete-converter-title": "Czy na pewno chcesz usunąć konwerter danych '{{converterName}}'?", + "delete-converter-text": "Bądź ostrożny, po potwierdzeniu konwerter danych i wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "delete-converters-title": "Czy na pewno chcesz usunąć {count, plural, =1 {1 konwerter danych} other {# konwerterów danych} }?", + "delete-converters-action-title": "Usuń {count, plural, =1 {1 konwerter danych} other {# konwerterów danych} }", + "delete-converters-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane konwertery danych zostaną usunięte, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "events": "Wydarzenia", + "add": "Dodaj konwerter danych", + "search": "Wyszukaj konwertery danych", + "converter-details": "Szczegóły konwertera danych", + "details": "Szczegóły", + "copyId": "Skopiuj identyfikator konwertera", + "idCopiedMessage": "Identyfikator konwertera został skopiowany do schowka", + "debug-mode": "Tryb debugowania", + "created-time": "Stworzony czas", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana.", + "name-max-length": "Nazwa powinna być mniejsza niż 256", + "description": "Opis", + "decoder": "Dekoder", + "encoder": "Enkoder", + "test-decoder-fuction": "Sprawdź działanie dekodera", + "test-encoder-fuction": "Testuj działanie enkodera", + "test-with-this-message": "{{test}} with this message", + "decoder-input-params": "Parametry wejściowe dekodera", + "encoder-input-params": "Parametry wejściowe enkodera", + "payload": "Payload", + "payload-content-type": "Typ zawartości payload", + "payload-content": "Zawartość payload", + "message": "Wiadomość", + "message-type": "Typ wiadomości", + "message-type-required": "Typ wiadomości jest wymagany", + "test": "Test", + "metadata": "Metadane", + "metadata-required": "Wpisy metadanych nie mogą być puste.", + "integration-metadata": "Metadane integracji", + "integration-metadata-required": "Wpisy metadanych integracji nie mogą być puste.", + "output": "Wyjście", + "import": "Importuj konwerter", + "export": "Eksportuj konwerter", + "export-failed-error": "Nie można wyeksportować konwertera: {{error}}", + "create-new-converter": "Utwórz nowy konwerter", + "converter-file": "Plik konwertera", + "invalid-converter-file-error": "Nie można zaimportować konwertera: Nieprawidłowa struktura danych konwertera.", + "type": "Typ", + "type-required": "Typ jest wymagany.", + "type-uplink": "Łącze w górę", + "type-downlink": "Łącze w dół", + "update-only-keys-list": "Update only keys list", + "update-only-keys-list-hint": "The values associated with the provided keys will be saved to the database only if they are different from the corresponding values in the previous converted message. This functionality applies to both attributes and telemetry in the converter output.", + "add-key": "Add key" }, - "customer":{ - "customer":"Klient", - "customers":"Klienci", - "management":"Zarządzanie klientami", - "dashboard":"Pulpit nawigacyjny klienta", - "dashboards":"Pulpity nawigacyjne klienta", - "devices":"Urządzenia klienta", - "entity-views":"Widoki encji klienta", - "assets":"Aktywa klienta", - "public-dashboards":"Publiczne pulpity nawigacyjne", - "public-devices":"Publiczne urządzenia", - "public-assets":"Publiczne aktywa", - "public-edges":"Publiczne krawędzie", - "public-entity-views":"Publiczne widoki encji", - "add":"Dodaj klienta", - "delete":"Usuń klienta", - "manage-customer-users":"Zarządzaj użytkownikami klienta", - "manage-customer-devices":"Zarządzaj urządzeniami klienta", - "manage-customer-dashboards":"Zarządzaj pulpitami nawigacyjnymi klienta", - "manage-public-devices":"Zarządzaj publicznymi urządzeniami", - "manage-public-dashboards":"Zarządzaj publicznymi pulpitami nawigacyjnymi", - "manage-customer-assets":"Zarządzaj aktywami klienta", - "manage-public-assets":"Zarządzaj publicznymi aktywami", - "manage-customer-edges":"Zarządzaj krawędziami klienta", - "manage-public-edges":"Zarządzaj publicznymi krawędziami", - "add-customer-text":"Dodaj nowego klienta", - "no-customers-text":"Nie znaleziono klientów", - "customer-details":"Szczegóły klienta", - "delete-customer-title":"Czy na pewno chcesz usunąć klienta '{{customerTitle}}'?", - "delete-customer-text":"Uważaj, po potwierdzeniu klient i wszystkie powiązane dane staną się nieodwracalne.", - "delete-customers-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 klienta} other {# klientów} }?", - "delete-customers-action-title":"Usuń { count, plural, =1 {1 klienta} other {# klientów} }", - "delete-customers-text":"Uważaj, po potwierdzeniu wszyscy wybrani klienci oraz wszystkie powiązane dane staną się nieodwracalne.", - "manage-users":"Zarządzaj użytkownikami", - "manage-assets":"Zarządzaj aktywami", - "manage-devices":"Zarządzaj urządzeniami", - "manage-dashboards":"Zarządzaj pulpitami nawigacyjnymi", - "title":"Tytuł", - "title-required":"Tytuł jest wymagany.", - "title-max-length":"Tytuł powinien być krótszy niż 256", - "description":"Opis", - "details":"Szczegóły", - "events":"Wydarzenia", - "copyId":"Kopiuj ID klienta", - "idCopiedMessage":"ID klienta zostało skopiowane do schowka", - "select-customer":"Wybierz klienta", - "no-customers-matching":"Nie znaleziono klientów pasujących do '{{entity}}'.", - "customer-required":"Klient jest wymagany", - "select-default-customer":"Wybierz domyślnego klienta", - "default-customer":"Domyślny klient", - "default-customer-required":"Domyślny klient jest wymagany do debugowania pulpitu nawigacyjnego na poziomie dzierżawcy", - "search":"Szukaj klientów", - "selected-customers":"{ count, plural, =1 {1 klient} other {# klientów} } wybrano", - "edges":"Instancje krawędzi klienta", - "manage-edges":"Zarządzaj krawędziami" + "content-type": { + "json": "Json", + "text": "Tekst", + "binary": "Binarny (Base64)" }, - "date":{ - "last-update-n-ago":"Ostatnia aktualizacja N temu", - "last-update-n-ago-text":"Ostatnia aktualizacja {{ agoText }}", - "custom-date":"Niestandardowa data", - "format":"Format", - "preview":"Podgląd" + "color": { + "color": "Color", + "color-picker": "Narzędzie do wybierania kolorów", + "primary-colors": "Kolory podstawowe", + "accent-colors": "Kolory akcentujące", + "no-color-selected": "Nie wybrano koloru" }, - "datetime":{ - "date-from":"Data od", - "time-from":"Czas od", - "date-to":"Data do", - "time-to":"Czas do" + "customer": { + "all": "Wszystko", + "all-customers": "Wszyscy klienci", + "groups": "Grupy", + "shared": "Wspólny", + "hierarchy": "Hierarchia", + "customer": "Klient", + "customers": "Klienci", + "management": "Zarządzanie klientami", + "dashboard": "Panel Klienta", + "dashboards": "Panele klientów", + "devices": "Urządzenia Klienta", + "entity-views": "Widoki obiektów klienta", + "assets": "Zasoby Klienta", + "public-dashboards": "Panele publiczne", + "public-devices": "Urządzenia publiczne", + "public-assets": "Zasoby publiczne", + "public-entity-views": "Publiczne widoki obiektów", + "add": "Dodaj klienta", + "delete": "Usuń klienta", + "manage-customer-user-groups": "Zarządzaj grupami użytkowników klientów", + "manage-customer-groups": "Zarządzaj grupami klientów", + "manage-customer-device-groups": "Zarządzaj grupami urządzeń klientów", + "manage-customer-asset-groups": "Zarządzaj grupami zasobów klientów", + "manage-customer-entity-view-groups": "Zarządzaj grupami widoków encji klienta", + "manage-customer-edge-groups": "Zarządzaj grupami Edge klientów", + "manage-customer-dashboard-groups": "Zarządzaj grupami paneli klientów", + "manage-customer-users": "Zarządzaj użytkownikami klientów", + "manage-customers": "Zarządzaj klientami", + "manage-customer-devices": "Zarządzaj urządzeniami klientów", + "manage-customer-entity-views": "Zarządzaj widokami encji klienta", + "manage-customer-dashboards": "Zarządzaj panelami klientów", + "manage-public-devices": "Zarządzaj urządzeniami publicznymi", + "manage-public-dashboards": "Zarządzaj panelami publicznymi", + "manage-customer-assets": "Zarządzaj zasobami klientów", + "manage-customer-edges": "Zarządzaj Edge klientów", + "manage-public-assets": "Zarządzaj zasobami publicznymi", + "add-customer-text": "Dodaj nowego klienta", + "no-customers-text": "Nie znaleziono żadnych klientów", + "customer-details": "Szczegóły klienta", + "delete-customer-title": "Czy na pewno chcesz usunąć klienta '{{customerTitle}}'?", + "delete-customer-text": "Bądź ostrożny, po potwierdzeniu klienta i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-customers-title": "Czy na pewno chcesz usunąć {count, plural, =1 {1 klienta} other {# klientów} }?", + "delete-customers-action-title": "Usuń {count, plural, =1 {1 klienta} other {# klientów} }", + "delete-customers-text": "Bądź ostrożny, po potwierdzeniu wszyscy wybrani klienci zostaną usunięci, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "manage-user-groups": "Zarządzaj grupami użytkowników", + "manage-asset-groups": "Zarządzaj grupami zasobów", + "manage-device-groups": "Zarządzaj grupami urządzeń", + "manage-dashboard-groups": "Zarządzaj grupami paneli", + "manage-entity-view-groups": "Zarządzaj grupami widoków encji", + "manage-edge-groups": "Zarządzaj grupami Edge", + "manage-users": "Zarządzaj użytkownikami", + "manage-assets": "Zarządzaj zasobami", + "manage-devices": "Zarządzaj urządzeniami", + "manage-dashboards": "Zarządzaj panelami", + "manage-entity-views": "Zarządzaj widokami encji", + "title": "Tytuł", + "title-required": "Tytuł jest wymagany.", + "title-max-length": "Tytuł powinien być mniejszy niż 256", + "description": "Opis", + "details": "Szczegóły", + "events": "Wydarzenia", + "copyId": "Skopiuj identyfikator klienta", + "idCopiedMessage": "Identyfikator klienta został skopiowany do schowka", + "select-customer": "Wybierz klienta", + "no-customers-matching": "Brak klientów pasujących do '{{entity}}' zostały znalezione.", + "customer-required": "Klient jest wymagany", + "select-group-to-add": "Wybierz grupę docelową, aby dodać wybranych klientów", + "select-group-to-move": "Wybierz grupę docelową, aby przenieść wybranych klientów", + "remove-customers-from-group": "Czy na pewno chcesz usunąć {count, plural, =1 {1 klienta} other {# klientów} } z grupy '{{entityGroup}}'?", + "group": "Grupa klientów", + "list-of-groups": "{count, plural, =1 {Jedna grupa klientów} other {Lista # grup klientów} }", + "group-name-starts-with": "Grupy klientów, których nazwy zaczynają się od '{{prefix}}'", + "select-default-customer": "Wybierz domyślnego klienta", + "default-customer": "Domyślny klient", + "default-customer-required": "Do debugowania panelu na poziomie dzierżawy wymagany jest domyślny klient", + "allow-white-labeling": "Zezwalaj na white labeling", + "search": "Szukaj klientów", + "selected-customers": "Wybrano {count, plural, =1 {1 klienta} other {# klientów} }", + "edges": "Obiekty Edge klienta", + "manage-edges": "Zarządzaj Edge" }, - "dashboard":{ - "dashboard":"Panel", - "dashboards":"Panele", - "management":"Zarządzanie panelami", - "view-dashboards":"Przeglądaj panele", - "add":"Dodaj panel", - "assign-dashboard-to-customer":"Przypisz panel(y) do klienta", - "assign-dashboard-to-customer-text":"Wybierz panele do przypisania do klienta", - "assign-dashboard-to-edge-title":"Przypisz panel(y) do urządzenia", - "assign-to-customer-text":"Wybierz klienta, do którego przypisane będą panele", - "assign-to-customer":"Przypisz klientowi", - "unassign-from-customer":"Odłącz od klienta", - "make-public":"Udostępnij panel publicznie", - "make-private":"Ustaw panel jako prywatny", - "manage-assigned-customers":"Zarządzaj przypisanymi klientami", - "assigned-customers":"Przypisani klienci", - "assign-to-customers":"Przypisz panele klientom", - "assign-to-customers-text":"Wybierz klientów, do których przypisane będą panele", - "unassign-from-customers":"Odłącz panele od klientów", - "unassign-from-customers-text":"Wybierz klientów, od których odłączone zostaną panele", - "no-dashboards-text":"Nie znaleziono paneli", - "no-widgets":"Brak skonfigurowanych widżetów", - "add-widget":"Dodaj nowy widżet", - "add-widget-button-text":"Dodaj widżet", - "title":"Tytuł", - "image":"Obraz panelu", - "mobile-app-settings":"Ustawienia aplikacji mobilnej", - "mobile-order":"Kolejność panelu w aplikacji mobilnej", - "mobile-hide":"Ukryj panel w aplikacji mobilnej", - "update-image":"Aktualizuj obraz panelu", - "take-screenshot":"Zrób zrzut ekranu", - "select-widget-title":"Wybierz widżet", - "select-widget-value":"{{title}}: wybierz widżet", - "select-widget-subtitle":"Lista dostępnych typów widżetów", - "delete":"Usuń panel", - "title-required":"Tytuł jest wymagany.", - "title-max-length":"Tytuł powinien mieć mniej niż 256 znaków", - "description":"Opis", - "details":"Szczegóły", - "dashboard-details":"Szczegóły panelu", - "add-dashboard-text":"Dodaj nowy panel", - "assign-dashboards":"Przypisz panele", - "assign-new-dashboard":"Przypisz nowy panel", - "assign-dashboards-text":"Przypisz { count, plural, =1 {1 panel} other {# panele} } do klientów", - "unassign-dashboards-action-text":"Odłącz { count, plural, =1 {1 panel} other {# panele} } od klientów", - "delete-dashboards":"Usuń panele", - "unassign-dashboards":"Odłącz panele", - "unassign-dashboards-action-title":"Odłącz { count, plural, =1 {1 panel} other {# panele} } od klienta", - "delete-dashboard-title":"Czy na pewno chcesz usunąć panel '{{dashboardTitle}}'?", - "delete-dashboard-text":"Bądź ostrożny, po potwierdzeniu panel i wszystkie związane z nim dane staną się nieodwracalnie utracone.", - "delete-dashboards-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 panel} other {# panele} }?", - "delete-dashboards-action-title":"Usuń { count, plural, =1 {1 panel} other {# panele} }", - "delete-dashboards-text":"Bądź ostrożny, po potwierdzeniu wszystkie wybrane panele zostaną usunięte, a wszystkie związane z nimi dane staną się nieodwracalnie utracone.", - "unassign-dashboard-title":"Czy na pewno chcesz odłączyć panel '{{dashboardTitle}}'?", - "unassign-dashboard-text":"Po potwierdzeniu panel zostanie odłączony i nie będzie dostępny dla klienta.", - "unassign-dashboard":"Odłącz panel", - "unassign-dashboards-title":"Czy na pewno chcesz odłączyć { count, plural, =1 {1 panel} other {# panele} }?", - "unassign-dashboards-text":"Po potwierdzeniu wszystkie wybrane panele zostaną odłączone i nie będą dostępne dla klienta.", - "public-dashboard-title":"Panel jest teraz publiczny", - "public-dashboard-text":"Twój panel {{dashboardTitle}} jest teraz publiczny i dostępny za pomocą następującego publicznego linku:", - "public-dashboard-notice":"Uwaga: Nie zapomnij udostępnić powiązanych urządzeń publicznie, aby uzyskać do nich dostęp.", - "make-private-dashboard-title":"Czy na pewno chcesz uczynić panel '{{dashboardTitle}}' prywatnym?", - "make-private-dashboard-text":"Po potwierdzeniu panel zostanie uczyniony prywatnym i nie będzie dostępny dla innych.", - "make-private-dashboard":"Ustaw panel jako prywatny", - "socialshare-text":"'{{dashboardTitle}}' powered by ThingsBoard", - "socialshare-title":"'{{dashboardTitle}}' powered by ThingsBoard", - "select-dashboard":"Wybierz panel", - "no-dashboards-matching":"Nie znaleziono paneli pasujących do '{{entity}}'", - "dashboard-required":"Panel jest wymagany.", - "select-existing":"Wybierz istniejący panel", - "create-new":"Utwórz nowy panel", - "new-dashboard-title":"Tytuł nowego panelu", - "open-dashboard":"Otwórz panel", - "set-background":"Ustaw tło", - "background-color":"Kolor tła", - "background-image":"Obraz tła", - "background-size-mode":"Tryb rozmiaru tła", - "no-image":"Brak wybranego obrazu", - "empty-image":"Brak obrazu", - "drop-image":"Upuść obraz lub kliknij, aby wybrać plik do przesłania.", - "maximum-upload-file-size":"Maksymalny rozmiar pliku do przesłania: {{ size }}", - "cannot-upload-file":"Nie można przesłać pliku", - "settings":"Ustawienia", - "layout-settings":"Ustawienia układu", - "columns-count":"Liczba kolumn", - "columns-count-required":"Liczba kolumn jest wymagana.", - "min-columns-count-message":"Dozwolona jest tylko minimalna liczba kolumn wynosząca 10.", - "max-columns-count-message":"Dozwolona jest tylko maksymalna liczba kolumn wynosząca 1000.", - "widgets-margins":"Margines między widżetami", - "margin-required":"Wartość marginesu jest wymagana.", - "min-margin-message":"Dozwolona jest tylko wartość minimalna marginesu wynosząca 0.", - "max-margin-message":"Dozwolona jest tylko wartość maksymalna marginesu wynosząca 50.", - "horizontal-margin":"Margines poziomy", - "horizontal-margin-required":"Wartość marginesu poziomego jest wymagana.", - "min-horizontal-margin-message":"Dozwolona jest tylko wartość minimalna marginesu poziomego wynosząca 0.", - "max-horizontal-margin-message":"Dozwolona jest tylko wartość maksymalna marginesu poziomego wynosząca 50.", - "vertical-margin":"Margines pionowy", - "vertical-margin-required":"Wartość marginesu pionowego jest wymagana.", - "min-vertical-margin-message":"Dozwolona jest tylko wartość minimalna marginesu pionowego wynosząca 0.", - "max-vertical-margin-message":"Dozwolona jest tylko wartość maksymalna marginesu pionowego wynosząca 50.", - "apply-outer-margin":"Zastosuj margines do boków układu", - "autofill-height":"Automatycznie wypełnij wysokość układu", - "mobile-layout":"Ustawienia układu na urządzenia mobilne", - "mobile-row-height":"Wysokość rzędu na urządzenia mobilne, px", - "mobile-row-height-required":"Wartość wysokości rzędu na urządzenia mobilne jest wymagana.", - "min-mobile-row-height-message":"Dozwolona jest tylko minimalna wartość wysokości rzędu na urządzenia mobilne wynosząca 5 pikseli.", - "max-mobile-row-height-message":"Dozwolona jest tylko maksymalna wartość wysokości rzędu na urządzenia mobilne wynosząca 200 pikseli.", - "title-settings":"Ustawienia tytułu", - "display-title":"Wyświetl tytuł panelu", - "title-color":"Kolor tytułu", - "toolbar-settings":"Ustawienia paska narzędziowego", - "hide-toolbar":"Ukryj pasek narzędziowy", - "toolbar-always-open":"Zawsze otwarty pasek narzędziowy", - "display-dashboards-selection":"Wyświetl wybór paneli", - "display-entities-selection":"Wyświetl wybór jednostek", - "display-filters":"Wyświetl filtry", - "display-dashboard-timewindow":"Wyświetl okno czasowe panelu", - "display-dashboard-export":"Wyświetl eksport panelu", - "display-update-dashboard-image":"Wyświetl aktualizację obrazu panelu", - "dashboard-logo-settings":"Ustawienia logo panelu", - "display-dashboard-logo":"Wyświetl logo w trybie pełnoekranowym panelu", - "dashboard-logo-image":"Obraz logo panelu", - "advanced-settings":"Zaawansowane ustawienia", - "dashboard-css":"CSS panelu", - "import":"Importuj panel", - "export":"Eksportuj panel", - "export-failed-error":"Nie można wyeksportować panelu: {{error}}", - "create-new-dashboard":"Utwórz nowy panel", - "dashboard-file":"Plik panelu", - "invalid-dashboard-file-error":"Nie można zaimportować panelu: Nieprawidłowa struktura danych panelu.", - "dashboard-import-missing-aliases-title":"Skonfiguruj aliasy używane przez importowany panel", - "create-new-widget":"Utwórz nowy widżet", - "import-widget":"Importuj widżet", - "widget-file":"Plik widżetu", - "invalid-widget-file-error":"Nie można zaimportować widżetu: Nieprawidłowa struktura danych widżetu.", - "widget-import-missing-aliases-title":"Skonfiguruj aliasy używane przez importowany widżet", - "open-toolbar":"Otwórz pasek narzędziowy panelu", - "close-toolbar":"Zamknij pasek narzędziowy panelu", - "configuration-error":"Błąd konfiguracji", - "alias-resolution-error-title":"Błąd konfiguracji aliasów panelu", - "invalid-aliases-config":"Nie można znaleźć żadnych urządzeń pasujących do niektórych filtrów aliasów.
Skontaktuj się z administratorem w celu rozwiązania tego problemu.", - "select-devices":"Wybierz urządzenia", - "assignedToCustomer":"Przypisane do klienta", - "assignedToCustomers":"Przypisane do klientów", - "public":"Publiczne", - "copyId":"Skopiuj identyfikator panelu", - "idCopiedMessage":"Identyfikator panelu został skopiowany do schowka", - "public-link":"Publiczny link", - "copy-public-link":"Skopiuj publiczny link", - "public-link-copied-message":"Publiczny link do panelu został skopiowany do schowka", - "manage-states":"Zarządzaj stanami panelu", - "states":"Stany panelu", - "states-short":"Stany", - "search-states":"Szukaj stanów panelu", - "selected-states":"{ count, plural, =1 {1 stan panelu} other {# stany panelu} } wybranych", - "edit-state":"Edytuj stan panelu", - "delete-state":"Usuń stan panelu", - "add-state":"Dodaj stan panelu", - "no-states-text":"Nie znaleziono stanów", - "state":"Stan panelu", - "state-name":"Nazwa", - "state-name-required":"Wymagana jest nazwa stanu panelu.", - "state-id":"Identyfikator stanu", - "state-id-required":"Wymagane jest Identyfikator stanu panelu.", - "state-id-exists":"Stan panelu o tym samym identyfikatorze już istnieje.", - "is-root-state":"Główny stan", - "delete-state-title":"Usuń stan panelu", - "delete-state-text":"Czy na pewno chcesz usunąć stan panelu o nazwie '{{stateName}}'?", - "show-details":"Pokaż szczegóły", - "hide-details":"Ukryj szczegóły", - "select-state":"Wybierz docelowy stan", - "state-controller":"Kontroler stanu", - "state-controller-default":"statyczny (przestarzały)", - "search":"Szukaj paneli", - "selected-dashboards":"{ count, plural, =1 {1 panel} other {# panele} } wybranych", - "home-dashboard":"Panel główny", - "home-dashboard-hide-toolbar":"Ukryj pasek narzędzi panelu głównego", - "unassign-dashboard-from-edge-text":"Po potwierdzeniu panel zostanie odłączony i nie będzie dostępny dla krawędzi.", - "unassign-dashboards-from-edge-title":"Czy na pewno chcesz odłączyć { count, plural, =1 {1 panel} other {# panele} }?", - "unassign-dashboards-from-edge-text":"Po potwierdzeniu wszystkie wybrane panele zostaną odłączone i nie będą dostępne dla krawędzi.", - "assign-dashboard-to-edge":"Przypisz panele do krawędzi", - "assign-dashboard-to-edge-text":"Proszę wybrać panele do przypisania do krawędzi", - "non-existent-dashboard-state-error":"Stan panelu o identyfikatorze \"{{ stateId }}\" nie istnieje", - "edit-mode":"Tryb edycji", - "duplicate-state-action":"Zduplikuj stan" + "customers-hierarchy": { + "customers-hierarchy": "Hierarchia klientów", + "open-nav-tree": "Otwórz drzewo nawigacji", + "return-to-top-level": "Wróć na najwyższy poziom" }, - "datakey":{ - "settings":"Ustawienia", - "general":"Ogólne", - "advanced":"Zaawansowane", - "key":"Klucz", - "label":"Etykieta", - "color":"Kolor", - "units":"Symbol specjalny do wyświetlenia obok wartości", - "decimals":"Liczba cyfr po przecinku", - "data-generation-func":"Funkcja generacji danych", - "use-data-post-processing-func":"Użyj funkcji przetwarzania danych po generacji", - "configuration":"Konfiguracja klucza danych", - "timeseries":"Szereg czasowy", - "attributes":"Atrybuty", - "entity-field":"Pole encji", - "alarm":"Pola alarmowe", - "timeseries-required":"Wymagane są serie czasowe encji.", - "timeseries-or-attributes-required":"Wymagane są serie czasowe/cechy encji.", - "alarm-fields-timeseries-or-attributes-required":"Wymagane są pola alarmowe lub serie czasowe/cechy encji.", - "maximum-timeseries-or-attributes":"Maksymalnie { count, plural, =1 {1 seria czasowa/cecha jest dozwolona.} other {# serie czasowe/cechy są dozwolone} }", - "alarm-fields-required":"Wymagane są pola alarmowe.", - "function-types":"Typy funkcji", - "function-type":"Typ funkcji", - "function-types-required":"Wymagane są typy funkcji.", - "data-keys":"Klucze danych", - "data-key":"Klucz danych", - "data-keys-required":"Wymagane są klucze danych.", - "data-key-required":"Wymagany jest klucz danych.", - "alarm-keys":"Klucze danych alarmowych", - "alarm-key":"Klucz danych alarmowych", - "alarm-key-functions":"Funkcje klucza alarmowego", - "alarm-key-function":"Funkcja klucza alarmowego", - "latest-keys":"Ostatnie klucze danych", - "latest-key":"Ostatni klucz danych", - "latest-key-functions":"Funkcje ostatniego klucza", - "latest-key-function":"Funkcja ostatniego klucza", - "timeseries-keys":"Klucze danych szeregów czasowych", - "timeseries-key":"Klucz danych szeregów czasowych", - "timeseries-key-functions":"Funkcje klucza szeregów czasowych", - "timeseries-key-function":"Funkcja klucza szeregów czasowych", - "maximum-function-types":"Maksymalnie { count, plural, =1 {1 typ funkcji jest dozwolony.} other {# typy funkcji są dozwolone} }", - "time-description":"znacznik czasu bieżącej wartości;", - "value-description":"bieżąca wartość;", - "prev-value-description":"wynik poprzedniego wywołania funkcji;", - "time-prev-description":"znacznik czasu poprzedniej wartości;", - "prev-orig-value-description":"oryginalna poprzednia wartość;", - "aggregation":"Agregacja", - "aggregation-type-hint-common":"Ze względów wydajnościowych obliczenia wartości agregowanej są dostępne tylko dla stałych interwałów czasowych, takich jak \"bieżący dzień\", \"bieżący miesiąc\", itp., i nie są dostępne dla interwałów przesuwnych, takich jak 'ostatnie 30 minut' lub 'ostatnie 24 godziny'.", - "aggregation-type-none-hint":"Weź ostatnią wartość.", - "aggregation-type-min-hint":"Znajdź minimalną wartość między punktami danych w wybranym oknie czasowym.", - "aggregation-type-max-hint":"Znajdź maksymalną wartość między punktami danych w wybranym oknie czasowym.", - "aggregation-type-avg-hint":"Oblicz średnią wartość między punktami danych w wybranym oknie czasowym.", - "aggregation-type-sum-hint":"Dodaj wszystkie wartości punktów danych w wybranym oknie czasowym.", - "aggregation-type-count-hint":"Całkowita liczba punktów danych w wybranym oknie czasowym.", - "delta-calculation":"Obliczenia delta", - "enable-delta-calculation":"Włącz obliczenia delta", - "enable-delta-calculation-hint":"Po włączeniu, wartość klucza danych jest obliczana na podstawie wartości agregowanych w wybranym oknie czasowym i okresie porównawczym. Ze względów wydajnościowych obliczenia delta są dostępne tylko dla okien czasowych historycznych, a nie dla wartości czasu rzeczywistego. Na przykład możesz obliczyć różnicę między zużyciem energii wczoraj a zużyciem energii przedwczoraj.", - "delta-calculation-result":"Wynik obliczeń delta", - "delta-calculation-result-previous-value":"Poprzednia wartość", - "delta-calculation-result-delta-absolute":"Delta (bezwzględna)", - "delta-calculation-result-delta-percent":"Delta (procentowa)", - "source":"Źródło", - "latest":"Najnowsze", - "latest-value":"Najnowsza wartość", - "delta":"delta", - "percent":"procent", - "absolute":"bezwzględna" + "custom-menu": { + "custom-menu": "Niestandardowe menu", + "custom-menu-hint": "Zdefiniuj poniżej JSON niestandardowego menu. Ten JSON zawiera listę elementów niestandardowego menu." }, - "datasource":{ - "type":"Typ źródła danych", - "name":"Nazwa", - "label":"Etykieta", - "add-datasource-prompt":"Proszę dodać źródło danych" + "custom-translation": { + "custom-translation": "Tłumaczenie niestandardowe", + "translation-map": "Mapa tłumaczeń", + "key": "Klucz do tłumaczenia", + "import": "Importuj tłumaczenie", + "export": "Eksportuj tłumaczenie", + "export-data": "Eksportuj dane tłumaczeń", + "import-data": "Importuj dane tłumaczeń", + "translation-file": "Plik tłumaczeniowy", + "invalid-translation-file-error": "Nie można zaimportować pliku tłumaczenia: Nieprawidłowa struktura danych tłumaczenia.", + "custom-translation-hint": "Zdefiniuj poniżej tłumaczenie niestandardowe JSON. ", + "download-locale-file": "Pobierz plik ustawień regionalnych" }, - "details":{ - "details":"Szczegóły", - "edit-mode":"Tryb edycji", - "edit-json":"Edytuj JSON", - "toggle-edit-mode":"Przełącz tryb edycji" + "date": { + "last-update-n-ago": "Last update N ago", + "last-update-n-ago-text": "Last update {{ agoText }}", + "custom-date": "Custom date", + "format": "Format", + "preview": "Preview" }, - "device":{ - "device":"Urządzenie", - "device-required":"Urządzenie jest wymagane.", - "devices":"Urządzenia", - "management":"Zarządzanie urządzeniem", - "view-devices":"Zobacz urządzenia", - "device-alias":"Alias urządzenia", - "device-type-max-length":"Typ urządzenia powinien mieć mniej niż 256 znaków", - "aliases":"Aliasy urządzeń", - "no-alias-matching":"'{{alias}}' nie znaleziono.", - "no-aliases-found":"Nie znaleziono aliasów.", - "no-key-matching":"'{{key}}' nie znaleziono.", - "no-keys-found":"Nie znaleziono kluczy.", - "create-new-alias":"Utwórz nowy!", - "create-new-key":"Utwórz nowy!", - "duplicate-alias-error":"Znaleziono duplikat aliasu '{{alias}}'.
Aliasy urządzeń muszą być unikalne w ramach panelu.", - "configure-alias":"Konfiguruj alias '{{alias}}'", - "no-devices-matching":"Nie znaleziono urządzeń pasujących do '{{entity}}'.", - "alias":"Alias", - "alias-required":"Alias urządzenia jest wymagany.", - "remove-alias":"Usuń alias urządzenia", - "add-alias":"Dodaj alias urządzenia", - "name-starts-with":"Wyrażenie nazwy urządzenia", - "help-text":"Użyj '%' według potrzeb: '%device_name_contains%', '%device_name_ends%', 'device_starts_with'.", - "device-list":"Lista urządzeń", - "use-device-name-filter":"Użyj filtra", - "device-list-empty":"Brak wybranych urządzeń.", - "device-name-filter-required":"Filtr nazwy urządzenia jest wymagany.", - "device-name-filter-no-device-matched":"Nie znaleziono urządzeń rozpoczynających się od '{{device}}'.", - "add":"Dodaj urządzenie", - "assign-to-customer":"Przypisz do klienta", - "assign-device-to-customer":"Przypisz urządzenia do klienta", - "assign-device-to-customer-text":"Proszę wybrać urządzenia do przypisania do klienta", - "assign-device-to-edge-title":"Przypisz urządzenia do krawędzi", - "assign-device-to-edge-text":"Proszę wybrać urządzenia do przypisania do krawędzi", - "make-public":"Udostępnij publicznie", - "make-private":"Udostępnij prywatnie", - "no-devices-text":"Nie znaleziono urządzeń", - "assign-to-customer-text":"Proszę wybrać klienta, do którego przypisane będą urządzenia", - "device-details":"Szczegóły urządzenia", - "add-device-text":"Dodaj nowe urządzenie", - "credentials":"Poświadczenia", - "manage-credentials":"Zarządzaj poświadczeniami", - "delete":"Usuń urządzenie", - "assign-devices":"Przypisz urządzenia", - "assign-devices-text":"Przypisz { count, plural, =1 {1 urządzenie} other {# urządzeń} } do klienta", - "delete-devices":"Usuń urządzenia", - "unassign-from-customer":"Odłącz od klienta", - "unassign-devices":"Odłącz urządzenia", - "unassign-devices-action-title":"Odłącz { count, plural, =1 {1 urządzenie} other {# urządzeń} } od klienta", - "unassign-device-from-edge-title":"Czy na pewno chcesz odłączyć urządzenie '{{deviceName}}'?", - "unassign-device-from-edge-text":"Po potwierdzeniu urządzenie zostanie odłączone i nie będzie dostępne przez krawędź.", - "unassign-devices-from-edge":"Odłącz urządzenia od krawędzi", - "assign-new-device":"Przypisz nowe urządzenie", - "make-public-device-title":"Czy na pewno chcesz udostępnić publicznie urządzenie '{{deviceName}}'?", - "make-public-device-text":"Po potwierdzeniu urządzenie i wszystkie jego dane będą dostępne publicznie dla innych.", - "make-private-device-title":"Czy na pewno chcesz udostępnić prywatnie urządzenie '{{deviceName}}'?", - "make-private-device-text":"Po potwierdzeniu urządzenie i wszystkie jego dane będą dostępne prywatnie i nie będą dostępne dla innych.", - "view-credentials":"Zobacz poświadczenia", - "delete-device-title":"Czy na pewno chcesz usunąć urządzenie '{{deviceName}}'?", - "delete-device-text":"Bądź ostrożny, po potwierdzeniu urządzenie i wszystkie powiązane dane staną się nieodwracalnie utracone.", - "delete-devices-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 urządzenie} other {# urządzeń} }?", - "delete-devices-action-title":"Usuń { count, plural, =1 {1 urządzenie} other {# urządzeń} }", - "delete-devices-text":"Bądź ostrożny, po potwierdzeniu wszystkie wybrane urządzenia zostaną usunięte, a wszystkie powiązane dane staną się nieodwracalnie utracone.", - "unassign-device-title":"Czy na pewno chcesz odłączyć urządzenie '{{deviceName}}'?", - "unassign-device-text":"Po potwierdzeniu urządzenie zostanie odłączone i nie będzie dostępne przez klienta.", - "unassign-device":"Odłącz urządzenie", - "unassign-devices-title":"Czy na pewno chcesz odłączyć { count, plural, =1 {1 urządzenie} other {# urządzeń} }?", - "unassign-devices-text":"Po potwierdzeniu wszystkie wybrane urządzenia zostaną odłączone i nie będą dostępne przez klienta.", - "device-credentials":"Poświadczenia urządzenia", - "loading-device-credentials":"Ładowanie poświadczeń urządzenia...", - "credentials-type":"Typ poświadczeń", - "access-token":"Token dostępu", - "access-token-required":"Token dostępu jest wymagany.", - "access-token-invalid":"Długość tokenu dostępu musi wynosić od 1 do 32 znaków.", - "certificate-pem-format":"Certyfikat w formacie PEM", - "certificate-pem-format-required":"Certyfikat jest wymagany.", - "copy-access-token":"Skopiuj token dostępu", - "copy-certificate":"Skopiuj certyfikat", - "copy-client-id":"Skopiuj identyfikator klienta", - "copy-user-name":"Skopiuj nazwę użytkownika", - "copy-password":"Skopiuj hasło", - "generate-client-id":"Generuj identyfikator klienta", - "generate-user-name":"Generuj nazwę użytkownika", - "generate-password":"Generuj hasło", - "generate-access-token":"Generuj token dostępu", - "lwm2m-security-config":{ - "identity":"Identyfikator klienta", - "identity-required":"Identyfikator klienta jest wymagany.", - "identity-tooltip":"Identyfikator PSK to dowolny identyfikator PSK o długości do 128 bajtów, zgodny z opisem w standardzie [RFC7925].\nIdentyfikator PSK MUSI być najpierw przekształcony w ciąg znaków, a następnie zakodowany na bajty przy użyciu UTF-8.", - "client-key":"Klucz klienta", - "client-key-required":"Klucz klienta jest wymagany.", - "client-key-tooltip-prk":"Klucz publiczny RPK lub identyfikator muszą być zgodne ze standardem [RFC7250] i zakodowane w formacie Base64!", - "client-key-tooltip-psk":"Klucz PSK musi być zgodny ze standardem [RFC4279] i formatem HexDec: 32, 64, 128 znaków!", - "endpoint":"Nazwa klienta Endpoint", - "endpoint-required":"Nazwa klienta Endpoint jest wymagana.", - "client-public-key":"Klucz publiczny klienta", - "client-public-key-hint":"Jeśli klucz publiczny klienta jest pusty, używane będzie zaufane certyfikat", - "client-public-key-tooltip":"Klucz publiczny X509 musi być w formacie zakodowanym DER X509v3 i obsługiwać wyłącznie algorytm EC, a następnie zakodowany w formacie Base64!", - "mode":"Tryb konfiguracji zabezpieczeń", - "client-tab":"Konfiguracja zabezpieczeń klienta", - "client-certificate":"Certyfikat klienta", - "bootstrap-tab":"Klient rozruchowy", - "bootstrap-server":"Serwer rozruchowy", - "lwm2m-server":"Serwer LwM2M", - "client-publicKey-or-id":"Klucz publiczny klienta lub Identyfikator", - "client-publicKey-or-id-required":"Klucz publiczny klienta lub Identyfikator są wymagane.", - "client-publicKey-or-id-tooltip-psk":"Identyfikator PSK to dowolny identyfikator PSK o długości do 128 bajtów, zgodny z opisem w standardzie [RFC7925].\nIdentyfikator PSK MUSI być najpierw przekształcony w ciąg znaków, a następnie zakodowany na bajty przy użyciu UTF-8.", - "client-publicKey-or-id-tooltip-rpk":"Klucz publiczny RPK lub identyfikator muszą być zgodne ze standardem [RFC7250] i zakodowane w formacie Base64!", - "client-publicKey-or-id-tooltip-x509":"Klucz publiczny X509 musi być w formacie zakodowanym DER X509v3 i obsługiwać wyłącznie algorytm EC, a następnie zakodowany w formacie Base64!", - "client-secret-key":"Tajny klucz klienta", - "client-secret-key-required":"Tajny klucz klienta jest wymagany.", - "client-secret-key-tooltip-psk":"Klucz PSK musi być zgodny ze standardem [RFC4279] i formatem HexDec: 32, 64, 128 znaków!", - "client-secret-key-tooltip-prk":"Tajny klucz RPK musi być w formacie PKCS_8 (kodowanie DER, standard [RFC5958]) i zakodowany w formacie Base64!", - "client-secret-key-tooltip-x509":"Tajny klucz X509 musi być w formacie PKCS_8 (kodowanie DER, standard [RFC5958]) i zakodowany w formacie Base64!" + "datetime": { + "date-from": "Data od", + "time-from": "Czas od", + "date-to": "Data do", + "time-to": "Czas na" + }, + "dashboard": { + "all": "Wszystko", + "all-dashboards": "Wszystkie panele", + "groups": "Grupy", + "shared": "Wspólny", + "dashboard": "Panel", + "dashboards": "Panele", + "management": "Zarządzanie panelem", + "view-dashboards": "Wyświetl panele", + "add": "Dodaj panel", + "assign-dashboard-to-customer": "Przypisz panel(e) do klienta", + "assign-dashboard-to-customer-text": "Proszę wybrać panele, które chcesz przypisać do klienta", + "assign-to-customer-text": "Wybierz klienta, któremu chcesz przypisać panel(e)", + "assign-to-customer": "Przypisz do klienta", + "unassign-from-customer": "Usuń przypisanie od klienta", + "make-public": "Ustaw panel jako publiczny", + "make-private": "Ustaw panel jako prywatny", + "manage-assigned-customers": "Zarządzaj przydzielonymi klientami", + "assigned-customers": "Przydzieleni klienci", + "assign-to-customers": "Przypisz panele klientom", + "assign-to-customers-text": "Wybierz klientów, którym chcesz przypisać panele", + "unassign-from-customers": "Usuń przypisanie paneli od klientów", + "unassign-from-customers-text": "Wybierz klientów, których przypisanie chcesz usunąć z paneli", + "no-dashboards-text": "Nie znaleziono paneli", + "no-widgets": "Nie skonfigurowano żadnych widżetów", + "add-widget": "Dodaj nowy widżet", + "add-widget-button-text": "Add widget", + "title": "Tytuł", + "image": "Obraz panelu", + "mobile-app-settings": "Ustawienia aplikacji mobilnej", + "mobile-order": "Kolejność panelu w aplikacji mobilnej", + "mobile-hide": "Ukryj panel w aplikacji mobilnej", + "update-image": "Zaktualizuj obraz panelu", + "take-screenshot": "Zrobić zrzut ekranu", + "select-widget-title": "Wybierz widżet", + "select-widget-value": "{{title}}: wybierz widżet", + "select-widget-subtitle": "Lista dostępnych typów widgetów", + "delete": "Usuń panel", + "title-required": "Tytuł jest wymagany.", + "title-max-length": "Tytuł powinien być mniejszy niż 256", + "description": "Opis", + "details": "Szczegóły", + "dashboard-details": "Szczegóły panelu", + "add-dashboard-text": "Dodaj nowy panel", + "assign-dashboards": "Przypisz panele", + "assign-new-dashboard": "Przypisz nowy panel", + "assign-dashboards-text": "Przypisz {count, plural, =1 {1 panel} other {# panelów} } do klientów.", + "unassign-dashboards-action-text": "Anuluj przypisanie {count, plural, =1 {1 panelu} other {# paneli} } do klientów.", + "delete-dashboards": "Usuń panele", + "unassign-dashboards": "Usuń przypisanie paneli", + "unassign-dashboards-action-title": "Anuluj przypisanie {count, plural, =1 {1 panelu} other {# paneli} } do klientów.", + "delete-dashboard-title": "Czy na pewno chcesz usunąć panel '{{dashboardTitle}}'?", + "delete-dashboard-text": "Bądź ostrożny, po potwierdzeniu panelu i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-dashboards-title": "Czy na pewno chcesz usunąć {count, plural, =1 {1 panel} other {# paneli} }?", + "delete-dashboards-action-title": "Usuń {count, plural, =1 {1 panel} other {# paneli} }", + "delete-dashboards-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane panele zostaną usunięte, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "unassign-dashboard-title": "Czy na pewno chcesz usunąć przypisanie panelu '{{dashboardTitle}}'?", + "unassign-dashboard-text": "Po potwierdzeniu przypisanie panelu zostanie usunięte i nie będzie dostępne dla klienta.", + "unassign-dashboard": "Anuluj przypisanie panelu", + "unassign-dashboards-title": "Czy na pewno chcesz cofnąć przypisanie {count, plural, =1 {1 panelu} other {# paneli} }?", + "unassign-dashboards-text": "Po potwierdzeniu wszystkie wybrane panele zostaną usunięte i nie będą dostępne dla klienta.", + "public-dashboard-title": "Panel jest teraz publiczny", + "public-dashboard-text": "Twój panel {{dashboardTitle}} jest teraz publiczny i dostępny poprzez następny publiczny link:", + "public-dashboard-notice": "Notatka: Nie zapomnij o upublicznieniu powiązanych urządzeń, aby uzyskać dostęp do ich danych.", + "public-dashboard-link": "Link do publicznego panelu", + "public-dashboard-link-text": "Twój publiczny panel {{dashboardTitle}} jest dostępny poprzez next public połączyć:", + "public-dashboard-link-notice": "Notatka: Nie zapomnij o upublicznieniu powiązanych urządzeń, zasobów i widoków obiektów, aby uzyskać dostęp do ich danych.", + "make-private-dashboard-title": "Czy na pewno chcesz uczynić panel '{{dashboardTitle}}' prywatnym?", + "make-private-dashboard-text": "Po potwierdzeniu panel stanie się prywatny i nie będzie dostępny dla innych.", + "make-private-dashboard": "Ustaw panel jako prywatny", + "socialshare-text": "'{{dashboardTitle}}' zasilany przez ThingsBoard", + "socialshare-title": "'{{dashboardTitle}}' zasilany przez ThingsBoard", + "select-dashboard": "Wybierz panel", + "no-dashboards-matching": "Nie znaleziono pasujących paneli do '{{entity}}'.", + "dashboard-required": "Panel jest wymagany.", + "select-existing": "Wybierz istniejący panel", + "create-new": "Utwórz nowy panel", + "new-dashboard-title": "Nowy tytuł panelu", + "open-dashboard": "Otwórz panel", + "set-background": "Ustaw tło", + "background-color": "Kolor tła", + "background-image": "Zdjęcie w tle", + "background-size-mode": "Tryb rozmiaru tła", + "no-image": "Nie wybrano obrazu", + "empty-image": "Brak obrazka", + "drop-image": "Upuść obraz lub kliknij, aby wybrać plik do przesłania.", + "maximum-upload-file-size": "Maksymalny rozmiar przesyłanego pliku: {{ size }}", + "cannot-upload-file": "Nie można przesłać pliku", + "settings": "Ustawienia", + "layout-settings": "Ustawienia układu", + "columns-count": "Liczba kolumn", + "columns-count-required": "Liczba kolumn jest wymagana.", + "min-columns-count-message": "Dozwolona jest tylko minimalna liczba kolumn wynosząca 10.", + "max-columns-count-message": "Dozwolona jest tylko maksymalna liczba kolumn wynosząca 1000.", + "widgets-margins": "Margines między widżetami", + "margin-required": "Wartość marginesu jest wymagana.", + "min-margin-message": "Jako minimalną wartość marginesu dozwolone jest tylko 0.", + "max-margin-message": "Jako maksymalna wartość marginesu dozwolona jest tylko 50.", + "horizontal-margin": "Margines poziomy", + "horizontal-margin-required": "Wartość marginesu poziomego jest wymagana.", + "min-horizontal-margin-message": "Dozwolona jest tylko wartość 0 jako minimalna wartość marginesu poziomego.", + "max-horizontal-margin-message": "Dozwolona jest tylko wartość 50 jako maksymalna wartość marginesu poziomego.", + "vertical-margin": "Margines pionowy", + "vertical-margin-required": "Wartość marginesu pionowego jest wymagana.", + "min-vertical-margin-message": "Dozwolone jest tylko 0 jako minimalna wartość marginesu pionowego.", + "max-vertical-margin-message": "Dozwolona jest tylko wartość 50 jako maksymalna wartość marginesu pionowego.", + "apply-outer-margin": "Zastosuj marginesy po bokach układu", + "autofill-height": "Automatyczne dopełnienie do wysokości strony", + "mobile-layout": "Ustawienia układu mobilnego", + "mobile-row-height": "Wysokość wiersza mobilnego, px", + "mobile-row-height-required": "Wartość wysokości wiersza mobilnego jest wymagana.", + "min-mobile-row-height-message": "Jako minimalna wysokość wiersza na urządzeniach mobilnych dozwolone jest tylko 5 pikseli.", + "max-mobile-row-height-message": "Maksymalna wysokość wiersza mobilnego może wynosić tylko 200 pikseli.", + "title-settings": "Ustawienia tytułu", + "display-title": "Wyświetl tytuł panelu kontrolnego", + "title-color": "Kolor tytułu", + "toolbar-settings": "Ustawienia paska narzędzi", + "hide-toolbar": "Ukryj pasek narzędzi", + "toolbar-always-open": "Pozostaw pasek narzędzi otwarty", + "display-dashboards-selection": "Wyświetl wybór paneli", + "display-entities-selection": "Wyświetl wybór obiektów", + "display-filters": "Wyświetl filtry", + "display-dashboard-timewindow": "Wyświetl okno czasowe", + "display-dashboard-export": "Eksport wyświetlacza", + "display-update-dashboard-image": "Wyświetl obraz panelu aktualizacji", + "dashboard-logo-settings": "Ustawienia logo panelu", + "display-dashboard-logo": "Wyświetlaj logo w trybie pełnoekranowym deski rozdzielczej", + "dashboard-logo-image": "Obraz logo panelu", + "advanced-settings": "Zaawansowane ustawienia", + "dashboard-css": "CSS panelu kontrolnego", + "import": "Importuj panel", + "export": "Eksportuj panel", + "export-failed-error": "Nie można wyeksportować panelu: {{error}}", + "export-pdf": "Eksportuj jako plik PDF", + "export-png": "Eksportuj jako PNG", + "export-jpg": "Eksportuj jako JPEG", + "export-json-config": "Eksportuj konfigurację JSON", + "download-dashboard-progress": "Generowanie panelu {{reportType}} ...", + "create-new-dashboard": "Utwórz nowy panel", + "dashboard-file": "Plik panelu", + "invalid-dashboard-file-error": "Nie można zaimportować panelu: Nieprawidłowa struktura danych panelu.", + "dashboard-import-missing-aliases-title": "Skonfiguruj aliasy używane przez zaimportowany panel", + "create-new-widget": "Utwórz nowy widget", + "import-widget": "Importuj widżet", + "widget-file": "Plik widgetu", + "invalid-widget-file-error": "Nie można zaimportować widżetu: Nieprawidłowa struktura danych widżetu.", + "widget-import-missing-aliases-title": "Skonfiguruj aliasy używane przez zaimportowany widget", + "open-toolbar": "Otwórz pasek narzędzi panelu", + "close-toolbar": "Zamknij pasek narzędzi", + "configuration-error": "Błąd konfiguracji", + "alias-resolution-error-title": "Błąd konfiguracji aliasów panelu", + "invalid-aliases-config": "Nie można znaleźć żadnych urządzeń pasujących do niektórych filtrów aliasów.
Aby rozwiązać ten problem, skontaktuj się z administratorem.", + "select-devices": "Wybierz urządzenia", + "assignedToCustomer": "Przypisany do klienta", + "assignedToCustomers": "Przypisane do klientów", + "public": "Publiczny", + "copyId": "Skopiuj identyfikator panelu", + "idCopiedMessage": "Identyfikator panelu został skopiowany do schowka", + "public-link": "Link publiczny", + "copy-public-link": "Skopiuj link publiczny", + "public-link-copied-message": "Link publiczny panelu został skopiowany do schowka", + "manage-states": "Zarządzaj stanami panelu", + "states": "Stany panelu", + "states-short": "States", + "search-states": "Wyszukaj stany panelu", + "selected-states": "Wybrano {count, plural, =1 {1 stan panelu} other {# stanów paneli} }", + "edit-state": "Edytuj stan panelu", + "delete-state": "Usuń stan panelu", + "add-state": "Dodaj stan panelu", + "no-states-text": "Nie znaleziono żadnych stanów", + "state": "Stan panelu", + "state-name": "Nazwa", + "state-name-required": "Nazwa stanu panelu jest wymagana.", + "state-id": "Identyfikator stanu", + "state-id-required": "Identyfikator stanu panelu jest wymagany.", + "state-id-exists": "Stan panelu o tym samym identyfikatorze już istnieje.", + "is-root-state": "Root state", + "delete-state-title": "Usuń stan panelu", + "delete-state-text": "Czy na pewno chcesz usunąć stan panelu o nazwie '{{stateName}}'?", + "show-details": "Pokaż szczegóły", + "hide-details": "Ukryj szczegóły", + "select-state": "Wybierz stan docelowy", + "state-controller": "Kontroler stanu", + "search": "Przeszukaj dashboardy", + "selected-dashboards": "Wybrano {count, plural, =1 {1 panel} other {# dashboardów} }", + "home-dashboard": "Panel główny", + "home-dashboard-hide-toolbar": "Ukryj pasek narzędzi panelu głównego", + "select-group-to-add": "Wybierz grupę docelową, aby dodać wybrane panele", + "select-group-to-move": "Wybierz grupę docelową, aby przenieść wybrane panele", + "remove-dashboards-from-group": "Czy na pewno chcesz usunąć {count, plural, =1 {1 panel} other {# paneli} } z grupy '{{entityGroup}}'?", + "group": "Grupa paneli", + "list-of-groups": "{count, plural, =1 {Jedna grupa paneli} other {Lista # grup paneli} }", + "group-name-starts-with": "Grupy paneli, których nazwy zaczynają się od '{{prefix}}'", + "unassign-dashboard-from-edge-text": "Po potwierdzeniu panel zostanie usunięty i nie będzie dostępny na urządzeniu Edge.", + "unassign-dashboards-from-edge-title": "Czy na pewno chcesz cofnąć przypisanie {count, plural, =1 {1 panelu} other {# paneli} }?", + "unassign-dashboards-from-edge-text": "Po potwierdzeniu wszystkie wybrane panele zostaną usunięte i nie będą dostępne na urządzeniu Edge.", + "assign-dashboard-to-edge": "Przypisz panele do Edge", + "assign-dashboard-to-edge-text": "Wybierz panele, które chcesz przypisać do Edge", + "non-existent-dashboard-state-error": "Stan panelu z identyfikatorem \"{{ stateId }}\" nie znaleziono", + "edit-mode": "Edit mode" + }, + "datakey": { + "settings": "Ustawienia", + "general": "Ogólne", + "advanced": "Zaawansowane", + "key": "Klucz", + "label": "Etykieta", + "color": "Kolor", + "units": "Specjalny symbol wyświetlany obok wartości", + "decimals": "Liczba cyfr po przecinku", + "data-generation-func": "Funkcja generowania danych", + "use-data-post-processing-func": "Użyj funkcji przetwarzania końcowego danych", + "configuration": "Konfiguracja klucza danych", + "timeseries": "Szereg czasowy", + "attributes": "Atrybuty", + "entity-field": "Pole obiektu", + "alarm": "Pola alarmowe", + "timeseries-required": "Szeregi czasowe encji są wymagane.", + "timeseries-or-attributes-required": "Szeregi czasowe/atrybuty elementu są wymagane.", + "alarm-fields-timeseries-or-attributes-required": "Pola alarmów lub szeregi czasowe/atrybuty encji są wymagane.", + "maximum-timeseries-or-attributes": "Maksymalnie {count, plural, =1 {1 seria czasowa/atrybut jest dozwolona.} other {# serii czasowych/atrybutów jest dozwolonych} }.", + "alarm-fields-required": "Pola alarmowe są wymagane.", + "function-types": "Typy funkcji", + "function-type": "Typ funkcji", + "function-types-required": "Typy funkcji są wymagane.", + "data-keys": "Data keys", + "data-key": "Data key", + "data-keys-required": "Data keys are required.", + "data-key-required": "Data key is required.", + "alarm-keys": "Klucze danych alarmowych", + "alarm-key": "Klucz danych alarmowych", + "alarm-key-functions": "Funkcje klawiszy alarmowych", + "alarm-key-function": "Funkcja klawisza alarmu", + "latest-keys": "Najnowsze klucze danych", + "latest-key": "Najnowszy klucz danych", + "latest-key-functions": "Najnowsze kluczowe funkcje", + "latest-key-function": "Najnowsza funkcja klucza", + "timeseries-keys": "Klucze danych szeregów czasowych", + "timeseries-key": "Klucz danych szeregów czasowych", + "timeseries-key-functions": "Kluczowe funkcje szeregów czasowych", + "timeseries-key-function": "Funkcja klucza szeregów czasowych", + "maximum-function-types": "Maksymalnie {count, plural, =1 {dozwolony jest 1 typ funkcji.} other {dozwolonych jest # typów funkcji.} }.", + "time-description": "znacznik czasu bieżącej wartości;", + "value-description": "aktualna wartość;", + "prev-value-description": "wynik poprzedniego wywołania funkcji;", + "time-prev-description": "znacznik czasu poprzedniej wartości;", + "prev-orig-value-description": "oryginalna poprzednia wartość;", + "aggregation": "Zbiór", + "aggregation-type-hint-common": "Ze względu na wydajność obliczanie wartości zagregowanych jest dostępne tylko dla stałych przedziałów czasu, takich jak „bieżący dzień”, „bieżący miesiąc” itp., i nie jest dostępne dla przedziałów okna przesuwnego, takich jak „ostatnie 30 minut” lub „ostatnie 24 godziny”.", + "aggregation-type-none-hint": "Weź najnowszą wartość.", + "aggregation-type-min-hint": "Znajdź minimalną wartość wśród punktów danych w wybranym oknie czasowym.", + "aggregation-type-max-hint": "Znajdź maksymalną wartość wśród punktów danych w wybranym oknie czasowym.", + "aggregation-type-avg-hint": "Oblicz średnią wartość spośród punktów danych w wybranym oknie czasowym.", + "aggregation-type-sum-hint": "Zsumuj wszystkie wartości punktów danych w wybranym oknie czasowym.", + "aggregation-type-count-hint": "Całkowita liczba punktów danych w wybranym oknie czasowym.", + "delta-calculation": "Obliczanie delty", + "enable-delta-calculation": "Włącz obliczanie delty", + "enable-delta-calculation-hint": "Po włączeniu wartość klucza danych jest obliczana na podstawie zagregowanych wartości dla wybranego okna czasowego i określonego okresu porównania. ", + "delta-calculation-result": "Wynik obliczenia delty", + "delta-calculation-result-previous-value": "Poprzednia wartość", + "delta-calculation-result-delta-absolute": "Delta (absolutna)", + "delta-calculation-result-delta-percent": "Delta (procent)", + "source": "Source", + "latest": "Latest", + "latest-value": "Latest value", + "delta": "delta", + "percent": "percent", + "absolute": "absolute" + }, + "datasource": { + "type": "Typ źródła danych", + "name": "Nazwa", + "label": "Etykieta", + "add-datasource-prompt": "Proszę dodać źródło danych" + }, + "details": { + "details": "Szczegóły", + "edit-mode": "Tryb edycji", + "edit-json": "Edytuj JSON", + "toggle-edit-mode": "Przełącz tryb edycji" + }, + "device": { + "all": "Wszystko", + "all-devices": "Wszystkie urządzenia", + "groups": "Grupy", + "shared": "Wspólny", + "device": "Urządzenie", + "device-required": "Urządzenie jest wymagane.", + "devices": "Urządzenia", + "management": "Zarządzanie urządzeniami", + "view-devices": "Wyświetl urządzenia", + "device-alias": "Alias urządzenia", + "device-type-max-length": "Typ urządzenia powinien być mniejszy niż 256", + "aliases": "Aliasy urządzeń", + "no-alias-matching": "'{{alias}}' nie znaleziono.", + "no-aliases-found": "Nie znaleziono aliasów.", + "no-key-matching": "'{{key}}' nie znaleziono.", + "no-keys-found": "Nie znaleziono kluczy.", + "create-new-alias": "Utwórz nowy!", + "create-new-key": "Utwórz nowy!", + "duplicate-alias-error": "Znaleziono zduplikowany alias '{{alias}}'.
Aliasy urządzeń muszą być unikalne w obrębie panelu kontrolnego.", + "configure-alias": "Skonfiguruj '{{alias}}' Alias", + "no-devices-matching": "Brak urządzeń pasujących do '{{entity}}' zostały znalezione.", + "alias": "Alias", + "alias-required": "Alias urządzenia jest wymagany.", + "remove-alias": "Usuń alias urządzenia", + "add-alias": "Dodaj alias urządzenia", + "name-starts-with": "Wyrażenie nazwy urządzenia", + "help-text": "Użyj „%” w zależności od potrzeb: „%device_name_contains%”, „%device_name_ends”, „device_starts_with”.", + "device-list": "Lista urządzeń", + "use-device-name-filter": "Użyj filtra", + "device-list-empty": "Nie wybrano żadnych urządzeń.", + "device-name-filter-required": "Filtr nazw urządzeń jest wymagany.", + "device-name-filter-no-device-matched": "Brak urządzeń zaczynających się od '{{device}}' zostały znalezione.", + "add": "Dodaj urządzenie", + "assign-to-customer": "Przypisz do klienta", + "assign-device-to-customer": "Przypisz urządzenia do klienta", + "assign-device-to-customer-text": "Proszę wybrać urządzenia, które chcesz przypisać do klienta", + "make-public": "Ustaw urządzenie jako publiczne", + "make-private": "Ustaw urządzenie jako prywatne", + "no-devices-text": "Nie znaleziono urządzeń", + "assign-to-customer-text": "Wybierz klienta, aby przypisać urządzenie(a)", + "device-details": "Szczegóły urządzenia", + "add-device-text": "Dodaj nowe urządzenie", + "credentials": "Dane uwierzytelniające", + "manage-credentials": "Zarządzaj danymi uwierzytelniającymi", + "delete": "Usuń urządzenie", + "assign-devices": "Przypisz urządzenia", + "assign-devices-text": "Przypisz {count, plural, =1 {1 urządzenie} other {# urządzeń} } do klienta", + "delete-devices": "Usuń urządzenia", + "unassign-from-customer": "Usuń przypisanie od klienta", + "unassign-devices": "Usuń przypisanie urządzeń", + "unassign-devices-action-title": "Anuluj przypisanie {count, plural, =1 {1 urządzenie} other {# urządzeń} } od klienta.", + "unassign-device-from-edge-title": "Czy na pewno chcesz usunąć przypisanie urządzenia '{{deviceName}}'?", + "unassign-device-from-edge-text": "Po potwierdzeniu urządzenie zostanie anulowane i nie będzie dostępne na urządzeniu Edge.", + "unassign-devices-from-edge": "Usuń przypisanie urządzeń z Edge", + "assign-new-device": "Przypisz nowe urządzenie", + "make-public-device-title": "Czy na pewno chcesz uczynić urządzenie {{deviceName}} publicznym ?", + "make-public-device-text": "Po potwierdzeniu urządzenie i wszystkie jego dane zostaną upublicznione i dostępne dla innych.", + "make-private-device-title": "Czy na pewno chcesz uczynić urządzenie '{{deviceName}}' prywatnym?", + "make-private-device-text": "Po potwierdzeniu urządzenie i wszystkie jego dane staną się prywatne i nie będą dostępne dla innych.", + "view-credentials": "Wyświetl dane uwierzytelniające", + "delete-device-title": "Czy na pewno chcesz usunąć urządzenie '{{deviceName}}'?", + "delete-device-text": "Bądź ostrożny, po potwierdzeniu urządzenia i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-devices-title": "Czy na pewno chcesz usunąć {count, plural, =1 {1 urządzenie} other {# urządzeń} }?", + "delete-devices-action-title": "Usuń {count, plural, =1 {1 urządzenie} other {# urządzeń} }", + "delete-devices-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane urządzenia zostaną usunięte, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "unassign-device-title": "Czy na pewno chcesz usunąć przypisanie urządzenia '{{deviceName}}'?", + "unassign-device-text": "Po potwierdzeniu urządzenie zostanie anulowane i nie będzie dostępne dla klienta.", + "unassign-device": "Usuń przypisanie urządzenia", + "unassign-devices-title": "Czy na pewno chcesz cofnąć przypisanie {count, plural, =1 {1 urządzenia} other {# urządzeń} }?", + "unassign-devices-text": "Po potwierdzeniu wszystkie wybrane urządzenia zostaną usunięte i nie będą dostępne dla klienta.", + "device-credentials": "Poświadczenia urządzenia.", + "loading-device-credentials": "Ładowanie danych logowania urządzenia...", + "credentials-type": "Typ poświadczeń", + "access-token": "Token dostępu", + "access-token-required": "Token dostępu jest wymagany.", + "access-token-invalid": "Długość tokenu dostępu musi wynosić od 1 do 32 znaków.", + "certificate-pem-format": "Certyfikat w formacie PEM", + "certificate-pem-format-required": "Certyfikat jest wymagany.", + "copy-access-token": "Skopiuj token dostępu", + "copy-certificate": "Skopiuj certyfikat", + "copy-client-id": "Skopiuj identyfikator klienta", + "copy-user-name": "Skopiuj nazwę użytkownika", + "copy-password": "Skopiuj hasło", + "generate-client-id": "Wygeneruj identyfikator klienta", + "generate-user-name": "Wygeneruj nazwę użytkownika", + "generate-password": "Wygeneruj hasło", + "generate-access-token": "Wygeneruj token dostępu", + "lwm2m-security-config": { + "identity": "Tożsamość Klienta", + "identity-required": "Tożsamość klienta jest wymagana.", + "identity-tooltip": "Identyfikator PSK jest dowolnym identyfikatorem PSK o długości do 128 bajtów, zgodnie z opisem w normie [RFC7925].\n Identyfikator PSK MUSI najpierw zostać przekonwertowany do łańcuchu znaków i zakodowanym w oktety używając UTF-8.", + "client-key": "Klucz klienta", + "client-key-required": "Klucz klienta jest wymagany.", + "client-key-tooltip-prk": "Klucz publiczny lub identyfikator RPK musi być w standardzie [RFC7250] i zakodowany w formacie Base64!", + "client-key-tooltip-psk": "Klucz PSK musi być w standardzie [RFC4279] i formacie HexDec: 32, 64, 128 znaków!", + "endpoint": "Nazwa klienta punktu końcowego", + "endpoint-required": "Nazwa klienta punktu końcowego jest wymagana.", + "client-public-key": "Klucz publiczny klienta", + "client-public-key-hint": "Jeśli klucz publiczny klienta jest pusty, zostanie użyty zaufany certyfikat", + "client-public-key-tooltip": "Klucz publiczny X509 musi być w formacie X509v3 zakodowanym w DER i obsługiwać wyłącznie algorytm EC, a następnie zakodowany w formacie Base64!", + "mode": "Tryb konfiguracji zabezpieczeń", + "client-tab": "Konfiguracja zabezpieczeń klienta", + "client-certificate": "Certyfikat klienta", + "bootstrap-tab": "Klient Bootstrapa", + "bootstrap-server": "Serwer startowy", + "lwm2m-server": "Serwer LwM2M", + "client-publicKey-or-id": "Klucz publiczny klienta lub identyfikator jest wymagany.", + "client-publicKey-or-id-required": "Klucz publiczny lub identyfikator klienta są wymagane.", + "client-publicKey-or-id-tooltip-psk": "Identyfikator PSK jest dowolnym identyfikatorem PSK o długości do 128 bajtów, zgodnie z opisem w normie [RFC7925].\nIdentyfikator PSK MUSI najpierw zostać przekonwertowany na łańcuch znaków i potem zakodowany do oktetów używając UTF-8", + "client-publicKey-or-id-tooltip-rpk": "Klucz publiczny lub identyfikator RPK musi być w standardzie [RFC7250] i zakodowany w formacie Base64!", + "client-publicKey-or-id-tooltip-x509": "Klucz publiczny X509 musi być w formacie X509v3 zakodowanym w DER i obsługiwać wyłącznie algorytm EC, a następnie zakodowany w formacie Base64", + "client-secret-key": "Tajny klucz klienta", + "client-secret-key-required": "Tajny klucz klienta jest wymagany.", + "client-secret-key-tooltip-psk": "Klucz PSK musi być w standardzie [RFC4279] i formacie HexDec: 32, 64, 128 znaków!", + "client-secret-key-tooltip-prk": "Tajny klucz RPK musi być w formacie PKCS_8 (kodowanie DER, standard [RFC5958]), a następnie zakodowany w formacie Base64!", + "client-secret-key-tooltip-x509": "Tajny klucz X509 musi być w formacie PKCS_8 (kodowanie DER, standard [RFC5958]), a następnie zakodowany w formacie Base64!" }, - "client-id":"ID klienta", - "client-id-pattern":"Zawiera nieprawidłowy znak.", - "user-name":"Nazwa użytkownika", - "user-name-required":"Nazwa użytkownika jest wymagana.", - "client-id-or-user-name-necessary":"ID klienta i/lub Nazwa użytkownika są wymagane", - "password":"Hasło", - "secret":"Sekret", - "secret-required":"Sekret jest wymagany.", - "device-type":"Profil urządzenia", - "device-type-required":"Typ urządzenia jest wymagany.", - "select-device-type":"Wybierz typ urządzenia", - "enter-device-type":"Wprowadź profil urządzenia", - "any-device":"Dowolne urządzenie", - "no-device-types-matching":"Nie znaleziono profili urządzeń pasujących do '{{entitySubtype}}'.", - "device-type-list-empty":"Nie wybrano profili urządzeń!", - "device-profile-type-list-empty":"Należy wybrać co najmniej jeden profil urządzenia.", - "device-types":"Profile urządzeń", - "name":"Nazwa", - "name-required":"Nazwa jest wymagana.", - "name-max-length":"Nazwa powinna być krótsza niż 256", - "label-max-length":"Etykieta powinna być krótsza niż 256", - "description":"Opis", - "label":"Etykieta", - "events":"Zdarzenia", - "details":"Szczegóły", - "copyId":"Kopiuj ID urządzenia", - "copyAccessToken":"Kopiuj token dostępu", - "copy-mqtt-authentication":"Kopiuj poświadczenia MQTT", - "idCopiedMessage":"ID urządzenia zostało skopiowane do schowka", - "accessTokenCopiedMessage":"Token dostępu do urządzenia został skopiowany do schowka", - "mqtt-authentication-copied-message":"Poświadczenia MQTT urządzenia zostały skopiowane do schowka", - "assignedToCustomer":"Przypisane do klienta", - "unable-delete-device-alias-title":"Nie można usunąć aliasu urządzenia", - "unable-delete-device-alias-text":"Alias urządzenia '{{deviceAlias}}' nie może być usunięty, ponieważ jest używany przez następujące widżety:
{{widgetsList}}", - "is-gateway":"Jest bramą", - "overwrite-activity-time":"Nadpisz czas aktywności podłączonego urządzenia", - "device-filter":"Filtr urządzenia", - "device-filter-title":"Filtr urządzenia", - "filter-title":"Filtr", - "device-state":"Stan urządzenia", - "state":"Stan", - "any":"Dowolny", - "active":"Aktywny", - "inactive":"Nieaktywny", - "public":"Publiczny", - "device-public":"Urządzenie jest publiczne", - "select-device":"Wybierz urządzenie", - "import":"Importuj urządzenie", - "device-file":"Plik urządzenia", - "search":"Wyszukaj urządzenia", - "selected-devices":"{ count, plural, =1 {1 urządzenie} other {# urządzeń} } wybranych", - "device-configuration":"Konfiguracja urządzenia", - "transport-configuration":"Konfiguracja transportu", - "wizard":{ - "device-details":"Szczegóły urządzenia" + "client-id": "Identyfikator klienta", + "client-id-pattern": "Zawiera nieprawidłowy znak.", + "user-name": "Nazwa użytkownika", + "user-name-required": "Nazwa użytkownika jest wymagana.", + "client-id-or-user-name-necessary": "Identyfikator klienta i/lub nazwa użytkownika są niezbędne", + "password": "Hasło", + "secret": "Sekret", + "secret-required": "Sekret jest wymagany.", + "device-type": "Rodzaj urządzenia", + "device-type-required": "Typ urządzenia jest wymagany.", + "select-device-type": "Wybierz typ urządzenia", + "enter-device-type": "Wpisz typ urządzenia", + "any-device": "Dowolne urządzenie", + "no-device-types-matching": "Brak typów urządzeń pasujących do '{{entitySubtype}}' zostały znalezione.", + "device-type-list-empty": "Nie wybrano typów urządzeń.", + "device-types": "Typy urządzeń", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana.", + "name-max-length": "Nazwa powinna być mniejsza niż 256", + "label-max-length": "Etykieta powinna być mniejsza niż 256", + "description": "Opis", + "label": "Etykieta", + "events": "Wydarzenia", + "details": "Szczegóły", + "copyId": "Skopiuj identyfikator urządzenia", + "copyAccessToken": "Skopiuj token dostępu", + "copy-mqtt-authentication": "Skopiuj poświadczenia MQTT", + "idCopiedMessage": "Identyfikator urządzenia został skopiowany do schowka", + "accessTokenCopiedMessage": "Token dostępu do urządzenia został skopiowany do schowka", + "mqtt-authentication-copied-message": "Uwierzytelnianie urządzenia MQTT zostało skopiowane do schowka", + "assignedToCustomer": "Przypisany do klienta", + "unable-delete-device-alias-title": "Nie można usunąć aliasu urządzenia", + "unable-delete-device-alias-text": "Alias urządzenia '{{deviceAlias}}' nie może zostać usunięty, ponieważ jest używany przez następujące widżety:
{{widgetsList}}", + "is-gateway": "Gateway", + "overwrite-activity-time": "Zastąp czas aktywności podłączonego urządzenia", + "device-filter": "Filtruj urządzenia", + "device-filter-title": "Filtruj urządzenia", + "filter-title": "Filtr", + "device-state": "Stan urządzenia", + "state": "Stan", + "any": "Każdy", + "active": "Aktywny", + "inactive": "Nieaktywny", + "public": "Publiczny", + "device-public": "Urządzenie jest publiczne", + "select-device": "Wybierz urządzenie", + "select-group-to-add": "Wybierz grupę docelową, aby dodać wybrane urządzenia", + "select-group-to-move": "Wybierz grupę docelową, aby przenieść wybrane urządzenia", + "remove-devices-from-group": "Czy na pewno chcesz usunąć {count, plural, =1 {1 urządzenie} other {# urządzeń} } z grupy '{{entityGroup}}'?", + "group": "Grupa urządzeń", + "list-of-groups": "{count, plural, =1 {Jedna grupa urządzeń} other {Lista # grup urządzeń} }", + "group-name-starts-with": "Grupy urządzeń, których nazwy zaczynają się od '{{prefix}}'", + "import": "Importuj urządzenie", + "device-file": "Plik urządzenia", + "search": "Wyszukaj urządzenia", + "selected-devices": "Wybrano {count, plural, =1 {1 urządzenie} other {# urządzeń} }", + "device-configuration": "Konfiguracja urzadzenia", + "transport-configuration": "Konfiguracja transportu", + "wizard": { + "device-details": "Szczegóły urządzenia", + "device-wizard": "Kreator urządzeń", + "new-device-profile": "Utwórz nowy profil urządzenia", + "existing-device-profile": "Wybierz istniejący profil urządzenia", + "specific-configuration": "Konkretna konfiguracja", + "customer-to-assign-device": "Klientowi przypisanie urządzenia", + "add-credentials": "Dodaj dane uwierzytelniające" }, - "unassign-devices-from-edge-title":"Czy na pewno chcesz odłączyć { count, plural, =1 {1 urządzenie} other {# urządzeń} }?", - "unassign-devices-from-edge-text":"Po potwierdzeniu wszystkie wybrane urządzenia zostaną odłączone i nie będą dostępne dla krawędzi.", - "time":"Czas", - "connectivity":{ - "check-connectivity":"Sprawdź łączność", - "device-created-check-connectivity":"Urządzenie utworzone. Sprawdźmy łączność!", - "loading-check-connectivity-command":"Ładowanie poleceń sprawdzania łączności...", - "use-following-instructions":"Skorzystaj z poniższych instrukcji, aby wysyłać telemetrię w imieniu urządzenia za pomocą konsoli", - "execute-following-command":"Wykonaj poniższe polecenie", - "install-curl-windows":"Począwszy od systemu Windows 10 b17063, cURL jest dostępny domyślnie", - "install-curl-macos":"Począwszy od Mac OS X 10.2 6C115 (Jaguar), cURL jest dostępny domyślnie", - "install-mqtt-windows":"Użyj instrukcji do pobrania, zainstalowania, skonfigurowania i uruchomienia mosquitto_pub", - "install-coap-client":"Użyj instrukcji do pobrania, zainstalowania, skonfigurowania i uruchomienia klienta coap", - "install-necessary-client-tools":"Zainstaluj niezbędne narzędzia klienta", - "mqtts-x509-command":"Skorzystaj z poniższej dokumentacji, aby połączyć urządzenie za pomocą MQTT z uwierzytelnianiem X509", - "coaps-x509-command":"Skorzystaj z poniższej dokumentacji, aby połączyć urządzenie za pomocą CoAP przez DTLS z uwierzytelnianiem X509", - "snmp-command":"Skorzystaj z poniższej dokumentacji, aby połączyć urządzenie za pomocą SNMP.", - "sparkplug-command":"Skorzystaj z poniższej dokumentacji, aby połączyć urządzenie za pomocą MQTT Sparkplug.", - "lwm2m-command":"Skorzystaj z poniższej dokumentacji, aby połączyć urządzenie za pomocą LWM2M." + "unassign-devices-from-edge-title": "Czy na pewno chcesz cofnąć przypisanie {count, plural, =1 {1 urządzenia} other {# urządzeń} }?", + "unassign-devices-from-edge-text": "Po potwierdzeniu wszystkie wybrane urządzenia zostaną usunięte i nie będą dostępne na urządzeniu Edge.", + "time": "Time", + "connectivity": { + "check-connectivity": "Check connectivity", + "device-created-check-connectivity": "Device created. Let's check connectivity!", + "loading-check-connectivity-command": "Loading check connectivity commands...", + "use-following-instructions": "Use the following instructions for sending telemetry on behalf of the device using shell", + "execute-following-command": "Execute the following command", + "install-curl-windows": "Starting Windows 10 b17063, cURL is available by default", + "install-curl-macos": "Starting Mac OS X 10.2 6C115 (Jaguar), cURL is available by default", + "install-mqtt-windows": "Use the instructions to download, install, setup and run mosquitto_pub", + "install-coap-client": "Use the instructions to download, install, setup and run coap-client", + "install-necessary-client-tools": "Install necessary client tools", + "mqtts-x509-command": "Use the following documentation to connect the device via MQTT with authorization X509", + "coaps-x509-command": "Use the following documentation to connect the device via CoAP over DTLS with authorization X509", + "snmp-command": "Use the following documentation to connect the device through the SNMP.", + "sparkplug-command": "Use the following documentation to connect the device through the MQTT Sparkplug.", + "lwm2m-command": "Use the following documentation to connect the device through the LWM2M." } }, - "asset-profile":{ - "asset-profile":"Profil zasobu", - "asset-profiles":"Profile zasobów", - "all-asset-profiles":"Wszystkie", - "add":"Dodaj profil zasobu", - "edit":"Edytuj profil zasobu", - "asset-profile-details":"Szczegóły profilu zasobu", - "no-asset-profiles-text":"Nie znaleziono profili zasobów", - "search":"Szukaj profili zasobów", - "selected-asset-profiles":"{ count, plural, =1 {1 profil zasobu} other {# profile zasobów} } wybrano", - "no-asset-profiles-matching":"Nie znaleziono profilu zasobu pasującego do '{{entity}}'.", - "asset-profile-required":"Wymagany profil zasobu", - "idCopiedMessage":"Identyfikator profilu zasobu został skopiowany do schowka", - "set-default":"Ustaw jako domyślny profil zasobu", - "delete":"Usuń profil zasobu", - "copyId":"Kopiuj identyfikator profilu zasobu", - "name-max-length":"Nazwa powinna mieć mniej niż 256 znaków", - "new-device-profile-name":"Nazwa profilu zasobu", - "new-device-profile-name-required":"Wymagana jest nazwa profilu zasobu.", - "name":"Nazwa", - "name-required":"Wymagana jest nazwa.", - "image":"Zdjęcie profilu zasobu", - "description":"Opis", - "default":"Domyślny", - "default-rule-chain":"Domyślny łańcuch reguł", - "default-edge-rule-chain":"Domyślny łańcuch reguł na krawędzi", - "default-edge-rule-chain-hint":"Używane na krawędzi jako łańcuch reguł do przetwarzania przychodzących danych dla zasobów tego profilu zasobu", - "mobile-dashboard":"Mobilna konsola", - "mobile-dashboard-hint":"Używane przez aplikację mobilną jako konsola szczegółów zasobu", - "select-queue-hint":"Wybierz z listy rozwijanej.", - "delete-asset-profile-title":"Czy na pewno chcesz usunąć profil zasobu '{{assetProfileName}}'?", - "delete-asset-profile-text":"Bądź ostrożny, po potwierdzeniu profil zasobu i wszystkie związane dane staną się nieodwracalnie utracone.", - "delete-asset-profiles-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 profil zasobu} other {# profile zasobów} }?", - "delete-asset-profiles-text":"Bądź ostrożny, po potwierdzeniu wszystkie wybrane profile zasobów zostaną usunięte, a wszystkie związane dane staną się nieodwracalnie utracone.", - "set-default-asset-profile-title":"Czy na pewno chcesz ustawić profil zasobu '{{assetProfileName}}' jako domyślny?", - "set-default-asset-profile-text":"Po potwierdzeniu profil zasobu zostanie oznaczony jako domyślny i będzie używany dla nowych zasobów bez określonego profilu.", - "no-asset-profiles-found":"Nie znaleziono profili zasobów.", - "create-new-asset-profile":"Utwórz nowy!", - "create-asset-profile":"Utwórz nowy profil zasobu", - "import":"Importuj profil zasobu", - "export":"Eksportuj profil zasobu", - "export-failed-error":"Nie można wyeksportować profilu zasobu: {{error}}", - "asset-profile-file":"Plik profilu zasobu", - "invalid-asset-profile-file-error":"Nie można zaimportować profilu zasobu: Nieprawidłowa struktura danych profilu zasobu." + "asset-profile": { + "asset-profile": "Profil zasobu", + "asset-profiles": "Profile zasobu", + "all-asset-profiles": "Wszystko", + "add": "Dodaj profil zasobu", + "edit": "Edytuj profil zasobu", + "asset-profile-details": "Szczegóły profilu zasobów", + "no-asset-profiles-text": "Nie znaleziono profili zasobów", + "search": "Wyszukaj profile zasobów", + "selected-asset-profiles": "Wybrano {count, plural, =1 {1 profil zasobu} other {# profili zasobów} }", + "no-asset-profiles-matching": "Nie znaleziono dopasowania profilu zasobu '{{entity}}'", + "asset-profile-required": "Profil zasobu jest wymagany", + "idCopiedMessage": "Identyfikator profilu zasobu został skopiowany do schowka", + "set-default": "Ustaw profil zasobów jako domyślny", + "delete": "Usuń profil zasobu", + "copyId": "Skopiuj identyfikator profilu zasobu", + "name-max-length": "Nazwa powinna być mniejsza niż 256", + "new-device-profile-name": "Nazwa profilu zasobu", + "new-device-profile-name-required": "Nazwa profilu zasobu jest wymagana.", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana", + "image": "Obraz profilowy zasobu", + "description": "Opis", + "default": "Domyślny", + "default-rule-chain": "Domyślny łańcuch reguł", + "default-edge-rule-chain": "Domyślny łańcuch reguł Edge", + "default-edge-rule-chain-hint": "Używany na Edge jako łańcuch reguł do przetwarzania danych przychodzących dla zasobów tego profilu zasobów", + "mobile-dashboard": "Mobilny panel", + "mobile-dashboard-hint": "Używany przez aplikację mobilną jako panel ze szczegółami zasobów", + "select-queue-hint": "Wybierz z listy rozwijanej.", + "delete-asset-profile-title": "Czy na pewno chcesz usunąć profil zasobu '{{assetProfileName}}'?", + "delete-asset-profile-text": "Bądź ostrożny, po potwierdzeniu profilu zasobu i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-asset-profiles-title": "Czy na pewno chcesz usunąć {count, plural, =1 {1 profil zasobu} other {# profilów zasobów} }?", + "delete-asset-profiles-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane profile zasobów zostaną usunięte, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "set-default-asset-profile-title": "Czy na pewno chcesz uczynić profil zasobu '{{assetProfileName}}' domyślnym?", + "set-default-asset-profile-text": "Po potwierdzeniu profil zasobu zostanie oznaczony jako domyślny i będzie używany do nowych zasobów bez określonego profilu.", + "no-asset-profiles-found": "Nie znaleziono profili zasobów.", + "create-new-asset-profile": "Utwórz nowy!", + "create-asset-profile": "Utwórz nowy profil zasobu", + "import": "Importuj profil zasobu", + "export": "Eksportuj profil zasobów", + "export-failed-error": "Nie można wyeksportować profilu zasobu: {{error}}", + "asset-profile-file": "Plik profilu zasobów", + "invalid-asset-profile-file-error": "Nie można zaimportować profilu zasobu: nieprawidłowa struktura danych profilu zasobu." }, - "device-profile":{ - "device-profile":"Profil urządzenia", - "device-profiles":"Profile urządzeń", - "all-device-profiles":"Wszystkie", - "add":"Dodaj profil urządzenia", - "edit":"Edytuj profil urządzenia", - "device-profile-details":"Szczegóły profilu urządzenia", - "no-device-profiles-text":"Nie znaleziono profili urządzeń", - "search":"Szukaj profili urządzeń", - "selected-device-profiles":"{ count, plural, =1 {1 profil urządzenia} other {# profile urządzeń} } wybrano", - "no-device-profiles-matching":"Nie znaleziono profilu urządzenia pasującego do '{{entity}}'.", - "device-profile-required":"Wymagany profil urządzenia", - "idCopiedMessage":"Identyfikator profilu urządzenia został skopiowany do schowka", - "set-default":"Ustaw jako domyślny profil urządzenia", - "delete":"Usuń profil urządzenia", - "copyId":"Kopiuj identyfikator profilu urządzenia", - "name-max-length":"Nazwa powinna mieć mniej niż 256 znaków", - "name":"Nazwa", - "name-required":"Wymagana jest nazwa.", - "type":"Typ profilu", - "type-required":"Wymagany jest typ profilu.", - "type-default":"Domyślny", - "image":"Zdjęcie profilu urządzenia", - "transport-type":"Typ transportu", - "transport-type-required":"Wymagany jest typ transportu.", - "transport-type-default":"Domyślny", - "transport-type-default-hint":"Obsługuje podstawowe transporty MQTT, HTTP i CoAP", - "transport-type-mqtt":"MQTT", - "transport-type-mqtt-hint":"Umożliwia zaawansowane ustawienia transportu MQTT", - "transport-type-coap":"CoAP", - "transport-type-coap-hint":"Umożliwia zaawansowane ustawienia transportu CoAP", - "transport-type-lwm2m":"LWM2M", - "transport-type-lwm2m-hint":"Typ transportu LWM2M", - "transport-type-snmp":"SNMP", - "transport-type-snmp-hint":"Określ konfigurację transportu SNMP", - "transport-type-http":"HTTP", - "description":"Opis", - "default":"Domyślny", - "profile-configuration":"Konfiguracja profilu", - "transport-configuration":"Konfiguracja transportu", - "default-rule-chain":"Domyślny łańcuch reguł", - "default-edge-rule-chain":"Domyślny łańcuch reguł na krawędzi", - "default-edge-rule-chain-hint":"Używane na krawędzi jako łańcuch reguł do przetwarzania przychodzących danych dla urządzeń tego profilu urządzenia", - "mobile-dashboard":"Mobilna konsola", - "mobile-dashboard-hint":"Używane przez aplikację mobilną jako konsola szczegółów urządzenia", - "select-queue-hint":"Wybierz z listy rozwijanej.", - "delete-device-profile-title":"Czy na pewno chcesz usunąć profil urządzenia '{{deviceProfileName}}'?", - "delete-device-profile-text":"Bądź ostrożny, po potwierdzeniu profil urządzenia i wszystkie związane dane, w tym powiązane aktualizacje OTA, staną się nieodwracalnie utracone.", - "delete-device-profiles-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 profil urządzenia} other {# profile urządzeń} }?", - "delete-device-profiles-text":"Bądź ostrożny, po potwierdzeniu wszystkie wybrane profile urządzeń zostaną usunięte, a wszystkie związane dane, w tym powiązane aktualizacje OTA, staną się nieodwracalnie utracone.", - "set-default-device-profile-title":"Czy na pewno chcesz ustawić profil urządzenia '{{deviceProfileName}}' jako domyślny?", - "set-default-device-profile-text":"Po potwierdzeniu profil urządzenia zostanie oznaczony jako domyślny i będzie używany dla nowych urządzeń bez określonego profilu.", - "no-device-profiles-found":"Nie znaleziono profili urządzeń.", - "create-new-device-profile":"Utwórz nowy!", - "mqtt-device-topic-filters":"Filtr tematów urządzenia MQTT", - "mqtt-device-topic-filters-unique":"Filtry tematów urządzenia MQTT muszą być unikalne.", - "mqtt-device-topic-filters-spark-plug":"Węzeł krawędziowy MQTT Sparkplug B (EoN).", - "mqtt-device-topic-filters-spark-plug-hint":"Zezwól na połączenia z węzłami EoN z ładunkiem i formatem tematu Sparkplug B.", - "mqtt-device-topic-filters-spark-plug-attribute-metric-names":"Metryki SparkPlug do przechowywania jako atrybuty.", - "mqtt-device-topic-filters-spark-plug-attribute-metric-names-hint":"Nazwy metryk SparkPlug, które będą przechowywane jako atrybuty urządzenia. Wszystkie inne metryki będą przechowywane jako telemetria urządzenia.", - "mqtt-device-payload-type":"Typ ładunka urządzenia MQTT", - "mqtt-device-payload-type-json":"JSON", - "mqtt-device-payload-type-proto":"Protobuf", - "mqtt-enable-compatibility-with-json-payload-format":"Włącz zgodność z innymi formatami ładunków.", - "mqtt-enable-compatibility-with-json-payload-format-hint":"Gdy jest włączona, platforma będzie domyślnie używać formatu ładunku Protobuf. Jeśli parsowanie się nie powiedzie, platforma spróbuje użyć formatu ładunku JSON. Przydatne dla wstecznej kompatybilności podczas aktualizacji oprogramowania układowego. Na przykład początkowa wersja oprogramowania używa Json, podczas gdy nowa wersja używa Protobuf. Podczas procesu aktualizacji oprogramowania dla floty urządzeń konieczne jest jednoczesne obsługiwanie zarówno Protobuf, jak i JSON. Tryb zgodności wprowadza niewielki spadek wydajności, więc zaleca się wyłączenie tego trybu, gdy wszystkie urządzenia zostaną zaktualizowane.", - "mqtt-use-json-format-for-default-downlink-topics":"Użyj formatu Json dla domyślnych tematów zwrotnych", - "mqtt-use-json-format-for-default-downlink-topics-hint":"Gdy jest włączone, platforma będzie używać formatu ładunku Json do przesyłania atrybutów i RPC za pomocą następujących tematów: v1/devices/me/attributes/response/$request_id, v1/devices/me/attributes, v1/devices/me/rpc/request/$request_id, v1/devices/me/rpc/response/$request_id. Ta ustawienie nie wpływa na subskrypcje atrybutów i rpc wysyłane za pomocą nowych (v2) tematów: v2/a/res/$request_id, v2/a, v2/r/req/$request_id, v2/r/res/$request_id. Gdzie $request_id to identyfikator żądania.", - "mqtt-send-ack-on-validation-exception":"Wyślij PUBACK w przypadku niepowodzenia walidacji komunikatu PUBLISH", - "mqtt-send-ack-on-validation-exception-hint":"Domyślnie platforma zakończy sesję MQTT w przypadku niepowodzenia walidacji komunikatu. Gdy jest włączone, platforma wyśle potwierdzenie publikacji zamiast zakończenia sesji.", - "snmp-add-mapping":"Dodaj mapowanie SNMP", - "snmp-mapping-not-configured":"Nie skonfigurowano mapowania OID na szeregi czasowe/telemetrię", - "snmp-timseries-or-attribute-name":"Nazwa szeregów czasowych/cechy do mapowania", - "snmp-timseries-or-attribute-type":"Typ szeregów czasowych/cechy do mapowania", - "snmp-method-pdu-type-get-request":"GetRequest", - "snmp-method-pdu-type-get-next-request":"GetNextRequest", - "snmp-oid":"OID", - "transport-device-payload-type-json":"JSON", - "transport-device-payload-type-proto":"Protobuf", - "mqtt-payload-type-required":"Wymagany jest typ ładunka.", - "coap-device-type":"Typ urządzenia CoAP", - "coap-device-payload-type":"Typ ładunka urządzenia CoAP", - "coap-device-type-required":"Wymagany jest typ urządzenia CoAP.", - "coap-device-type-default":"Domyślny", - "coap-device-type-efento":"Efento NB-IoT", - "support-level-wildcards":"Obsługiwane są pojedyncze [+] i wielopoziomowe [#] znaki wieloznaczne.", - "telemetry-topic-filter":"Filtr tematu telemetrii", - "telemetry-topic-filter-required":"Wymagany jest filtr tematu telemetrii.", - "attributes-topic-filter":"Filtr tematu publikacji atrybutów", - "attributes-subscribe-topic-filter":"Filtr tematu subskrypcji atrybutów", - "attributes-topic-filter-required":"Wymagany jest filtr tematu publikacji atrybutów.", - "attributes-subscribe-topic-filter-required":"Wymagany jest filtr tematu subskrypcji atrybutów", - "telemetry-proto-schema":"Schemat protokołu telemetrii", - "telemetry-proto-schema-required":"Wymagany jest schemat protokołu telemetrii.", - "attributes-proto-schema":"Schemat protokołu atrybutów", - "attributes-proto-schema-required":"Wymagany jest schemat protokołu atrybutów.", - "rpc-response-proto-schema":"Schemat protokołu odpowiedzi RPC", - "rpc-response-proto-schema-required":"Wymagany jest schemat protokołu odpowiedzi RPC.", - "rpc-response-topic-filter":"Filtr tematu odpowiedzi RPC", - "rpc-response-topic-filter-required":"Wymagany jest filtr tematu odpowiedzi RPC.", - "rpc-request-proto-schema":"Schemat protokołu żądania RPC", - "rpc-request-proto-schema-required":"Wymagany jest schemat protokołu żądania RPC.", - "rpc-request-proto-schema-hint":"Wiadomość żądania RPC powinna zawsze zawierać pola: string method = 1; int32 requestId = 2; oraz params = 3 dowolnego typu danych.", - "not-valid-pattern-topic-filter":"Nieprawidłowy filtr tematu wzorca", - "not-valid-single-character":"Nieprawidłowe użycie znaku wieloznacznego jednego poziomu", - "not-valid-multi-character":"Nieprawidłowe użycie znaku wieloznacznego wielu poziomów", - "single-level-wildcards-hint":"[+] nadaje się do dowolnego poziomu filtra tematu. Na przykład: v1/devices/+/telemetry lub +/devices/+/attributes.", - "multi-level-wildcards-hint":"[#] może zastąpić sam filtr tematu i musi być ostatnim symbolem tematu. Na przykład: # lub v1/devices/me/#.", - "alarm-rules":"Zasady alarmowe", - "alarm-rules-with-count":"Zasady alarmowe ({{count}})", - "no-alarm-rules":"Brak skonfigurowanych zasad alarmowych", - "add-alarm-rule":"Dodaj zasadę alarmową", - "edit-alarm-rule":"Edytuj zasadę alarmową", - "alarm-type":"Typ alarmu", - "alarm-type-required":"Wymagany jest typ alarmu.", - "alarm-type-unique":"Typ alarmu musi być unikalny w ramach zasad alarmowych profilu urządzenia.", - "alarm-type-max-length":"Typ alarmu powinien być krótszy niż 256", - "create-alarm-pattern":"Utwórz alarm {{alarmType}}", - "create-alarm-rules":"Utwórz zasady alarmowe", - "no-create-alarm-rules":"Brak skonfigurowanych warunków utworzenia", - "add-create-alarm-rule-prompt":"Proszę dodać warunek utworzenia alarmu", - "clear-alarm-rule":"Wyczyść zasadę alarmową", - "no-clear-alarm-rule":"Brak skonfigurowanego warunku wyczyszczenia", - "add-create-alarm-rule":"Dodaj warunek utworzenia alarmu", - "add-clear-alarm-rule":"Dodaj warunek wyczyszczenia", - "select-alarm-severity":"Wybierz stopień pilności alarmu", - "alarm-severity-required":"Wymagany jest stopień pilności alarmu.", - "condition-duration":"Czas trwania warunku", - "condition-duration-value":"Wartość czasu trwania", - "condition-duration-time-unit":"Jednostka czasu", - "condition-duration-value-range":"Wartość czasu trwania powinna zawierać się w zakresie od 1 do 2147483647.", - "condition-duration-value-pattern":"Wartość czasu trwania powinna być liczbą całkowitą.", - "condition-duration-value-required":"Wymagana jest wartość czasu trwania.", - "condition-duration-time-unit-required":"Wymagana jest jednostka czasu.", - "advanced-settings":"Zaawansowane ustawienia", - "alarm-rule-additional-info":"Dodatkowe informacje", - "edit-alarm-rule-additional-info":"Edytuj dodatkowe informacje", - "alarm-rule-additional-info-placeholder":"Proszę podać swoje uwagi i dostosowania tutaj, aby wyświetlić je w szczegółach alarmu w sekcji Dodatkowe informacje", - "alarm-rule-additional-info-hint":"Wskazówka: użyj ${kluczNazwy} do zastąpienia wartości kluczy atrybutu lub telemetrii używanych w warunku zasady alarmowej.", - "alarm-rule-mobile-dashboard":"Panel nawigacyjny na urządzenia przenośne", - "alarm-rule-mobile-dashboard-hint":"Używane przez aplikację mobilną jako panel nawigacyjny szczegółów alarmu", - "alarm-rule-no-mobile-dashboard":"Nie wybrano panelu nawigacyjnego", - "propagate-alarm":"Rozprzestrzeniaj alarm do powiązanych jednostek", - "alarm-rule-relation-types-list":"Typy relacji do rozprzestrzeniania", - "alarm-rule-relation-types-list-hint":"Jeśli nie zostaną wybrane typy relacji do rozprzestrzeniania, alarmy będą rozprzestrzeniane bez filtrowania według typu relacji.", - "propagate-alarm-to-owner":"Rozprzestrzeniaj alarm do właściciela jednostki (Klienta lub Najemcy)", - "propagate-alarm-to-tenant":"Rozprzestrzeniaj alarm do Najemcy", - "alarm-rule-condition":"Warunek zasady alarmowej", - "enter-alarm-rule-condition-prompt":"Proszę dodać warunek zasady alarmowej", - "edit-alarm-rule-condition":"Edytuj warunek zasady alarmowej", - "device-provisioning":"Proces przydzielania urządzenia", - "provision-strategy":"Strategia przydzielania", - "provision-strategy-required":"Wymagana jest strategia przydzielania.", - "provision-strategy-disabled":"Wyłączone", - "provision-strategy-created-new":"Zezwól na tworzenie nowych urządzeń", - "provision-strategy-check-pre-provisioned":"Sprawdź wcześniej przydzielone urządzenia", - "provision-device-key":"Klucz przydzielania urządzenia", - "provision-device-key-required":"Wymagany jest klucz przydzielania urządzenia.", - "copy-provision-key":"Kopiuj klucz przydzielania", - "provision-key-copied-message":"Klucz przydzielania został skopiowany do schowka", - "provision-device-secret":"Sekret przydzielania urządzenia", - "provision-device-secret-required":"Wymagany jest sekret przydzielania urządzenia.", - "copy-provision-secret":"Kopiuj sekret przydzielania", - "provision-secret-copied-message":"Sekret przydzielania został skopiowany do schowka", - "provision-strategy-x509":{ - "certificate-chain":"Łańcuch certyfikatów X509", - "certificate-chain-hint":"Strategia certyfikatów X.509 jest używana do przydzielania urządzeń za pomocą certyfikatów klientów w dwukierunkowej komunikacji TLS.", - "allow-create-new-devices":"Utwórz nowe urządzenia", - "allow-create-new-devices-hint":"Jeśli zaznaczone, nowe urządzenia zostaną utworzone, a certyfikat klienta będzie używany jako dane uwierzytelniające urządzenia.", - "certificate-value":"Certyfikat w formacie PEM", - "certificate-value-required":"Wymagany jest certyfikat w formacie PEM", - "cn-regex-variable":"Zmienna wyrażenia regularnego CN", - "cn-regex-variable-required":"Wymagana jest zmienna wyrażenia regularnego CN", - "cn-regex-variable-hint":"Wymagane do pobrania nazwy urządzenia z wspólnego nazewnictwa certyfikatu X509 urządzenia." + "device-profile": { + "device-profile": "Profil urządzenia", + "device-profiles": "Profile urządzeń", + "all-device-profiles": "Wszystkie", + "add": "Dodaj profil urządzenia", + "edit": "Edytuj profil urządzenia", + "device-profile-details": "Szczegóły profilu urządzenia", + "no-device-profiles-text": "Nie znaleziono profili urządzeń", + "search": "Wyszukaj profile urządzeń", + "selected-device-profiles": "Wybrano {count, plural, =1 {1 profil urządzenia} other {# profili urządzeń} }", + "no-device-profiles-matching": "Nie znaleziono profilu urządzenia pasującego do '{{entity}}'", + "device-profile-required": "Profil urządzenia jest wymagany", + "idCopiedMessage": "Identyfikator profilu urządzenia został skopiowany do schowka", + "set-default": "Ustaw profil urządzenia jako domyślny", + "delete": "Usuń profil urządzenia", + "copyId": "Skopiuj identyfikator profilu urządzenia", + "name-max-length": "Nazwa powinna być mniejsza niż 256", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana", + "type": "Typ profilu", + "type-required": "Typ profilu jest wymagany.", + "type-default": "Domyślny", + "image": "Obraz profilu urządzenia", + "transport-type": "Rodzaj transportu", + "transport-type-required": "Rodzaj transportu jest wymagany.", + "transport-type-default": "Domyślny", + "transport-type-default-hint": "Obsługuje podstawowy transport MQTT, HTTP i CoAP", + "transport-type-mqtt": "MQTT", + "transport-type-mqtt-hint": "Włącza zaawansowane ustawienia transportu MQTT", + "transport-type-coap": "CoAP", + "transport-type-coap-hint": "Włącza zaawansowane ustawienia transportu CoAP", + "transport-type-lwm2m": "LWM2M", + "transport-type-lwm2m-hint": "Typ transportu LWM2M", + "transport-type-snmp": "SNMP", + "transport-type-snmp-hint": "Określ konfigurację transportu SNMP", + "transport-type-http": "HTTP", + "description": "Opis", + "default": "Domyślny", + "profile-configuration": "Konfiguracja profilu", + "transport-configuration": "Konfiguracja transportu", + "default-rule-chain": "Domyślny łańcuch reguł", + "default-edge-rule-chain": "Domyślny łańcuch reguł Edge", + "default-edge-rule-chain-hint": "Używany na Edge jako łańcuch reguł do przetwarzania danych przychodzących dla urządzeń o tym profilu urządzenia", + "mobile-dashboard": "Mobilny panel", + "mobile-dashboard-hint": "Używany przez aplikację mobilną jako panel ze szczegółami urządzenia", + "select-queue-hint": "Wybierz z listy rozwijanej.", + "delete-device-profile-title": "Czy na pewno chcesz usunąć profil urządzenia '{{deviceProfileName}}'?", + "delete-device-profile-text": "Zachowaj ostrożność, po potwierdzeniu profilu urządzenia i wszystkich powiązanych danych, w tym powiązanych aktualizacji OTA, nie będzie można odzyskać.", + "delete-device-profiles-title": "Czy na pewno chcesz usunąć {count, plural, =1 {1 profil urządzenia} other {# profili urządzeń} }?", + "delete-device-profiles-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane profile urządzeń zostaną usunięte, a wszystkie powiązane dane, w tym powiązane aktualizacje OTA, staną się niemożliwe do odzyskania.", + "set-default-device-profile-title": "Czy na pewno chcesz uczynić profil urządzenia '{{deviceProfileName}}' domyślnym?", + "set-default-device-profile-text": "Po potwierdzeniu profil urządzenia zostanie oznaczony jako domyślny i będzie używany w przypadku nowych urządzeń bez określonego profilu.", + "no-device-profiles-found": "Nie znaleziono profili urządzeń.", + "create-new-device-profile": "Utwórz nowy!", + "mqtt-device-topic-filters": "Filtry tematów urządzeń MQTT", + "mqtt-device-topic-filters-unique": "Filtry tematów urządzeń MQTT muszą być unikalne.", + "mqtt-device-topic-filters-spark-plug": "MQTT Sparkplug B Węzeł brzegowy sieci (EoN).", + "mqtt-device-topic-filters-spark-plug-hint": "Zezwalaj na połączenia z węzłów EoN z ładunkiem Sparkplug B i formatem tematu.", + "mqtt-device-topic-filters-spark-plug-attribute-metric-names": "Metryki SparkPlug do przechowywania jako atrybuty.", + "mqtt-device-topic-filters-spark-plug-attribute-metric-names-hint": "Nazwy metryk SparkPlug, które będą przechowywane jako atrybuty urządzenia. Wszystkie pozostałe metryki będą przechowywane jako telemetria urządzeń.", + "mqtt-device-payload-type": "Zawartość wiadomości urządzenia MQTT", + "mqtt-device-payload-type-json": "JSON", + "mqtt-device-payload-type-proto": "Protobuf", + "mqtt-enable-compatibility-with-json-payload-format": "Włącz zgodność z innymi formatami ładunku.", + "mqtt-enable-compatibility-with-json-payload-format-hint": "Po włączeniu platforma domyślnie będzie używać formatu ładunku Protobuf. Jeśli parsowanie się nie powiedzie, platforma spróbuje użyć formatu ładunku JSON. Przydatne dla wstecznej kompatybilności podczas aktualizacji oprogramowania sprzętowego. Na przykład, początkowa wersja oprogramowania sprzętowego wykorzystuje Json, podczas gdy nowa wersja wykorzystuje Protobuf. Podczas procesu aktualizacji oprogramowania układowego dla floty urządzeń wymagana jest jednoczesna obsługa zarówno Protobuf, jak i JSON. Tryb zgodności wprowadza niewielki spadek wydajności, dlatego zaleca się wyłączenie tego trybu po zaktualizowaniu wszystkich urządzeń.", + "mqtt-use-json-format-for-default-downlink-topics": "Użyj formatu Json dla domyślnych tematów łącza w dół", + "mqtt-use-json-format-for-default-downlink-topics-hint": "Po włączeniu platforma będzie używać formatu ładunku Json do przekazywania atrybutów i RPC za pośrednictwem następujących tematów: v1/devices/me/attributes/response/$request_id, v1/urządzenia/ja/atrybuty, v1/devices/me/rpc/request/$request_id, v1/devices/me/rpc/response/$request_id. v2/a/res/$request_id, v2/a, v2/r/req/$request_id, v2/r/res/$request_id. $id_żądania jest całkowitym identyfikatorem żądania.", + "mqtt-send-ack-on-validation-exception": "Wyślij PUBACK w przypadku niepowodzenia sprawdzania wiadomości PUBLISH", + "mqtt-send-ack-on-validation-exception-hint": "Domyślnie platforma zamknie sesję MQTT w przypadku niepowodzenia sprawdzania wiadomości. Po włączeniu tej opcji platforma wyśle potwierdzenie publikacji zamiast zamykać sesję.", + "snmp-add-mapping": "Dodaj mapowanie SNMP", + "snmp-mapping-not-configured": "Nie skonfigurowano mapowania OID na szeregi czasowe/telemetrię", + "snmp-timseries-or-attribute-name": "Seria czasowa/nazwa atrybutu do mapowania", + "snmp-timseries-or-attribute-type": "Typy szeregów czasowych/atrybutów do mapowania", + "snmp-method-pdu-type-get-request": "Pobierz żądanie", + "snmp-method-pdu-type-get-next-request": "Pobierz następne żądanie", + "snmp-oid": "OID", + "transport-device-payload-type-json": "JSON", + "transport-device-payload-type-proto": "Protobuf", + "mqtt-payload-type-required": "Typ ładunku jest wymagany.", + "coap-device-type": "Typ urządzenia CoAP", + "coap-device-payload-type": "Ładunek urządzenia CoAP", + "coap-device-type-required": "Typ urządzenia CoAP jest wymagany.", + "coap-device-type-default": "Domyślny", + "coap-device-type-efento": "Efento NB-IoT", + "support-level-wildcards": "Symbole wieloznaczne pojedyńcze [+] i wielopoziomowe [#] są obsługiwane.", + "telemetry-topic-filter": "Filtr tematu telemetrii", + "telemetry-topic-filter-required": "Filtr tematu telemetrii jest wymagany.", + "attributes-topic-filter": "Filtr tematu publikacji atrybutów", + "attributes-subscribe-topic-filter": "Filtr tematu subskrybcji atrybutów", + "attributes-topic-filter-required": "Filtr tematu publikowania atrybutów jest wymagany.", + "attributes-subscribe-topic-filter-required": "Temat subskrypcji atrybutów jest wymagany", + "telemetry-proto-schema": "Protoschemat telemetrii", + "telemetry-proto-schema-required": "Protoschemat telemetrii jest wymagany.", + "attributes-proto-schema": "Atrybuty schematu proto", + "attributes-proto-schema-required": "Schemat proto atrybutów jest wymagany.", + "rpc-response-proto-schema": "Schemat proto odpowiedzi RPC", + "rpc-response-proto-schema-required": "Schemat proto odpowiedzi RPC jest wymagany.", + "rpc-response-topic-filter": "Filtr tematu odpowiedzi RPC", + "rpc-response-topic-filter-required": "Filtr tematu odpowiedzi RPC jest wymagany.", + "rpc-request-proto-schema": "Schemat proto żądania RPC", + "rpc-request-proto-schema-required": "Schemat proto żądania RPC jest wymagany.", + "rpc-request-proto-schema-hint": "Komunikat żądania RPC powinien zawsze zawierać pola: string method = 1; ", + "not-valid-pattern-topic-filter": "Nieprawidłowy filtr tematu wzorca", + "not-valid-single-character": "Nieprawidłowe użycie jednopoziomowego znaku wieloznacznego", + "not-valid-multi-character": "Nieprawidłowe użycie wielopoziomowego znaku wieloznacznego", + "single-level-wildcards-hint": "[+] odpowiada każdemu poziomowi filtra tematycznego. Np.: v1/devices/+/telemetry lub +/devices/+/attributes.", + "multi-level-wildcards-hint": "[#] zastępuje końcówkę filtru tematu (musi byc ostatnim symbolem). Mp.: # lub v1/devices/me/#.", + "alarm-rules": "Zasady alarmowania", + "alarm-rules-with-count": "Reguły alarmowe ({{count}})", + "no-alarm-rules": "Nie skonfigurowano żadnych reguł alarmowych", + "add-alarm-rule": "Dodaj regułę alarmową", + "edit-alarm-rule": "Edytuj regułę alarmu", + "alarm-type": "Typ alarmu", + "alarm-type-required": "Typ alarmu jest wymagany.", + "alarm-type-unique": "Typ alarmu musi być unikalny w ramach reguł alarmowych profilu urządzenia.", + "alarm-type-max-length": "Typ alarmu powinien być mniejszy niż 256", + "create-alarm-pattern": "Tworzyć {{alarmType}} alarm", + "create-alarm-rules": "Utwórz reguły alarmowe", + "no-create-alarm-rules": "Nie skonfigurowano warunków tworzenia", + "add-create-alarm-rule-prompt": "Dodaj regułę tworzenia alarmu", + "clear-alarm-rule": "Wyczyść regułę alarmową", + "no-clear-alarm-rule": "Nie skonfigurowano jasnego warunku", + "add-create-alarm-rule": "Dodaj warunek utworzenia", + "add-clear-alarm-rule": "Dodaj jasny warunek", + "select-alarm-severity": "Wybierz wagę alarmu", + "alarm-severity-required": "Waga alarmu jest wymagana.", + "condition-duration": "Czas trwania warunku", + "condition-duration-value": "Wartość czasu trwania", + "condition-duration-time-unit": "Jednostka czasu", + "condition-duration-value-range": "Wartość czasu trwania powinna mieścić się w zakresie od 1 do 2147483647.", + "condition-duration-value-pattern": "Wartość czasu trwania powinna być liczbami całkowitymi.", + "condition-duration-value-required": "Wartość czasu trwania jest wymagana.", + "condition-duration-time-unit-required": "Jednostka czasu jest wymagana.", + "advanced-settings": "Zaawansowane ustawienia", + "alarm-rule-details": "Szczegóły", + "alarm-rule-details-hint": "Wskazówka: użyj ${NazwaKlucza} w celu zastąpienia wartości atrybutu lub kluczy telemetrycznych używanych w warunku reguły alarmowej.", + "add-alarm-rule-details": "Dodaj szczegóły", + "alarm-rule-mobile-dashboard": "Mobilny panel", + "alarm-rule-mobile-dashboard-hint": "Używany przez aplikację mobilną jako panel ze szczegółami alarmów", + "alarm-rule-no-mobile-dashboard": "Nie wybrano żadnego panelu", + "propagate-alarm": "Propaguj alarm do powiązanych obiektów", + "alarm-rule-relation-types-list": "Typy relacji do propagowania", + "alarm-rule-relation-types-list-hint": "Jeśli nie wybrano opcji Propaguj typy relacji, alarmy będą propagowane bez filtrowania według typu relacji.", + "propagate-alarm-to-owner": "Prześlij alarm do właściciela obiektu (Klienta lub Najemcy)", + "propagate-alarm-to-owner-hierarchy": "Propaguj alarm w hierarchii właścicieli jednostek", + "propagate-alarm-to-tenant": "Przekaż alarm do Najemcy", + "alarm-details": "Szczegóły alarmu", + "alarm-rule-condition": "Warunek reguły alarmowej", + "enter-alarm-rule-condition-prompt": "Dodaj warunek reguły alarmowej", + "edit-alarm-rule-condition": "Edytuj warunek reguły alarmowej", + "device-provisioning": "Udostępnianie urządzeń", + "provision-strategy": "Strategia zaopatrzenia", + "provision-strategy-required": "Strategia świadczenia usług jest wymagana.", + "provision-strategy-disabled": "Wyłączona", + "provision-strategy-created-new": "Zezwalaj na tworzenie nowych urządzeń", + "provision-strategy-check-pre-provisioned": "Sprawdź, czy urządzenia są wstępnie obsługiwane", + "provision-device-key": "Udostępnij klucz urządzenia", + "provision-device-key-required": "Klucz urządzenia udostępniającego jest wymagany.", + "copy-provision-key": "Skopiuj klucz świadczenia", + "provision-key-copied-message": "Klucz udostępniania został skopiowany do schowka", + "provision-device-secret": "Udostępnij sekret urządzenia", + "provision-device-secret-required": "Klucz tajny urządzenia do udostępniania jest wymagany.", + "copy-provision-secret": "Skopiuj tajemnicę świadczenia", + "provision-secret-copied-message": "Sekret świadczenia został skopiowany do schowka", + "provision-strategy-x509": { + "certificate-chain": "Łańcuch certyfikatów X509", + "certificate-chain-hint": "Strategia certyfikatów X.509 służy do udostępniania urządzeniom certyfikatów klienta w dwukierunkowej komunikacji TLS.", + "allow-create-new-devices": "Twórz nowe urządzenia", + "allow-create-new-devices-hint": "Jeśli wybrane zostaną utworzone nowe urządzenia, a certyfikat klienta będzie używany jako dane uwierzytelniające urządzenia.", + "certificate-value": "Certyfikat w formacie PEM", + "certificate-value-required": "Certyfikat w formacie PEM jest wymagany", + "cn-regex-variable": "Zmienna wyrażenia regularnego CN", + "cn-regex-variable-required": "Zmienna wyrażenia regularnego CN jest wymagana", + "cn-regex-variable-hint": "Wymagane do pobrania nazwy urządzenia z nazwy zwyczajowej certyfikatu X509 urządzenia." }, - "condition":"Warunek", - "condition-type":"Typ warunku", - "condition-type-simple":"Prosty", - "condition-type-duration":"Czas trwania", - "condition-during":"Podczas {{during}}", - "condition-during-dynamic":"Podczas \"{{attribute}}\" ({{during}})", - "condition-type-repeating":"Powtarzający się", - "condition-type-required":"Wymagany jest typ warunku.", - "condition-repeating-value":"Liczba zdarzeń", - "condition-repeating-value-range":"Liczba zdarzeń powinna mieścić się w zakresie od 1 do 2147483647.", - "condition-repeating-value-pattern":"Liczba zdarzeń powinna być liczbą całkowitą.", - "condition-repeating-value-required":"Wymagana jest liczba zdarzeń.", - "condition-repeat-times":"Powtarza się { count, plural, =1 {1 raz} other {# razy} }", - "condition-repeat-times-dynamic":"Powtarza się \"{attribute}\" ({ count, plural, =1 {1 raz} other {# razy} })", - "schedule-type":"Typ harmonogramu", - "schedule-type-required":"Wymagany jest typ harmonogramu.", - "schedule":"Harmonogram", - "edit-schedule":"Edytuj harmonogram alarmu", - "schedule-any-time":"Aktywny przez cały czas", - "schedule-specific-time":"Aktywny o określonej godzinie", - "schedule-custom":"Niestandardowy", - "schedule-day":{ - "monday":"Poniedziałek", - "tuesday":"Wtorek", - "wednesday":"Środa", - "thursday":"Czwartek", - "friday":"Piątek", - "saturday":"Sobota", - "sunday":"Niedziela" + "condition": "Stan", + "condition-type": "Typ warunku", + "condition-type-simple": "Prosty", + "condition-type-duration": "Czas trwania", + "condition-during": "Podczas {{during}}", + "condition-during-dynamic": "Podczas \"{{ attribute }}\" ({{during}})", + "condition-type-repeating": "Powtórzenie", + "condition-type-required": "Typ warunku jest wymagany.", + "condition-repeating-value": "Liczba wydarzeń", + "condition-repeating-value-range": "Liczba zdarzeń powinna mieścić się w zakresie od 1 do 2147483647.", + "condition-repeating-value-pattern": "Liczba zdarzeń powinna być liczbami całkowitymi.", + "condition-repeating-value-required": "Liczba zdarzeń jest wymagana.", + "condition-repeat-times": "Powtarza się {count, plural, =1 {1 raz} other {# razy} }", + "condition-repeat-times-dynamic": "Powtarza „{ atrybut }” ({ count, plural, =1 {1 raz} other {# razy} })", + "schedule-type": "Typ harmonogramu", + "schedule-type-required": "Typ harmonogramu jest wymagany.", + "schedule": "Harmonogram", + "edit-schedule": "Edytuj harmonogram alarmów", + "schedule-any-time": "Cały czas aktywny", + "schedule-specific-time": "Aktywny w określonym czasie", + "schedule-custom": "Własny", + "schedule-day": { + "monday": "Poniedziałek", + "tuesday": "Wtorek", + "wednesday": "Środa", + "thursday": "Czwartek", + "friday": "Piątek", + "saturday": "Sobota", + "sunday": "Niedziela" }, - "schedule-days":"Dni", - "schedule-time":"Czas", - "schedule-time-from":"Od", - "schedule-time-to":"Do", - "schedule-days-of-week-required":"Należy wybrać przynajmniej jeden dzień tygodnia.", - "create-device-profile":"Utwórz nowy profil urządzenia", - "import":"Importuj profil urządzenia", - "export":"Eksportuj profil urządzenia", - "export-failed-error":"Nie można wyeksportować profilu urządzenia: {{error}}", - "device-profile-file":"Plik profilu urządzenia", - "invalid-device-profile-file-error":"Nie można zaimportować profilu urządzenia: Nieprawidłowa struktura danych profilu urządzenia.", - "power-saving-mode":"Tryb oszczędzania energii", - "power-saving-mode-type":{ - "default":"Użyj trybu oszczędzania energii profilu urządzenia", - "psm":"Tryb oszczędzania energii (PSM)", - "drx":"Przerwane odbieranie (DRX)", - "edrx":"Rozszerzone przerwane odbieranie (eDRX)" + "schedule-days": "Dni", + "schedule-time": "Czas", + "schedule-time-from": "Z", + "schedule-time-to": "Do", + "schedule-days-of-week-required": "Należy wybrać przynajmniej jeden dzień tygodnia.", + "create-device-profile": "Utwórz nowy profil urządzenia", + "import": "Importuj profil urządzenia", + "export": "Eksportuj profil urządzenia", + "export-failed-error": "Nie można wyeksportować profilu urządzenia: {{error}}", + "device-profile-file": "Plik profilu urządzenia", + "invalid-device-profile-file-error": "Nie można zaimportować profilu urządzenia: nieprawidłowa struktura danych profilu urządzenia.", + "power-saving-mode": "Tryb oszczędzania energii", + "power-saving-mode-type": { + "default": "Użyj trybu oszczędzania energii w profilu urządzenia", + "psm": "Tryb oszczędzania energii (PSM)", + "drx": "Odbiór nieciągły (DRX)", + "edrx": "Rozszerzony odbiór nieciągły (eDRX)" }, - "edrx-cycle":"Cykl eDRX", - "edrx-cycle-required":"Cykl eDRX jest wymagany.", - "edrx-cycle-pattern":"Cykl eDRX musi być liczbą całkowitą dodatnią.", - "edrx-cycle-min":"Minimalna liczba cykli eDRX to {{ min }} sekundy.", - "paging-transmission-window":"Okno transmisji strony", - "paging-transmission-window-required":"Okno transmisji strony jest wymagane.", - "paging-transmission-window-pattern":"Okno transmisji strony musi być liczbą całkowitą dodatnią.", - "paging-transmission-window-min":"Minimalna liczba okna transmisji strony to {{ min }} sekundy.", - "psm-activity-timer":"Licznik aktywności PSM", - "psm-activity-timer-required":"Licznik aktywności PSM jest wymagany.", - "psm-activity-timer-pattern":"Licznik aktywności PSM musi być liczbą całkowitą dodatnią.", - "psm-activity-timer-min":"Minimalna liczba licznika aktywności PSM to {{ min }} sekundy.", - "lwm2m":{ - "object-list":"Lista obiektów", - "object-list-empty":"Brak wybranych obiektów.", - "no-objects-found":"Nie znaleziono obiektów.", - "no-objects-matching":"Nie znaleziono obiektów pasujących do '{{object}}'.", - "model-tab":"Model LWM2M", - "add-new-instances":"Dodaj nowe instancje", - "instances-list":"Lista instancji", - "instances-list-required":"Lista instancji jest wymagana.", - "instance-id-pattern":"Identyfikator instancji musi być liczbą całkowitą dodatnią.", - "instance-id-max":"Maksymalna wartość identyfikatora instancji to {{max}}.", - "instance":"Instancja", - "resource-label":"#ID Nazwa zasobu", - "observe-label":"Obserwuj", - "attribute-label":"Atrybut", - "telemetry-label":"Telemetria", - "edit-observe-select":"Aby edytować obserwację, wybierz telemetrię lub atrybut", - "edit-attributes-select":"Aby edytować atrybuty, wybierz telemetrię lub atrybut", - "no-attributes-set":"Brak ustawionych atrybutów", - "key-name":"Nazwa klucza", - "key-name-required":"Nazwa klucza jest wymagana", - "attribute-name":"Nazwa atrybutu", - "attribute-name-required":"Nazwa atrybutu jest wymagana.", - "attribute-value":"Wartość atrybutu", - "attribute-value-required":"Wartość atrybutu jest wymagana.", - "attribute-value-pattern":"Wartość atrybutu musi być liczbą całkowitą dodatnią.", - "edit-attributes":"Edytuj atrybuty: {{ name }}", - "view-attributes":"Wyświetl atrybuty: {{ name }}", - "add-attribute":"Dodaj atrybut", - "edit-attribute":"Edytuj atrybut", - "view-attribute":"Wyświetl atrybut", - "remove-attribute":"Usuń atrybut", - "delete-server-text":"Bądź ostrożny, po potwierdzeniu konfiguracja serwera stanie się nieodwracalna.", - "delete-server-title":"Czy na pewno chcesz usunąć serwer?", - "mode":"Tryb konfiguracji zabezpieczeń", - "bootstrap-tab":"Bootstrap", - "bootstrap-server-legend":"Serwer Bootstrap (ShortId...)", - "lwm2m-server-legend":"Serwer LwM2M (ShortId...)", - "server":"Serwer", - "short-id":"Krótki identyfikator serwera", - "short-id-tooltip":"Krótki identyfikator serwera. Używany jako łącze do powiązania instancji obiektu serwera.\nTen identyfikator jednoznacznie identyfikuje każdy serwer LwM2M skonfigurowany dla klienta LwM2M.\nZasób MUSI być ustawiony, gdy Zasób Bootstrap-Server ma wartość „false”.\nWartości ID:0 i ID:65535 NIE MOGĄ być używane do identyfikacji serwera LwM2M.", - "short-id-required":"Krótki identyfikator serwera jest wymagany.", - "short-id-range":"Krótki identyfikator serwera powinien mieć wartość z zakresu od 1 do 65534.", - "short-id-pattern":"Krótki identyfikator serwera musi być liczbą całkowitą dodatnią.", - "lifetime":"Czas życia rejestracji klienta", - "lifetime-required":"Czas życia rejestracji klienta jest wymagany.", - "lifetime-pattern":"Czas życia rejestracji klienta musi być liczbą całkowitą dodatnią.", - "default-min-period":"Minimalny okres między dwoma powiadomieniami (s)", - "default-min-period-tooltip":"Domyślna wartość, jaką klient LwM2M powinien używać dla Minimalnego Okresu Obserwacji w przypadku braku uwzględnienia tego parametru w Obserwacji.", - "default-min-period-required":"Minimalny okres jest wymagany.", - "default-min-period-pattern":"Minimalny okres musi być liczbą całkowitą dodatnią.", - "notification-storing":"Przechowywanie powiadomień przy wyłączonym lub offline", - "binding":"Powiązanie", - "binding-type":{ - "u":"U: Klient jest dostępny za pośrednictwem powiązania UDP w dowolnym czasie.", - "m":"M: Klient jest dostępny za pośrednictwem powiązania MQTT w dowolnym czasie.", - "h":"H: Klient jest dostępny za pośrednictwem powiązania HTTP w dowolnym czasie.", - "t":"T: Klient jest dostępny za pośrednictwem powiązania TCP w dowolnym czasie.", - "s":"S: Klient jest dostępny za pośrednictwem powiązania SMS w dowolnym czasie.", - "n":"N: Klient MUSI wysłać odpowiedź na takie żądanie za pośrednictwem powiązania Non-IP (jest obsługiwane od LWM2M 1.1).", - "uq":"UQ: Połączenie UDP w trybie kolejki (nie jest obsługiwane od LWM2M 1.1)", - "uqs":"UQS: zarówno połączenia UDP, jak i SMS aktywne; UDP w trybie kolejki, SMS w trybie standardowym (nie jest obsługiwane od LWM2M 1.1)", - "tq":"TQ: Połączenie TCP w trybie kolejki (nie jest obsługiwane od LWM2M 1.1)", - "tqs":"TQS: zarówno połączenia TCP, jak i SMS aktywne; TCP w trybie kolejki, SMS w trybie standardowym (nie jest obsługiwane od LWM2M 1.1)", - "sq":"SQ: Połączenie SMS w trybie kolejki (nie jest obsługiwane od LWM2M 1.1)" + "edrx-cycle": "Cykl eDRX", + "edrx-cycle-required": "Cykl eDRX jest wymagany.", + "edrx-cycle-pattern": "Cykl eDRX musi być dodatnią liczbą całkowitą.", + "edrx-cycle-min": "Minimalna liczba cykli eDRX wynosi {{ min }} sekundy.", + "paging-transmission-window": "Okno transmisji stronicowania", + "paging-transmission-window-required": "Okno transmisji stronicowania jest wymagane.", + "paging-transmission-window-pattern": "Okno transmisji stronicowania musi być dodatnią liczbą całkowitą.", + "paging-transmission-window-min": "Minimalna liczba okien transmisji przywoławczej wynosi {{ min }} sekundy.", + "psm-activity-timer": "Licznik aktywności PSM", + "psm-activity-timer-required": "Licznik czasu aktywności PSM jest wymagany.", + "psm-activity-timer-pattern": "Licznik czasu aktywności PSM musi być dodatnią liczbą całkowitą.", + "psm-activity-timer-min": "Minimalna liczba timerów aktywności PSM wynosi {{ min }} sekundy.", + "lwm2m": { + "object-list": "Lista obiektów", + "object-list-empty": "Nie wybrano żadnych obiektów.", + "no-objects-found": "Nie znaleziono żadnych obiektów.", + "no-objects-matching": "Nie znaleziono obiektów pasujących do '{{object}}'", + "model-tab": "Model LWM2M", + "add-new-instances": "Dodaj nowe instancje", + "instances-list": "Lista instancji", + "instances-list-required": "Lista instancji jest wymagana.", + "instance-id-pattern": "Identyfikator instancji musi być dodatnią liczbą całkowitą.", + "instance-id-max": "Maksymalna wartość identyfikatora instancji {{max}}.", + "instance": "Instancja", + "resource-label": "Nazwa biblioteki #ID", + "observe-label": "Obserwuj", + "attribute-label": "Atrybut", + "telemetry-label": "Telemetria", + "edit-observe-select": "Aby edytować obserwację, wybierz telemetrię lub atrybut", + "edit-attributes-select": "Aby edytować atrybuty, wybierz telemetrię lub atrybut", + "no-attributes-set": "Nie ustawiono żadnych atrybutów", + "key-name": "Nazwa klucza", + "key-name-required": "Nazwa klucza jest wymagana", + "attribute-name": "Atrybut nazwy", + "attribute-name-required": "Atrybut nazwy jest wymagany.", + "attribute-value": "Wartość atrybutu", + "attribute-value-required": "Wartość atrybutu jest wymagana.", + "attribute-value-pattern": "Wartość atrybutu musi być dodatnią liczbą całkowitą.", + "edit-attributes": "Edytuj atrybuty: {{ name }}", + "view-attributes": "Zobacz atrybuty: {{ name }}", + "add-attribute": "Dodaj atrybut", + "edit-attribute": "Edytuj atrybut", + "view-attribute": "Zobacz atrybut", + "remove-attribute": "Usuń atrybut", + "delete-server-text": "Bądź ostrożny, po potwierdzeniu konfiguracja serwera stanie się niemożliwa do przywrócenia.", + "delete-server-title": "Czy na pewno chcesz usunąć serwer?", + "mode": "Tryb konfiguracji zabezpieczeń", + "bootstrap-tab": "Bootstrap", + "bootstrap-server-legend": "Serwer startowy (ShortId...)", + "lwm2m-server-legend": "Serwer LwM2M (ShortId...)", + "server": "serwer", + "short-id": "Krótki identyfikator serwera", + "short-id-tooltip": "Krótki identyfikator serwera. ", + "short-id-required": "Krótki identyfikator serwera jest wymagany.", + "short-id-range": "Krótki identyfikator serwera powinien mieścić się w zakresie od 1 do 65534.", + "short-id-pattern": "Krótki identyfikator serwera musi być dodatnią liczbą całkowitą.", + "lifetime": "Okres rejestracji klienta", + "lifetime-required": "Okres rejestracji klienta jest wymagany.", + "lifetime-pattern": "Okres istnienia rejestracji klienta musi być dodatnią liczbą całkowitą.", + "default-min-period": "Minimalny okres między dwoma powiadomieniami", + "default-min-period-tooltip": "Wartość domyślna, którą Klient LwM2M powinien zastosować dla Minimalnego Okresu Obserwacji w przypadku braku tego parametru w Obserwacji.", + "default-min-period-required": "Minimalny okres jest wymagany.", + "default-min-period-pattern": "Minimalny okres musi być dodatnią liczbą całkowitą.", + "notification-storing": "Przechowywanie powiadomień, gdy jest wyłączone lub offline", + "binding": "Wiążący", + "binding-type": { + "u": "U: Klient jest dostępny w dowolnym momencie poprzez powiązanie UDP.", + "m": "M: Klient jest dostępny w dowolnym momencie poprzez powiązanie MQTT.", + "h": "H: Klient jest dostępny w dowolnym momencie poprzez powiązanie HTTP.", + "t": "T: Klient jest dostępny w dowolnym momencie poprzez powiązanie TCP.", + "s": "S: Klient jest dostępny w każdej chwili za pośrednictwem wiadomości SMS.", + "n": "N: Klient MUSI wysłać odpowiedź na takie żądanie poprzez powiązanie inne niż IP (jest obsługiwane od wersji LWM2M 1.1).", + "uq": "UQ: połączenie UDP w trybie kolejki (nie jest obsługiwane od wersji LWM2M 1.1)", + "uqs": "UQS: aktywne połączenia UDP i SMS; ", + "tq": "TQ: połączenie TCP w trybie kolejki (nie jest obsługiwane od wersji LWM2M 1.1)", + "tqs": "TQS: aktywne połączenia TCP i SMS; ", + "sq": "SQ: połączenie SMS w trybie kolejki (nie jest obsługiwane od wersji LWM2M 1.1)" }, - "binding-tooltip":"To jest lista w zasobie \"binding\" obiektu serwera LwM2M - /1/x/7. Wskazuje obsługiwane tryby powiązań w kliencie LwM2M. Ta wartość POWINNA być taka sama jak wartość w zasobie \"Supported Binding and Modes\" w obiekcie urządzenia (/3/0/16). Chociaż obsługiwane są różne środki transportu, tylko jedno powiązanie transportowe może być używane podczas całej sesji transportowej. Na przykład, gdy obsługiwane są zarówno UDP, jak i SMS, klient LwM2M i serwer LwM2M mogą wybrać komunikację zarówno przez UDP, jak i SMS przez całą sesję transportową.", - "bootstrap-server":"Serwer rozruchowy", - "lwm2m-server":"Serwer LwM2M", - "include-bootstrap-server":"Załącz aktualizacje serwera rozruchowego", - "bootstrap-update-title":"Masz już skonfigurowany serwer rozruchowy. Czy na pewno chcesz wyłączyć aktualizacje?", - "bootstrap-update-text":"Bądź ostrożny, po potwierdzeniu konfiguracja danych serwera rozruchowego stanie się nieodwracalna.", - "server-host":"Host", - "server-host-required":"Host jest wymagany.", - "server-port":"Port", - "server-port-required":"Port jest wymagany.", - "server-port-pattern":"Port musi być liczbą całkowitą dodatnią.", - "server-port-range":"Port powinien być w zakresie od 1 do 65535.", - "server-public-key":"Klucz publiczny serwera", - "server-public-key-required":"Klucz publiczny serwera jest wymagany.", - "client-hold-off-time":"Czas wstrzymania klienta", - "client-hold-off-time-required":"Czas wstrzymania klienta jest wymagany.", - "client-hold-off-time-pattern":"Czas wstrzymania klienta musi być liczbą całkowitą dodatnią.", - "client-hold-off-time-tooltip":"Czas wstrzymania klienta do użycia tylko z serwerem rozruchowym", - "account-after-timeout":"Konto po przekroczeniu czasu oczekiwania", - "account-after-timeout-required":"Konto po przekroczeniu czasu oczekiwania jest wymagane.", - "account-after-timeout-pattern":"Konto po przekroczeniu czasu oczekiwania musi być liczbą całkowitą dodatnią.", - "account-after-timeout-tooltip":"Wartość konta po przekroczeniu czasu oczekiwania podana przez ten zasób serwera rozruchowego.", - "server-type":"Typ serwera", - "add-new-server-title":"Dodaj nową konfigurację serwera", - "add-server-config":"Dodaj konfigurację serwera", - "add-lwm2m-server-config":"Dodaj serwer LwM2M", - "no-config-servers":"Brak skonfigurowanych serwerów", - "others-tab":"Inne ustawienia", - "client-strategy":"Strategia klienta podczas łączenia", - "client-strategy-label":"Strategia", - "client-strategy-only-observe":"Tylko żądanie obserwacji do klienta po połączeniu początkowym", - "client-strategy-read-all":"Odczytaj wszystkie zasoby i żądanie obserwacji do klienta po rejestracji", - "fw-update":"Aktualizacja oprogramowania", - "fw-update-strategy":"Strategia aktualizacji firmware'u", - "fw-update-strategy-data":"Przesuń aktualizację firmware'u jako plik binarny za pomocą Obiektu 19 i Zasobu 0 (Dane)", - "fw-update-strategy-package":"Przesuń aktualizację firmware'u jako plik binarny za pomocą Obiektu 5 i Zasobu 0 (Pakiet)", - "fw-update-strategy-package-uri":"Automatycznie generuj unikalny adres URL CoAP do pobrania pakietu i przesyłaj aktualizację firmware'u jako Obiekt 5 i Zasób 1 (Pakiet URI)", - "sw-update":"Aktualizacja oprogramowania", - "sw-update-strategy":"Strategia aktualizacji oprogramowania", - "sw-update-strategy-package":"Przesuń plik binarny za pomocą Obiektu 9 i Zasobu 2 (Pakiet)", - "sw-update-strategy-package-uri":"Automatycznie generuj unikalny adres URL CoAP do pobrania pakietu i przesyłaj aktualizację oprogramowania za pomocą Obiektu 9 i Zasób 3 (Pakiet URI)", - "fw-update-resource":"Zasób CoAP aktualizacji firmware'u", - "fw-update-resource-required":"Zasób CoAP aktualizacji firmware'u jest wymagany.", - "sw-update-resource":"Zasób CoAP aktualizacji oprogramowania", - "sw-update-resource-required":"Zasób CoAP aktualizacji oprogramowania jest wymagany.", - "config-json-tab":"Profil konfiguracji urządzenia Json", - "attributes-name":{ - "min-period":"Minimalny okres", - "max-period":"Maksymalny okres", - "greater-than":"Większe niż", - "less-than":"Mniejsze niż", - "step":"Krok", - "min-evaluation-period":"Minimalny okres oceny", - "max-evaluation-period":"Maksymalny okres oceny" - }, - "default-object-id": "Domyślna wersja obiektu (atrybut)", - "default-object-id-ver": { - "v1-0": "\"1.0\" to wartość wersji obiektu, jeśli wersja obiektu jest pusta.", - "v1-1": "\"1.1\" to wartość wersji obiektu, jeśli wersja obiektu jest pusta." + "binding-tooltip": "To jest lista w zasobie „wiążącym” obiektu serwera LwM2M - /1/x/7.\n", + "bootstrap-server": "Serwer startowy", + "lwm2m-server": "Serwer LwM2M", + "include-bootstrap-server": "Dołącz aktualizacje serwera Bootstrap", + "bootstrap-update-title": "Skonfigurowałeś już serwer Bootstrap. ", + "bootstrap-update-text": "Bądź ostrożny, po potwierdzeniu danych konfiguracyjnych serwera Bootstrap nie będzie można odzyskać.", + "server-host": "Host", + "server-host-required": "Host jest wymagany.", + "server-port": "Port", + "server-port-required": "Port jest wymagany.", + "server-port-pattern": "Port musi być dodatnią liczbą całkowitą.", + "server-port-range": "Port powinien należeć do zakresu od 1 do 65535.", + "server-public-key": "Klucz publiczny serwera", + "server-public-key-required": "Klucz publiczny serwera jest wymagany.", + "client-hold-off-time": "Wstrzymaj czas", + "client-hold-off-time-required": "Czas wstrzymania jest wymagany.", + "client-hold-off-time-pattern": "Czas wstrzymania musi być dodatnią liczbą całkowitą.", + "client-hold-off-time-tooltip": "Czas wstrzymania klienta do użytku wyłącznie z serwerem Bootstrap", + "account-after-timeout": "Account after the timeout", + "account-after-timeout-required": "Account after the timeout jest wymagane.", + "account-after-timeout-pattern": "Account after the timeout musi być dodatnią liczbą całkowitą.", + "account-after-timeout-tooltip": "Bootstrap-Server Account after the timeout value given by this resource.", + "server-type": "Rodzaj serwera", + "add-new-server-title": "Dodaj nową konfigurację serwera", + "add-server-config": "Dodaj konfigurację serwera", + "add-lwm2m-server-config": "Dodaj serwer LwM2M", + "no-config-servers": "Nie skonfigurowano żadnych serwerów", + "others-tab": "Inne ustawienia", + "client-strategy": "Strategia klienta podczas łączenia", + "client-strategy-label": "Strategia", + "client-strategy-only-observe": "Obserwuj żądanie skierowane do klienta dopiero po pierwszym połączeniu", + "client-strategy-read-all": "Przeczytaj wszystkie zasoby", + "fw-update": "Aktualizacja firmware", + "fw-update-strategy": "Strategia aktualizacji oprogramowania sprzętowego", + "fw-update-strategy-data": "Wypchnij aktualizację oprogramowania sprzętowego jako plik binarny przy użyciu obiektu 19 i zasobu 0 (dane)", + "fw-update-strategy-package": "Wypchnij aktualizację oprogramowania sprzętowego jako plik binarny przy użyciu obiektu 5 i zasobu 0 (pakiet)", + "fw-update-strategy-package-uri": "Automatycznie wygeneruj unikalny adres URL CoAP, aby pobrać pakiet i przesłać aktualizację oprogramowania sprzętowego jako obiekt 5 i zasób 1 (identyfikator URI pakietu)", + "sw-update": "Aktualizacja oprogramowania", + "sw-update-strategy": "Strategia aktualizacji oprogramowania", + "sw-update-strategy-package": "Wypchnij plik binarny przy użyciu Obiektu 9 i Zasobu 2 (pakiet)", + "sw-update-strategy-package-uri": "Automatycznie wygeneruj unikalny adres URL CoAP, aby pobrać pakiet i przesłać aktualizację oprogramowania przy użyciu Obiektu 9 i Zasobu 3 (URI pakietu)", + "fw-update-resource": "Zasób aktualizacji oprogramowania sprzętowego CoAP", + "fw-update-resource-required": "Zasób aktualizacji oprogramowania sprzętowego CoAP jest wymagany.", + "sw-update-resource": "Zasób aktualizacji oprogramowania CoAP", + "sw-update-resource-required": "Zasób aktualizacji oprogramowania CoAP jest wymagany.", + "config-json-tab": "Urządzenie z profilem konfiguracji Json", + "attributes-name": { + "min-period": "Minimalny okres", + "max-period": "Maksymalny okres", + "greater-than": "Lepszy niż", + "less-than": "Mniej niż", + "step": "Krok", + "min-evaluation-period": "Minimalny okres oceny", + "max-evaluation-period": "Maksymalny okres oceny" } }, - "snmp":{ - "add-communication-config":"Dodaj konfigurację komunikacji", - "add-mapping":"Dodaj mapowanie", - "authentication-passphrase":"Hasło uwierzytelniania", - "authentication-passphrase-required":"Wymagane hasło uwierzytelniania.", - "authentication-protocol":"Protokół uwierzytelniania", - "authentication-protocol-required":"Wymagany protokół uwierzytelniania.", - "communication-configs":"Konfiguracje komunikacji", - "community":"Ciąg społeczności", - "community-required":"Wymagany ciąg społeczności.", - "context-name":"Nazwa kontekstu", - "data-key":"Klucz danych", - "data-key-required":"Wymagany klucz danych.", - "data-type":"Typ danych", - "data-type-required":"Wymagany typ danych.", - "engine-id":"ID silnika", - "host":"Host", - "host-required":"Wymagany host.", - "oid":"OID", - "oid-pattern":"Nieprawidłowy format OID.", - "oid-required":"Wymagany OID.", - "please-add-communication-config":"Proszę dodać konfigurację komunikacji", - "please-add-mapping-config":"Proszę dodać konfigurację mapowania", - "port":"Port", - "port-format":"Nieprawidłowy format portu.", - "port-required":"Wymagany port.", - "privacy-passphrase":"Hasło prywatności", - "privacy-passphrase-required":"Wymagane hasło prywatności.", - "privacy-protocol":"Protokół prywatności", - "privacy-protocol-required":"Wymagany protokół prywatności.", - "protocol-version":"Wersja protokołu", - "protocol-version-required":"Wymagana wersja protokołu.", - "querying-frequency":"Częstotliwość zapytań, ms", - "querying-frequency-invalid-format":"Częstotliwość zapytań musi być liczbą całkowitą dodatnią.", - "querying-frequency-required":"Wymagana częstotliwość zapytań.", - "retries":"Ponowienia", - "retries-invalid-format":"Liczba ponowień musi być liczbą całkowitą dodatnią.", - "retries-required":"Wymagane ponowienia.", - "scope":"Zakres", - "scope-required":"Wymagany zakres.", - "security-name":"Nazwa zabezpieczeń", - "security-name-required":"Wymagana nazwa zabezpieczeń.", - "timeout-ms":"Limit czasu, ms", - "timeout-ms-invalid-format":"Limit czasu musi być liczbą całkowitą dodatnią.", - "timeout-ms-required":"Wymagany limit czasu.", - "user-name":"Nazwa użytkownika", - "user-name-required":"Wymagana nazwa użytkownika." + "snmp": { + "add-communication-config": "Dodaj konfigurację komunikacji", + "add-mapping": "Dodaj mapowanie", + "authentication-passphrase": "Hasło uwierzytelniające", + "authentication-passphrase-required": "Hasło uwierzytelniające jest wymagane.", + "authentication-protocol": "Protokół uwierzytelnienia", + "authentication-protocol-required": "Protokół uwierzytelniania jest wymagany.", + "communication-configs": "Konfiguracje komunikacji", + "community": "Community string", + "community-required": "Community string jest wymagane.", + "context-name": "Nazwa kontekstu", + "data-key": "Klucz danych", + "data-key-required": "Klucz danych jest wymagany.", + "data-type": "Typ danych", + "data-type-required": "Typ danych jest wymagany.", + "engine-id": "Identyfikator silnika", + "host": "Gospodarz", + "host-required": "Host jest wymagany.", + "oid": "OID", + "oid-pattern": "Nieprawidłowy format OID.", + "oid-required": "OID jest wymagany.", + "please-add-communication-config": "Proszę dodać konfigurację komunikacji", + "please-add-mapping-config": "Proszę dodać konfigurację mapowania", + "port": "Port", + "port-format": "Nieprawidłowy format portu.", + "port-required": "Port jest wymagany.", + "privacy-passphrase": "Hasło prywatności", + "privacy-passphrase-required": "Hasło prywatności jest wymagane.", + "privacy-protocol": "Protokół prywatności", + "privacy-protocol-required": "Protokół prywatności jest wymagany.", + "protocol-version": "Wersja protokołu", + "protocol-version-required": "Wersja protokołu jest wymagana.", + "querying-frequency": "Częstotliwość zapytań, ms", + "querying-frequency-invalid-format": "Częstotliwość zapytań musi być dodatnią liczbą całkowitą.", + "querying-frequency-required": "Częstotliwość zapytań jest wymagana.", + "retries": "Liczba ponownych prób", + "retries-invalid-format": "Liczba ponownych prób musi być dodatnią liczbą całkowitą.", + "retries-required": "Liczba ponownych prób jest wymagana.", + "scope": "Zakres", + "scope-required": "Zakres jest wymagany.", + "security-name": "Nazwa bezpieczeństwa", + "security-name-required": "Nazwa bezpieczeństwa jest wymagana.", + "timeout-ms": "Limit czasu, ms", + "timeout-ms-invalid-format": "Limit czasu musi być dodatnią liczbą całkowitą.", + "timeout-ms-required": "Limit czasu jest wymagany.", + "user-name": "Nazwa użytkownika", + "user-name-required": "Nazwa użytkownika jest wymagana." + }, + "new-device-profile-name": "Nazwa profilu urządzenia", + "new-device-profile-name-required": "Nazwa profilu urządzenia jest wymagana." + }, + "dialog": { + "close": "Zamknij okno dialogowe", + "error-message-title": "Komunikat o błędzie:", + "error-details-title": "Szczegóły błędu" + }, + "direction": { + "column": "Kolumna", + "row": "Wiersz" + }, + "edge": { + "all": "Wszystko", + "all-edges": "Wszystkie Edge", + "groups": "Grupy", + "shared": "Wspólny", + "edge": "Edge", + "edge-instances": "Instancje Edge", + "instances": "Instancje", + "edge-file": "Plik Edge", + "name-max-length": "Nazwa powinna być mniejsza niż 256", + "label-max-length": "Etykieta powinna być mniejsza niż 256", + "type-max-length": "Typ powinien być mniejszy niż 256", + "management": "Zarządzanie Edge", + "no-edges-matching": "Nie znaleziono Edge pasujących do '{{entity}}'.", + "add": "Dodaj Edge", + "no-edges-text": "Nie znaleziono Edge", + "edge-details": "Szczegóły Edge", + "add-edge-text": "Dodaj nowy Edge", + "delete": "Usuń Edge", + "delete-edge-title": "Czy na pewno chcesz usunąć Edge '{{edgeName}}'?", + "delete-edge-text": "Bądź ostrożny, po potwierdzeniu Edge i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-edges-title": "Czy na pewno chcesz usunąć {count, plural, =1 {1 Edge} other {# Edge} }?", + "delete-edges-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane Edgei zostaną usunięte, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "name": "Nazwa", + "name-starts-with": "Nazwa Edge zaczyna się od", + "name-required": "Nazwa jest wymagana.", + "edge-license-key": "Klucz licencyjny Edge", + "edge-license-key-required": "Klucz licencyjny Edge jest wymagany.", + "edge-license-key-max-length": "Klucz licencyjny Edge powinien być mniejszy niż 31", + "edge-license-key-hint": "WAŻNA UWAGA: domyślny klucz licencyjny Edge udostępniany wyłącznie w celach testowych.
Ten klucz jest aktywny tylko dla 30 dni po aktywacji. Funkcja White-labeling jest wyłączona.
Aby uzyskać klucz licencyjny, przejdź do strona z cenami i wybierz najlepszą opcję licencji dla swojego przypadku.", + "cloud-endpoint": "Punkt końcowy w chmurze", + "cloud-endpoint-required": "Punkt końcowy w chmurze jest wymagany.", + "cloud-endpoint-max-length": "Punkt końcowy chmury powinien być mniejszy niż 256", + "cloud-endpoint-hint": "Edge wymaga dostępu HTTP(s) do Cloud (ThingsBoard PE) w celu zweryfikowania klucza licencyjnego. Podaj adres URL chmury, z którą Edge może się połączyć.", + "description": "Opis", + "details": "Szczegóły", + "events": "Wydarzenia", + "copy-id": "Skopiuj identyfikator Edge", + "id-copied-message": "Identyfikator Edge został skopiowany do schowka", + "sync": "Synchronizuj Edge", + "edge-required": "Wymagany Edge", + "edge-type": "Typ Edge", + "edge-type-required": "Typ Edge jest wymagany.", + "event-action": "Akcja eventowa", + "entity-id": "Identyfikator obiektu", + "select-edge-type": "Wybierz typ Edge", + "assign-to-customer": "Przypisz do klienta", + "assign-to-customer-text": "Proszę wybrać klienta do przypisania Edge", + "assign-edge-to-customer": "Przypisz Edge do klienta", + "assign-edge-to-customer-text": "Prosimy o wybranie Edge do przypisania klientowi", + "assignedToCustomer": "Przypisany do klienta", + "edge-public": "Edge jest publiczny", + "assigned-to-customer": "Przypisane do: {{customerTitle}}", + "unassign-from-customer": "Usuń przypisanie od klienta", + "unassign-edge-title": "Czy na pewno chcesz usunąć przypisanie Edge '{{edgeName}}'?", + "unassign-edge-text": "Po potwierdzeniu Edge zostanie anulowana i nie będzie dostępna dla klienta.", + "unassign-edges-title": "Czy na pewno chcesz cofnąć przypisanie {count, plural, =1 {1 Edge} other {# Edge} }?", + "unassign-edges-text": "Po potwierdzeniu wszystkie wybrane Edge zostaną usunięte i nie będą dostępne dla klienta.", + "make-public": "Upublicznij Edge", + "make-public-edge-title": "Czy na pewno chcesz uczynić Edge {{edgeName}} publiczną?", + "make-public-edge-text": "Po potwierdzeniu urządzenie Edge i wszystkie jego dane zostaną upublicznione i dostępne dla innych.", + "make-private": "Ustaw Edge jako prywatny", + "public": "Publiczny", + "make-private-edge-title": "Czy na pewno chcesz uczynić Edge {{edgeName}} prywatną?", + "make-private-edge-text": "Po potwierdzeniu urządzenie Edge i wszystkie jego dane staną się prywatne i nie będą dostępne dla innych.", + "import": "Importuj Edge", + "install-connect-instructions": "zainstalować", + "install-connect-instructions-edge-created": "Edge created! Check Install & Connect Instructions", + "loading-edge-instructions": "Loading edge instructions...", + "label": "Etykieta", + "load-entity-error": "Nie udało się załadować danych. ", + "assign-new-edge": "Przypisz nowy Edge", + "unassign-from-edge": "Usuń przypisanie z Edge", + "edge-key": "Klucz Edge", + "copy-edge-key": "Skopiuj klucz Edge", + "edge-key-copied-message": "Klawisz Edge został skopiowany do schowka", + "edge-secret": "Sekret Edge", + "copy-edge-secret": "Skopiuj sekret Edge", + "edge-secret-copied-message": "Sekret Edge został skopiowany do schowka", + "manage-assets": "Zarządzaj zasobami", + "manage-devices": "Zarządzaj urządzeniami", + "manage-entity-views": "Zarządzaj widokami encji", + "manage-dashboards": "Zarządzaj panelami", + "manage-rulechains": "Zarządzaj łańcuchami reguł", + "assets": "Zasoby Edge", + "devices": "Urządzenia Edge", + "entity-views": "Widoki elementów Edge", + "dashboard": "Panel Edge", + "dashboards": "Panele Edge", + "rulechain-templates": "Szablony łańcucha reguł", + "edge-rulechain-templates": "Szablony łańcucha reguł Edge", + "converter-templates": "Szablony konwerterów", + "edge-converter-templates": "Szablony konwerterów Edge", + "integration-templates": "Szablony integracji", + "edge-integration-templates": "Szablony integracji Edge", + "rulechains": "Łańcuchy reguł Edge", + "integrations": "Integracje", + "search": "Szukaj Edge", + "selected-edges": "Wybrano {count, plural, =1 {1 Edge} other {# Edge} }", + "any-edge": "Dowolna Edge", + "no-edge-types-matching": "Nie znaleziono pasujących typów Edge '{{entitySubtype}}'", + "edge-type-list-empty": "Nie wybrano typów Edge.", + "edge-types": "Typy Edge", + "enter-edge-type": "Podaj typ Edge", + "deployed": "Deployed", + "pending": "Oczekujący", + "downlinks": "Linki w dół", + "no-downlinks-prompt": "Nie znaleziono żadnych łączy w dół", + "sync-process-started-successfully": "Proces synchronizacji rozpoczął się pomyślnie!", + "missing-related-rule-chains-title": "W Edge brakuje powiązanych łańcuchów reguł", + "missing-related-rule-chains-text": "Przypisane do łańcuchów reguł Edge używają węzłów reguł, które przekazują komunikaty do łańcuchów reguł, które nie są przypisane do tego Edge.

Lista brakujących łańcuchów reguł:
{{missingRuleChains}}", + "widget-datasource-error": "Ten widget obsługuje wyłącznie źródło danych encji EDGE", + "assign-to-edge": "Przypisz do Edge", + "assign-to-edge-title": "Przypisz grupy jednostek do Edge", + "manage-edge-user-groups": "Zarządzaj grupami użytkowników Edge", + "manage-edge-asset-groups": "Zarządzaj grupami zasobów Edge", + "manage-edge-device-groups": "Zarządzaj grupami urządzeń Edge", + "manage-edge-entity-view-groups": "Zarządzaj grupami widoków jednostek Edge", + "manage-edge-dashboard-groups": "Zarządzaj grupami paneli Edge", + "manage-edge-rule-chains": "Zarządzaj łańcuchami reguł Edge", + "manage-edge-integrations": "Zarządzaj integracjami Edge", + "manage-edge-scheduler-events": "Zarządzaj zdarzeniami harmonogramu Edge", + "select-group-to-add": "Wybierz grupę docelową, aby dodać wybrane Edge", + "select-group-to-move": "Wybierz grupę docelową, aby przesunąć wybrane Edge", + "remove-edges-from-group": "Czy na pewno chcesz usunąć {count, plural, =1 {1 Edge} other {# Edgeów} }?", + "group": "Grupa Edge", + "list-of-groups": "{count, plural, =1 {Jedna grupa Edge} other {Lista # grup Edge} }", + "group-name-starts-with": "Grupy Edge, których nazwy zaczynają się od '{{prefix}}'", + "unassign-entity-group-from-edge-title": "Czy na pewno chcesz usunąć przypisanie grupy encji '{{ entityGroupName }}'?", + "unassign-entity-group-from-edge-text": "Po potwierdzeniu grupa encji zostanie usunięta i nie będzie dostępna na urządzeniu Edgeowym.", + "unassign-entity-group-from-edge": "Usuń przypisanie grupy jednostek do Edge", + "unassign-entity-groups-from-edge-title": "Czy na pewno chcesz anulować przypisanie {{count}} grupy obiektów?", + "unassign-entity-groups-from-edge-text": "Po potwierdzeniu grupy encji zostaną anulowane i nie będą dostępne na urządzeniu Edge.", + "unassign-entity-groups-from-edge": "Usuń przypisanie grup jednostek z Edge", + "unassign-scheduler-events-from-edge": "Usuń przypisanie zdarzeń harmonogramu z Edge", + "unassign-scheduler-event-from-edge-title": "Czy na pewno chcesz usunąć przypisanie zdarzenia harmonogramu '{{schedulerEventName}}'?", + "unassign-scheduler-event-from-edge-text": "Po potwierdzeniu zdarzenie harmonogramu zostanie anulowane i nie będzie dostępne na urządzeniu Edge.", + "unassign-scheduler-events-from-edge-title": "Czy na pewno chcesz cofnąć przypisanie {count, plural, =1 {1 zdarzenie planisty} other {# zdarzeń planisty} }?", + "unassign-scheduler-events-from-edge-text": "Po potwierdzeniu wszystkie wybrane zdarzenia harmonogramu zostaną usunięte i nie będą dostępne na urządzeniu Edge.", + "manage-user-groups": "Zarządzaj grupami użytkowników", + "manage-asset-groups": "Zarządzaj grupami zasobów", + "manage-device-groups": "Zarządzaj grupami urządzeń", + "manage-dashboard-groups": "Zarządzaj grupami paneli", + "manage-entity-view-groups": "Zarządzaj grupami widoków encji", + "manage-scheduler-events": "Zarządzaj zdarzeniami harmonogramu", + "manage-integrations": "Zarządzaj integracjami", + "assign-scheduler-event-to-edge-title": "Przypisz zdarzenia harmonogramu do Edge", + "assign-scheduler-event-to-edge-text": "Wybierz zdarzenia harmonogramu, które chcesz przypisać do urządzenia Edge", + "assign-entity-groups-to-edge-text": "Wybierz grupy elementów, które chcesz przypisać do Edge", + "assign-integration-to-edge-title": "Przypisz integracje do Edge", + "assign-integration-to-edge-text": "Wybierz integracje, które chcesz przypisać do urządzenia Edge", + "missing-attributes-title": "Edge ma brakujące atrybuty", + "missing-attributes-text": "Integracje przypisane do Edge mają symbole zastępcze atrybutów, które nie są dostępne na tej Edge.

Lista brakujących atrybutów Edge:
{{missingEdgeAttributes}}", + "missing-all-related-attributes-title": "Edge mają brakujące atrybuty", + "missing-all-related-attributes-text": "Edge powiązane z integracją nie mają atrybutów, które są obecne w konfiguracji integracji jako symbole zastępcze atrybutów.

Lista brakujących atrybutów Edge:
{{missingEdgeAttributes}}", + "quick-overview-widget-header": "{{edgeName}} szybki przegląd" + }, + "edge-event": { + "type-dashboard": "Panel", + "type-asset": "Zasób", + "type-device": "Urządzenie", + "type-device-profile": "Profil urządzenia", + "type-asset-profile": "Profil zasobu", + "type-entity-view": "Widok obiektu", + "type-alarm": "Alarm", + "type-entity-group": "Grupa obiektów", + "type-rule-chain": "Łańcuch reguł", + "type-rule-chain-metadata": "Metadane łańcucha reguł", + "type-edge": "Edge", + "type-user": "Użytkownik", + "type-tenant": "Tenant", + "type-tenant-profile": "Tenant Profile", + "type-customer": "Klient", + "type-relation": "Relacja", + "type-widgets-bundle": "Pakiet widżetów", + "type-widgets-type": "Typ widżetów", + "type-admin-settings": "Ustawienia administratora", + "type-ota-package": "Ota Package", + "type-queue": "Queue", + "type-scheduler-event": "Wydarzenie w harmonogramie", + "type-white-labeling": "White Labeling", + "type-login-white-labeling": "Logowanie White Labeling", + "type-custom-translation": "Tłumaczenie niestandardowe", + "type-role": "Rola", + "type-group-permission": "Zezwolenie grupowe", + "type-integration": "Integracja", + "type-converter": "Przetwornik", + "action-type-added": "Dodany", + "action-type-deleted": "Usunięto", + "action-type-updated": "Zaktualizowano", + "action-type-post-attributes": "Atrybuty postów", + "action-type-attributes-updated": "Zaktualizowano atrybuty", + "action-type-attributes-deleted": "Atrybuty usunięte", + "action-type-timeseries-updated": "Zaktualizowano serie czasowe", + "action-type-credentials-updated": "Zaktualizowano dane uwierzytelniające", + "action-type-assigned-to-customer": "Przypisane do Klienta", + "action-type-unassigned-from-customer": "Nieprzypisane od klienta", + "action-type-relation-add-or-update": "Dodaj lub zaktualizuj relację", + "action-type-relation-deleted": "Relacja usunięta", + "action-type-rpc-call": "Zadzwoń do RPC", + "action-type-alarm-ack": "Potwierdzenie alarmu", + "action-type-alarm-clear": "Alarm usunięty", + "action-type-alarm-assigned": "Alarm Assigned", + "action-type-alarm-unassigned": "Alarm Unassigned", + "action-type-assigned-to-edge": "Przypisany do Edge", + "action-type-unassigned-from-edge": "Nieprzypisane do Edge", + "action-type-credentials-request": "Żądanie poświadczeń", + "action-type-entity-merge-request": "Żądanie połączenia jednostek", + "action-type-added-to-entity-group": "Dodano do grupy jednostek", + "action-type-removed-from-entity-group": "Usunięto z grupy jednostek", + "action-type-change-owner": "Zmiana właściciela", + "action-type-relations-deleted": "Relacje usunięte" + }, + "error": { + "unable-to-connect": "Nie można połączyć się z serwerem! ", + "unhandled-error-code": "Nieobsługiwany kod błędu: {{errorCode}}", + "unknown-error": "Nieznany błąd" + }, + "entity": { + "entity": "Obiekt", + "entities": "Obiekty", + "entities-count": "Liczba obiektów", + "alarms-count": "Liczba alarmów", + "aliases": "Aliasy obiektów", + "aliases-short": "Aliases", + "entity-alias": "Alias obiektów", + "unable-delete-entity-alias-title": "Nie można usunąć aliasu obiektu", + "unable-delete-entity-alias-text": "Alias obiektu '{{entityAlias}}' nie może zostać usunięty, ponieważ jest używany przez następujące widżety:
{{widgetsList}}", + "duplicate-alias-error": "Znaleziono zduplikowany alias '{{alias}}'.
Aliasy obiektu muszą być unikalne w obrębie panelu kontrolnego.", + "missing-entity-filter-error": "Brakuje filtra dla aliasu '{{alias}}'.", + "configure-alias": "Skonfiguruj '{{alias}}' Alias", + "alias": "Alias", + "alias-required": "Alias obiektu jest wymagany.", + "remove-alias": "Usuń alias obiektu", + "add-alias": "Dodaj alias obiektu", + "entity-list": "Lista obiektu", + "entity-type": "Typ obiektu", + "entity-types": "Typy obiektu", + "entity-type-list": "Lista typów obiektu", + "any-entity": "Dowolny obiekt", + "add-entity-type": "Add entity type", + "enter-entity-type": "Wpisz typ obiektu", + "no-entities-matching": "Nie znaleziono obiektu pasujących do '{{entity}}'.", + "no-entity-types-matching": "Nie znaleziono typów obiektu pasujących do '{{entityType}}'", + "name-starts-with": "Wyrażenie nazwy", + "help-text": "Użyj „%” w zależności od potrzeb: „%entity_name_contains%”, „%entity_name_ends”, „entity_starts_with”.", + "use-entity-name-filter": "Użyj filtra", + "entity-list-empty": "Nie wybrano żadnych obiektu.", + "entity-type-list-required": "At least one entity type should be selected.", + "entity-name-filter-required": "Filtr nazwy obiektu jest wymagany.", + "entity-name-filter-no-entity-matched": "Nie znaleziono obiektu zaczynających się od '{{entity}}'.", + "all-subtypes": "Wszystko", + "select-entities": "Wybierz obiekty", + "no-aliases-found": "Nie znaleziono aliasów.", + "no-alias-matching": "'{{alias}}' nie znaleziono.", + "create-new-alias": "Utwórz nowy!", + "create-new": "Create new", + "key": "Klucz", + "key-name": "Nazwa klucza", + "no-keys-found": "Nie znaleziono kluczy.", + "no-key-matching": "'{{key}}' nie znaleziono.", + "create-new-key": "Utwórz nowy!", + "type": "Typ", + "type-required": "Typ obiektu jest wymagany.", + "type-device": "Urządzenie", + "type-devices": "Urządzenia", + "list-of-devices": "{count, plural, =1 {Jedno urządzenie} other {Lista # urządzeń} }", + "device-name-starts-with": "Urządzenia, których nazwy zaczynają się od '{{prefix}}'", + "type-device-profile": "Profil urządzenia", + "type-device-profiles": "Profile urządzeń", + "clear-selected-profiles": "Clear selected profiles", + "list-of-device-profiles": "{count, plural, =1 {Profil jednego urządzenia} other {Lista profili # urządzeń} }", + "device-profile-name-starts-with": "Profile urządzeń, których nazwy zaczynają się od '{{prefix}}'", + "type-asset-profile": "Profil zasobu", + "type-asset-profiles": "Profile zasobów", + "list-of-asset-profiles": "{count, plural, =1 {Jeden profil zasobu} other {Lista profili # zasobów} }", + "asset-profile-name-starts-with": "Profile zasobów, których nazwy zaczynają się od '{{prefix}}'", + "type-asset": "Zasób", + "type-assets": "Zasoby", + "list-of-assets": "{count, plural, =1 {Jeden zasób} other {Lista # zasobów} }", + "asset-name-starts-with": "Zasoby, których nazwy zaczynają się od '{{prefix}}'", + "type-entity-view": "Widok obiektu", + "type-entity-views": "Widoki obiektu", + "list-of-entity-views": "{count, plural, =1 {Widok jednego obiektu} other {Lista # widoków obiektu} }", + "entity-view-name-starts-with": "Widoki obiektu, których nazwy zaczynają się od '{{prefix}}'", + "type-rule": "Reguła", + "type-rules": "Reguły", + "list-of-rules": "{count, plural, =1 {Jedna reguła} other {Lista # reguł} }", + "rule-name-starts-with": "Reguły, których nazwy zaczynają się od '{{prefix}}'", + "type-plugin": "Wtyczka", + "type-plugins": "Wtyczki", + "list-of-plugins": "{count, plural, =1 {Jedna wtyczka} other {Lista # wtyczek} }", + "plugin-name-starts-with": "Wtyczki, których nazwy zaczynają się od '{{prefix}}'", + "type-tenant": "Tenant", + "type-tenants": "Tenant", + "list-of-tenants": "{count, plural, =1 {Jeden tenant} other {Lista # tenantów} }", + "tenant-name-starts-with": "Tenanci, których nazwy zaczynają się na '{{prefix}}'", + "type-tenant-profile": "Profil tenanta", + "type-tenant-profiles": "Profile tenantów", + "list-of-tenant-profiles": "{count, plural, =1 {Profil jednego tenanta} other {Lista # profili tenantów} }", + "tenant-profile-name-starts-with": "Profile tenantów, których nazwy zaczynają się od '{{prefix}}'", + "type-customer": "Klient", + "type-customers": "Klienci", + "list-of-customers": "{count, plural, =1 {Jeden klient} other {Lista # klientów} }", + "customer-name-starts-with": "Klienci, których imiona zaczynają się na '{{prefix}}'", + "type-user": "Użytkownik", + "type-users": "Użytkownicy", + "list-of-users": "{count, plural, =1 {Jeden użytkownik} other {Lista # użytkowników} }", + "user-name-starts-with": "Użytkownicy, których nazwy zaczynają się od '{{prefix}}'", + "type-dashboard": "Panel", + "type-dashboards": "Panele", + "list-of-dashboards": "{count, plural, =1 {Jeden panel} other {Lista # paneli} }", + "dashboard-name-starts-with": "Panele, których nazwy zaczynają się od '{{prefix}}'", + "type-alarm": "Alarm", + "type-alarms": "Alarmy", + "list-of-alarms": "{count, plural, =1 {Jeden alarm} other {Lista # alarmów} }", + "alarm-name-starts-with": "Alarmy, których nazwy zaczynają się od '{{prefix}}'", + "type-rulechain": "Łańcuch reguł", + "type-rulechains": "Łańcuchy reguł", + "list-of-rulechains": "{count, plural, =1 {Jeden łańcuch reguł} other {Lista # łańcuchów reguł} }", + "rulechain-name-starts-with": "Łańcuchy reguł, których nazwy zaczynają się od '{{prefix}}'", + "type-scheduler-event": "Zdarzenie planisty", + "type-scheduler-events": "Zdarzenia planisty", + "list-of-scheduler-events": "{count, plural, =1 {Jedno zdarzenie planisty} other {Lista # zdarzeń planisty} }", + "scheduler-event-name-starts-with": "Zdarzenia planisty, których nazwy zaczynają się od '{{prefix}}'", + "type-blob-entity": "Obiekt typu blob", + "type-blob-entities": "Obiekty typu blob", + "list-of-blob-entities": "{count, plural, =1 {Jeden obiekt typu blob} other {Lista # obiektów typu blob} }", + "blob-entity-name-starts-with": "Obiekty typu blob, których nazwy zaczynają się od '{{prefix}}'", + "type-rulenode": "Węzeł reguły", + "type-rulenodes": "Węzły reguł", + "list-of-rulenodes": "{count, plural, =1 {Jeden węzeł reguły} other {Lista # węzłów reguł} }", + "rulenode-name-starts-with": "Węzły reguł, których nazwy zaczynają się od '{{prefix}}'", + "type-current-customer": "Aktualny klient", + "type-current-tenant": "Aktualny tenant", + "type-current-user": "Aktualny użytkownik", + "type-current-user-owner": "Aktualny właściciel użytkownika", + "type-widgets-bundle": "Pakiet widżetów", + "type-widgets-bundles": "Pakiety widgetów", + "list-of-widgets-bundles": "{count, plural, =1 {Jeden pakiet widżetów} other {Lista # pakietów widżetów} }", + "type-widget-type": "Widget type", + "type-widget-types": "Widget types", + "list-of-widget-types": "{ count, plural, =1 {One widget type} other {List of # widget types} }", + "search": "Wyszukaj obiekty", + "selected-entities": "Wybrano {count, plural, =1 {1 obiekt} other {# obiektów} }", + "entity-name": "Nazwa obiektu", + "entity-label": "Etykieta obiektu", + "details": "Szczegóły obiektu", + "no-entities-prompt": "Nie znaleziono żadnych obiektu", + "no-data": "brak danych do wyświetlenia", + "columns-to-display": "Kolumny do wyświetlenia", + "type-api-usage-state": "Stan użycia interfejsu API", + "type-entity-group": "Grupa obiektu", + "type-converter": "Konwerter danych", + "type-converters": "Konwertery danych", + "list-of-converters": "{count, plural, =1 {Jeden konwerter danych} other {Lista # konwerterów danych} }", + "converter-name-starts-with": "Konwertery danych, których nazwy zaczynają się od '{{prefix}}'", + "type-integration": "Integracja", + "type-integrations": "Integracje", + "list-of-integrations": "{count, plural, =1 {Jedna integracja} other {Lista # integracji} }", + "integration-name-starts-with": "Integracje, których nazwy zaczynają się od '{{prefix}}'", + "type-role": "Rola", + "type-roles": "Role", + "list-of-roles": "{count, plural, =1 {Jedna rola} other {Lista # ról} }", + "role-name-starts-with": "Role, których nazwy zaczynają się od '{{prefix}}'", + "type-group-permission": "Zezwolenie grupowe", + "type-edge": "Edge", + "type-edges": "Edge", + "list-of-edges": "{count, plural, =1 {Jeden Edge} other {Lista # Edgeów} }", + "edge-name-starts-with": "Edge, których nazwy zaczynają się od '{{prefix}}'", + "type-tb-resource": "Biblioteka", + "type-ota-package": "Pakiet OTA", + "type-rpc": "RPC", + "type-queue": "Kolejka", + "type-notification": "Powiadomienie", + "type-notification-rule": "Zasada powiadamiania", + "type-notification-rules": "Notification rules", + "list-of-notification-rules": "{ count, plural, =1 {One notification rule} other {List of # notification rules} }", + "type-notification-target": "Odbiorca powiadomienia", + "type-notification-targets": "Notification recipients", + "list-of-notification-targets": "{ count, plural, =1 {One notification recipient} other {List of # notification recipients} }", + "type-notification-request": "Żądanie powiadomienia", + "type-notification-template": "Szablon powiadomienia", + "type-notification-templates": "Notification templates", + "list-of-notification-templates": "{ count, plural, =1 {One notification template} other {List of # notification templates} }", + "customer-name": "Nazwa klienta", + "sub-customer-name": "Nazwa podklienta", + "parent-customer-name": "Nazwa klienta nadrzędnego", + "parent-sub-customer-name": "Nazwa nadrzędnego klienta podrzędnego", + "include-customer-entities": "Uwzględnij obiekty klientów", + "include-sub-customer-entities": "Uwzględnij obiekty podklientów", + "groups": "Grupy", + "entity-type-list-empty": "Nie wybrano typów obiektu." + }, + "entity-group": { + "entity-group": "Grupa obiektów", + "details": "Szczegóły", + "columns": "Kolumny", + "add-column": "Dodaj kolumnę", + "column-value": "Wartość", + "column-value-required": "Wartość kolumny jest wymagana.", + "column-title": "Tytuł", + "default-sort-order": "Domyślny porządek sortowania", + "default-sort-order-required": "Domyślny porządek sortowania jest wymagany.", + "hide-in-mobile-view": "Komórka ukryta", + "use-cell-style-function": "Użyj funkcji stylu komórki", + "use-cell-content-function": "Użyj funkcji zawartości komórki", + "edit-column": "Edytuj kolumnę", + "column-details": "Szczegóły kolumny", + "actions": "działania", + "settings": "Ustawienia", + "search": "Wyszukaj grupy obiektu", + "delete": "Usuń grupę obiektu", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana.", + "name-max-length": "Nazwa powinna być mniejsza niż 256", + "description": "Opis", + "add": "Dodaj grupę obiektów", + "open-entity-group": "Otwórz grupę obiektów", + "add-entity-group-text": "Dodaj nową grupę obiektów", + "no-entity-groups-text": "Nie znaleziono grup obiektów", + "entity-group-details": "Szczegóły grupy obiektów", + "selected-entity-groups": "Wybrano {count, plural, =1 {1 grupę obiektów} other {# grup obiektów} }", + "delete-entity-groups": "Usuń grupy obiektów", + "delete-entity-group-title": "Czy na pewno chcesz usunąć grupę obiektów '{{entityGroupName}}'?", + "delete-entity-group-text": "Bądź ostrożny, po potwierdzeniu grupy obiektów i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-entity-groups-title": "Czy na pewno chcesz usunąć {count, plural, =1 {1 grupę obiektów} other {# grup obiektów} }?", + "delete-entity-groups-action-title": "Usuń {count, plural, =1 {1 grupę obiektów} other {# grup obiektów} }", + "delete-entity-groups-text": "Uważaj, po potwierdzeniu wszystkie wybrane grupy obiektów zostaną usunięte, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "device-groups": "Grupy urządzeń", + "shared-device-groups": "Współdzielone grupy urządzeń", + "asset-groups": "Grupy zasobów", + "shared-asset-groups": "Współdzielone grupy zasobów", + "customer-groups": "Grupy klientów", + "shared-customer-groups": "Wspólne grupy klientów", + "device-group": "Grupa urządzeń", + "asset-group": "Grupa zasobów", + "user-group": "Grupa użytkowników", + "user-groups": "Grupy użytkowników", + "customer-group": "Grupa klientów", + "entity-view-groups": "Grupy widoków obiektów", + "shared-entity-view-groups": "Grupy widoków encji udostępnionych", + "entity-view-group": "Grupa widoków encji", + "edge-groups": "Grupy Edge", + "shared-edge-groups": "Wspólne grupy Edge", + "edge-group": "Grupa Edge", + "dashboard-groups": "Grupy paneli", + "shared-dashboard-groups": "Udostępnione grupy paneli", + "dashboard-group": "Grupa paneli", + "fetch-more": "Zdobądź więcej", + "column-type": { + "column-type": "Typ kolumny", + "client-attribute": "Atrybut klienta", + "shared-attribute": "Wspólny atrybut", + "server-attribute": "Atrybut serwera", + "timeseries": "Szereg czasowy", + "entity-field": "Pole obiektu" + }, + "column-type-required": "Typ kolumny jest wymagany.", + "entity-field": { + "created-time": "Czas utworzenia", + "name": "Nazwa", + "type": "Typ", + "device_profile": "Profil urządzenia", + "asset_profile": "Profil zasobu", + "assigned_customer": "Przypisany Klient", + "authority": "Autorytet", + "first_name": "Imię", + "last_name": "Nazwisko", + "email": "E-mail", + "title": "Tytuł", + "country": "Kraj", + "state": "Państwo", + "city": "Miasto", + "address": "Adres", + "address2": "Adres 2", + "zip": "Kod pocztowy", + "phone": "Telefon", + "label": "Etykieta" + }, + "sort-order": { + "asc": "Rosnąco", + "desc": "Malejąco", + "none": "Brak" + }, + "details-mode": { + "on-row-click": "Kliknij wiersz", + "on-action-button-click": "Kliknij przycisk szczegółów", + "disabled": "Wyłączony" + }, + "change-owner": "Zmiana właściciela", + "select-target-owner": "Wybierz właściciela docelowego", + "no-owners-matching": "Nie znaleziono pasujących właścicieli do '{{owner}}'", + "target-owner-required": "Właściciel obiektu docelowego jest wymagany.", + "confirm-change-owner-title": "Czy na pewno chcesz zmienić właściciela dla {count, plural, =1 {1 wybranego obiektu} other {# wybranych obiektów} }?", + "confirm-change-owner-text": "Uważaj, po potwierdzeniu wszystkie wybrane obiekty zostaną usunięte z bieżącego właściciela i umieszczone w grupie „Wszystkie” docelowego właściciela.", + "add-to-group": "Dodaj do grupy", + "move-to-group": "Przejdź do grupy", + "select-entity-group": "Wybierz grupę jednostek", + "no-entity-groups-matching": "Brak grup jednostek pasujących do '{{entityGroup}}' zostały znalezione.", + "create-new-entity-group": "Utwórz nową!", + "target-entity-group-required": "Docelowa grupa jednostek jest wymagana.", + "select-user-group": "Wybierz grupę użytkowników", + "no-user-groups-matching": "Brak grup użytkowników pasujących do '{{entityGroup}}' zostały znalezione.", + "target-user-group-required": "Docelowa grupa użytkowników jest wymagana.", + "remove-from-group": "Usuń z grupy", + "group-table-title": "Tytuł tabeli grupowej", + "enable-search": "Włącz wyszukiwanie jednostek", + "enable-add": "Włącz dodawanie jednostek", + "enable-delete": "Włącz usuwanie jednostek", + "enable-selection": "Włącz wybór elementów", + "enable-group-transfer": "Włącz działania związane z transferem grupowym", + "display-pagination": "Wyświetl paginację", + "default-page-size": "Domyślny rozmiar strony", + "enable-assignment-actions": "Włącz akcje przypisania", + "enable-credentials-management": "Włącz zarządzanie danymi uwierzytelniającymi", + "enable-login-as-user": "Włącz logowanie jako akcję użytkownika", + "enable-users-management": "Włącz zarządzanie użytkownikami", + "enable-customers-management": "Włącz zarządzanie klientami", + "enable-assets-management": "Włącz zarządzanie zasobami", + "enable-devices-management": "Włącz zarządzanie urządzeniami", + "enable-entity-views-management": "Włącz zarządzanie widokami encji", + "enable-edges-management": "Włącz zarządzanie Edge", + "enable-dashboards-management": "Włącz zarządzanie panelami", + "enable-scheduler-events-management": "Włącz zarządzanie zdarzeniami harmonogramu", + "open-details-on": "Otwórz szczegóły obiektu na", + "select-existing": "Wybierz istniejącą grupę jednostek", + "create-new": "Utwórz nową grupę jednostek", + "new-entity-group-name": "Nowa nazwa grupy jednostek", + "entity-group-list": "Lista grup jednostek", + "entity-group-list-empty": "Nie wybrano grup jednostek.", + "name-starts-with": "Nazwa grupy jednostek zaczyna się od", + "entity-group-name-filter-required": "Filtr nazwy grupy jednostek jest wymagany.", + "roles": "Role", + "permissions": "Uprawnienia", + "public": "Publiczny", + "entity-group-public": "Grupa jednostek jest publiczna", + "make-public": "Upublicznij grupę encji", + "make-private": "Ustaw grupę encji jako prywatną", + "make-public-entity-group-title": "Czy na pewno chcesz utworzyć grupę encji '{{entityGroupName}}' „publiczny”?", + "make-public-entity-group-text": "Po zatwierdzeniu grupa obiektów i wszystkie jej obiekty zostaną upublicznione i dostępne dla innych.", + "make-private-entity-group-title": "Czy na pewno chcesz utworzyć grupę encji '{{entityGroupName}}'prywatny?", + "make-private-entity-group-text": "Po potwierdzeniu grupa encji i wszystkie jej encje staną się prywatne i nie będą dostępne dla innych.", + "share": "Udostępnij grupę jednostek", + "copyId": "Skopiuj identyfikator grupy jednostek", + "idCopiedMessage": "Identyfikator grupy jednostek został skopiowany do schowka", + "entity-group-name": "Nazwa grupy jednostek", + "all-users": "Wszyscy użytkownicy", + "owner": "Właściciel", + "owner-required": "Właściciel jest wymagany.", + "manage-owner-and-groups": "Zarządzaj właścicielami i grupami", + "owner-and-groups": "Właściciel i grupy" + }, + "entity-field": { + "created-time": "Stworzony czas", + "name": "Nazwa", + "type": "Typ", + "first-name": "Imię", + "last-name": "Nazwisko", + "email": "E-mail", + "title": "Tytuł", + "country": "Kraj", + "state": "Państwo", + "city": "Miasto", + "address": "Adres", + "address2": "Adres 2", + "zip": "Kod pocztowy", + "phone": "Telefon", + "label": "Etykieta", + "configuration": "Konfiguracja", + "schedule": "Harmonogram", + "originatorId": "Identyfikator nadawcy", + "originatorType": "Typ inicjatora" + }, + "entity-view": { + "all": "Wszystko", + "all-entity-views": "Wszystkie widoki obiektów", + "groups": "Grupy", + "shared": "Wspólny", + "entity-view": "Widok obiektu", + "entity-view-required": "Widok obiektu jest wymagany.", + "entity-views": "Widoki obiektów", + "management": "Zarządzanie widokiem obiektu", + "view-entity-views": "Wyświetl widoki obiektów", + "entity-view-alias": "Alias widoku obiektu", + "aliases": "Aliasy widoków obiektów", + "no-alias-matching": "Nie znaleziono '{{alias}}'.", + "no-aliases-found": "Nie znaleziono aliasów.", + "no-key-matching": "Nie znaleziono '{{key}}'.", + "no-keys-found": "Nie znaleziono kluczy.", + "create-new-alias": "Utwórz nowy!", + "create-new-key": "Utwórz nowy!", + "duplicate-alias-error": "Znaleziono zduplikowany alias '{{alias}}'.
Aliasy widoków obiektów muszą być unikalne w panelu.", + "configure-alias": "Skonfiguruj alias '{{alias}}'", + "no-entity-views-matching": "Nie znaleziono widoków obiektów pasujących do '{{entity}}'.", + "public": "Publiczny", + "alias": "Alias", + "alias-required": "Alias widoku obiektu jest wymagany.", + "remove-alias": "Usuń alias widoku obiektu", + "add-alias": "Dodaj alias widoku obiektu", + "name-starts-with": "Wyrażenie nazwy widoku obiektu", + "help-text": "Użyj „%” w zależności od potrzeb: „%entity-view_name_contains%”, „%entity-view_name_ends”, „entity-view_starts_with”.", + "entity-view-list": "Lista widoków obiektów", + "use-entity-view-name-filter": "Użyj filtra", + "entity-view-list-empty": "Nie wybrano żadnych widoków obiektów.", + "entity-view-name-filter-required": "Filtr nazwy widoku obiektu jest wymagany.", + "entity-view-name-filter-no-entity-view-matched": "Nie znaleziono widoków obiektów zaczynających się od '{{entityView}}'.", + "add": "Dodaj widok obiektu", + "entity-view-public": "Widok obiektu jest publiczny", + "assign-to-customer": "Przypisz do klienta", + "assign-entity-view-to-customer": "Przypisz widoki obiektów do klienta", + "assign-entity-view-to-customer-text": "Wybierz widoki obiektów, które chcesz przypisać klientowi", + "no-entity-views-text": "Nie znaleziono widoków obiektów", + "assign-to-customer-text": "Wybierz klienta, aby przypisać widoki obiektów", + "entity-view-details": "Szczegóły widoku obiektu", + "add-entity-view-text": "Dodaj nowy widok obiektu", + "delete": "Usuń widok obiektu", + "assign-entity-views": "Przypisz widoki obiektów", + "assign-entity-views-text": "Przypisz {count, plural, =1 {1 widok obiektu} other {# widoków obiektów} }", + "delete-entity-views": "Usuń widoki obiektów", + "make-public": "Ustaw widok obiektu jako publiczny", + "make-private": "Ustaw widok obiektu jako prywatny", + "unassign-from-customer": "Usuń przypisanie od klienta", + "unassign-entity-views": "Usuń przypisanie widoków obiektów", + "unassign-entity-views-action-title": "Anuluj przypisanie {count, plural, =1 {1 widoku obiektu} other {# widoków obiektów} }", + "assign-new-entity-view": "Przypisz nowy widok obiektu", + "delete-entity-view-title": "Czy na pewno chcesz usunąć widok obiektu '{{entityViewName}}'?", + "delete-entity-view-text": "Bądź ostrożny, po potwierdzeniu widok obiektu i wszystkie związane z nim dane nie będzie można odzyskać.", + "delete-entity-views-title": "Czy na pewno chcesz usunąć {count, plural, =1 {1 widok obiektu} other {# widoków obiektów} }?", + "delete-entity-views-action-title": "Usuń {count, plural, =1 {1 widok obiektu} other {# widoków obiektów} }", + "delete-entity-views-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane widoki obiektów zostaną usunięte, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "make-public-entity-view-title": "Czy na pewno chcesz uczynić widok obiektu '{{entityViewName}}' publicznym?", + "make-public-entity-view-text": "Po potwierdzeniu widok obiektu i wszystkie jego dane zostaną upublicznione i dostępne dla innych.", + "make-private-entity-view-title": "Czy na pewno chcesz uczynić widok obiektu '{{entityViewName}}' prywatnym?", + "make-private-entity-view-text": "Po potwierdzeniu widok obiektu i wszystkie jego dane staną się prywatne i nie będą dostępne dla innych.", + "unassign-entity-view-title": "Czy na pewno chcesz cofnąć przypisanie widoku obiektu '{{entityViewName}}'?", + "unassign-entity-view-text": "Po potwierdzeniu widok obiektu zostanie usunięty i nie będzie dostępny dla klienta.", + "unassign-entity-view": "Usuń przypisanie widoku obiektu", + "unassign-entity-views-title": "Czy na pewno chcesz cofnąć przypisanie { count, plural, =1 {1 widoku obiektu} other {# widoków obiektów} }?", + "unassign-entity-views-text": "Po potwierdzeniu wszystkie wybrane widoki obiektów zostaną usunięte i nie będą dostępne dla klienta.", + "entity-view-type": "Typ widoku obiektu", + "entity-view-type-required": "Typ widoku obiektu jest wymagany.", + "select-entity-view-type": "Wybierz typ widoku obiektu", + "enter-entity-view-type": "Wprowadź typ widoku obiektu", + "any-entity-view": "Dowolny widok obiektu", + "no-entity-view-types-matching": "Nie znaleziono typów widoków obiektów pasujących do '{{entitySubtype}}'.", + "entity-view-type-list-empty": "Nie wybrano typów widoków obiektów.", + "entity-view-types": "Typy widoków obiektów", + "created-time": "Czas utworzenia", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana.", + "name-max-length": "Nazwa powinna być mniejsza niż 256", + "type-max-length": "Typ widoku obiektu powinien być mniejszy niż 256", + "description": "Opis", + "events": "Zdarzenia", + "details": "Szczegóły", + "copyId": "Skopiuj identyfikator widoku obiektu", + "idCopiedMessage": "Identyfikator widoku obiektu został skopiowany do schowka", + "assignedToCustomer": "Przypisany do klienta", + "unable-entity-view-device-alias-title": "Nie można usunąć aliasu widoku obiektu", + "unable-entity-view-device-alias-text": "Alias urządzenia '{{entityViewAlias}}' nie może zostać usunięty, ponieważ jest używany przez następujące widżety:
{{widgetsList}}", + "select-entity-view": "Wybierz widok obiektu", + "start-date": "Data rozpoczęcia", + "start-ts": "Czas rozpoczęcia", + "end-date": "Data końcowa", + "end-ts": "Czas końcowy", + "date-limits": "Limity dat", + "client-attributes": "Atrybuty klienta", + "shared-attributes": "Atrybuty wspólne", + "server-attributes": "Atrybuty serwera", + "timeseries": "Szereg czasowy", + "client-attributes-placeholder": "Atrybuty klienta", + "shared-attributes-placeholder": "Atrybuty wspólne", + "server-attributes-placeholder": "Atrybuty serwera", + "timeseries-placeholder": "Szereg czasowy", + "target-entity": "Obiekt docelowy", + "attributes-propagation": "Propagacja atrybutów", + "attributes-propagation-hint": "Widok obiektu automatycznie skopiuje określone atrybuty z obiektu docelowego za każdym razem, gdy zapiszesz lub zaktualizujesz ten widok obiektu. Ze względu na wydajność atrybuty obiektu docelowego nie są propagowane do widoku obiektu przy każdej zmianie atrybutu. Możesz włączyć automatyczną propagację, konfigurując węzeł reguły „skopiuj, aby wyświetlić” w łańcuchu reguł i łącząc wiadomości „Opublikuj atrybuty” i „Atrybuty zaktualizowane” z nowym węzłem reguły.", + "timeseries-data": "Dane szeregów czasowych", + "timeseries-data-hint": "Skonfiguruj klucze danych szeregów czasowych obiektu docelowego, które będą dostępne w widoku obiektu. Dane szeregów czasowych są tylko do odczytu.", + "select-group-to-add": "Wybierz grupę docelową, aby dodać wybrane widoki obiektów", + "select-group-to-move": "Wybierz grupę docelową, aby przenieść wybrane widoki obiektów", + "remove-entity-views-from-group": "Czy na pewno chcesz usunąć {count, plural, =1 {1 widok obiektu} other {# widoków obiektów} } z grupy '{{entityGroup}}'?", + "group": "Grupa widoków obiektów", + "list-of-groups": "{count, plural, =1 {Jedna grupa widoków obiektów} other {Lista # grup widoków obiektów} }", + "group-name-starts-with": "Grupy widoków obiektów, których nazwy zaczynają się od '{{prefix}}'", + "search": "Wyszukaj widoki obiektów", + "selected-entity-views": "Wybrano {count, plural, =1 {1 widok obiektu} other {# widoków obiektów} }", + "assign-entity-view-to-edge": "Przypisz widoki obiektów do Edge", + "assign-entity-view-to-edge-text": "Wybierz widoki obiektów, które chcesz przypisać do Edge", + "unassign-entity-view-from-edge-title": "Czy na pewno chcesz cofnąć przypisanie widoku obiektu '{{entityViewName}}'?", + "unassign-entity-view-from-edge-text": "Po potwierdzeniu widok obiektu zostanie usunięty i nie będzie dostępny dla Edge.", + "unassign-entity-views-from-edge-action-title": "Anuluj przypisanie {count, plural, =1 {1 widoku obiektu} other {# widoków obiektów} } do Edge", + "unassign-entity-view-from-edge": "Usuń przypisanie widoku obiektu", + "unassign-entity-views-from-edge-title": "Czy na pewno chcesz cofnąć przypisanie {count, plural, =1 {1 widoku obiektu} other {# widoków obiektów} }?", + "unassign-entity-views-from-edge-text": "Po potwierdzeniu wszystkie wybrane widoki obiektów zostaną anulowane i nie będą dostępne dla urządzenia Edge." + }, + "event": { + "events": "Wydarzenia", + "event-type": "Typ wydarzenia", + "events-filter": "Filtr zdarzeń", + "clean-events": "Wyczyść zdarzenia", + "type-error": "Błąd", + "type-lc-event": "Wydarzenie cyklu życia", + "type-stats": "Statystyka", + "type-debug-converter": "Debug", + "type-debug-integration": "Debug", + "type-debug-rule-node": "Debug", + "type-debug-rule-chain": "Debug", + "no-events-prompt": "Nie znaleziono żadnych wydarzeń", + "error": "Błąd", + "alarm": "Alarm", + "event-time": "Czas wydarzenia", + "server": "serwer", + "body": "Ciało", + "method": "metoda", + "type": "Typ", + "in": "W", + "out": "Na zewnątrz", + "metadata": "Metadane", + "message": "Wiadomość", + "entity": "Obiekt", + "message-id": "ID wiadomości", + "copy-message-id": "Skopiuj identyfikator wiadomości", + "message-type": "Typ wiadomości", + "data-type": "Typ danych", + "relation-type": "Typ relacji", + "data": "Dane", + "event": "Wydarzenie", + "status": "Status", + "success": "Powodzenie", + "failed": "Niepowodzenie", + "messages-processed": "Wiadomości przetworzone", + "max-messages-processed": "Maksymalna liczba przetworzonych wiadomości", + "min-messages-processed": "Przetworzona minimalna liczba wiadomości", + "errors-occurred": "Wystąpiły błędy", + "max-errors-occurred": "Wystąpiło maksimum błędów", + "min-errors-occurred": "Wystąpiło minimum błędów", + "min-value": "Minimalna wartość to 0.", + "all-events": "Wszystko", + "has-error": "Zawiera błąd", + "entity-id": "Identyfikator jednostki", + "copy-entity-id": "Skopiuj identyfikator jednostki", + "entity-type": "Typ encji", + "clear-filter": "Czysty filtr", + "clear-request-title": "Wyczyść wszystkie zdarzenia", + "clear-request-text": "Czy na pewno chcesz wyczyścić wszystkie zdarzenia?", + "started": "Rozpoczęto", + "updated": "Zaktualizowano", + "stopped": "Zatrzymano" + }, + "extension": { + "extensions": "Rozszerzenia", + "selected-extensions": "Wybrano {count, plural, =1 {1 rozszerzenie} other {# rozszerzeń} }", + "type": "Typ", + "key": "Klucz", + "value": "Wartość", + "id": "ID", + "extension-id": "Identyfikator rozszerzenia", + "extension-type": "Typ rozszerzenia", + "transformer-json": "JSON *", + "unique-id-required": "Bieżący identyfikator rozszerzenia już istnieje.", + "delete": "Usuń rozszerzenie", + "add": "Dodaj rozszerzenie", + "edit": "Edytuj rozszerzenie", + "view": "Wyświetl rozszerzenie", + "delete-extension-title": "Czy na pewno chcesz usunąć rozszerzenie '{{extensionId}}'?", + "delete-extension-text": "Bądź ostrożny, po potwierdzeniu rozszerzenia i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-extensions-title": "Czy na pewno chcesz usunąć {count, plural, =1 {1 rozszerzenie} other {# rozszerzeń} }?", + "delete-extensions-text": "Uważaj, po potwierdzeniu wszystkie wybrane rozszerzenia zostaną usunięte.", + "converters": "Konwertery", + "converter-id": "Identyfikator konwertera", + "configuration": "Konfiguracja", + "converter-configurations": "Konfiguracje konwertera", + "token": "Token bezpieczeństwa", + "add-converter": "Dodaj konwerter", + "add-config": "Dodaj konfigurację konwertera", + "device-name-expression": "Wyrażenie nazwy urządzenia", + "device-type-expression": "Wyrażenie typu urządzenia", + "custom": "Zwyczaj", + "to-double": "Podwoić", + "transformer": "Transformator", + "json-required": "Transformator JSON jest wymagany.", + "json-parse": "Nie można przeanalizować pliku JSON transformatora.", + "attributes": "Atrybuty", + "add-attribute": "Dodaj atrybut", + "add-map": "Dodaj element mapowania", + "timeseries": "Szereg czasowy", + "add-timeseries": "Dodaj szeregi czasowe", + "field-required": "To pole jest wymagane", + "brokers": "Brokerzy", + "add-broker": "Dodaj brokera", + "host": "Host", + "port": "Port", + "port-range": "Port powinien należeć do zakresu od 1 do 65535.", + "ssl": "Ssl", + "credentials": "Dane uwierzytelniające", + "username": "Nazwa użytkownika", + "password": "Hasło", + "retry-interval": "Interwał ponawiania prób w milisekundach", + "sas": "Podpis dostępu współdzielonego", + "anonymous": "Anonimowy", + "basic": "Podstawowy", + "pem": "PEM", + "ca-cert": "Plik certyfikatu urzędu certyfikacji *", + "private-key": "Plik klucza prywatnego *", + "cert": "Plik certyfikatu *", + "no-file": "Nie wybrano pliku.", + "drop-file": "Upuść plik lub kliknij, aby wybrać plik do przesłania.", + "mapping": "Mapowanie", + "topic-filter": "Filtr tematyczny", + "converter-type": "Typ konwertera", + "converter-json": "Jsona", + "json-name-expression": "Wyrażenie JSON nazwy urządzenia", + "topic-name-expression": "Wyrażenie tematu nazwy urządzenia", + "json-type-expression": "Wyrażenie JSON typu urządzenia", + "topic-type-expression": "Wyrażenie tematu typu urządzenia", + "attribute-key-expression": "Wyrażenie klucza atrybutu", + "attr-json-key-expression": "Wyrażenie JSON klucza atrybutu", + "attr-topic-key-expression": "Atrybut kluczowego wyrażenia tematu", + "request-id-expression": "Wyrażenie identyfikatora żądania", + "request-id-json-expression": "Wyrażenie JSON identyfikatora żądania", + "request-id-topic-expression": "Wyrażenie tematu identyfikatora żądania", + "response-topic-expression": "Wyrażenie tematu odpowiedzi", + "value-expression": "Wyrażenie wartości", + "topic": "Temat", + "timeout": "Limit czasu w milisekundach", + "converter-json-required": "Konwerter json jest wymagany.", + "converter-json-parse": "Nie można przeanalizować konwertera JSON.", + "filter-expression": "Wyrażenie filtru", + "connect-requests": "Połącz żądania", + "add-connect-request": "Dodaj prośbę o połączenie", + "disconnect-requests": "Rozłącz żądania", + "add-disconnect-request": "Dodaj prośbę o rozłączenie", + "attribute-requests": "Żądania atrybutów", + "add-attribute-request": "Dodaj żądanie atrybutu", + "attribute-updates": "Aktualizacje atrybutów", + "add-attribute-update": "Dodaj aktualizację atrybutu", + "server-side-rpc": "RPC po stronie serwera", + "add-server-side-rpc-request": "Dodaj żądanie RPC po stronie serwera", + "device-name-filter": "Filtr nazw urządzeń", + "attribute-filter": "Filtr atrybutów", + "method-filter": "Filtr metody", + "request-topic-expression": "Poproś o wyrażenie tematu", + "response-timeout": "Limit czasu odpowiedzi w milisekundach", + "topic-expression": "Wyrażenie tematyczne", + "client-scope": "Zakres klienta", + "add-device": "Dodaj urządzenie", + "opc-server": "Serwery", + "opc-add-server": "Dodaj serwer", + "opc-add-server-prompt": "Proszę dodać serwer", + "opc-application-name": "Nazwa aplikacji", + "opc-application-uri": "Nazwa aplikacji", + "opc-scan-period-in-seconds": "Okres skanowania w sekundach", + "opc-security": "Bezpieczeństwo", + "opc-identity": "Tożsamość", + "opc-keystore": "Magazyn kluczy", + "opc-type": "Typ", + "opc-keystore-type": "Typ", + "opc-keystore-location": "Lokalizacja *", + "opc-keystore-password": "Hasło", + "opc-keystore-alias": "Alias", + "opc-keystore-key-password": "Kluczowe hasło", + "opc-device-node-pattern": "Wzór węzła urządzenia", + "opc-device-name-pattern": "Wzorzec nazwy urządzenia", + "modbus-server": "Serwery/niewolnicy", + "modbus-add-server": "Dodaj serwer/podrzędny", + "modbus-add-server-prompt": "Proszę dodać serwer/podrzędny", + "modbus-transport": "Transport", + "modbus-tcp-reconnect": "Automatycznie połącz ponownie", + "modbus-rtu-over-tcp": "RTU przez TCP", + "modbus-port-name": "Nazwa portu szeregowego", + "modbus-encoding": "Kodowanie", + "modbus-parity": "Parytet", + "modbus-baudrate": "Szybkość transmisji", + "modbus-databits": "Bity danych", + "modbus-stopbits": "Zatrzymaj bity", + "modbus-databits-range": "Bity danych powinny mieścić się w zakresie od 7 do 8.", + "modbus-stopbits-range": "Bity stopu powinny należeć do zakresu od 1 do 2.", + "modbus-unit-id": "Identyfikator jednostki", + "modbus-unit-id-range": "Identyfikator jednostki powinien mieścić się w zakresie od 1 do 247.", + "modbus-device-name": "Nazwa urządzenia", + "modbus-poll-period": "Okres odpytywania (ms)", + "modbus-attributes-poll-period": "Atrybuty Okres odpytywania (ms)", + "modbus-timeseries-poll-period": "Okres odpytywania szeregów czasowych (ms)", + "modbus-poll-period-range": "Okres odpytywania powinien mieć wartość dodatnią.", + "modbus-tag": "Etykietka", + "modbus-function": "Funkcjonować", + "modbus-register-address": "Adres rejestracyjny", + "modbus-register-address-range": "Adres rejestru powinien mieścić się w zakresie od 0 do 65535.", + "modbus-register-bit-index": "Indeks bitowy", + "modbus-register-bit-index-range": "Indeks bitowy powinien mieścić się w zakresie od 0 do 15.", + "modbus-register-count": "Liczba zarejestrowanych", + "modbus-register-count-range": "Liczba rejestrów powinna mieć wartość dodatnią.", + "modbus-byte-order": "Kolejność bajtów", + "sync": { + "status": "Status", + "sync": "Synchronizuj", + "not-sync": "Brak synchronizacji", + "last-sync-time": "Czas ostatniej synchronizacji", + "not-available": "Niedostępne" + }, + "export-extensions-configuration": "Eksportuj konfigurację rozszerzeń", + "import-extensions-configuration": "Importuj konfigurację rozszerzeń", + "import-extensions": "Importuj rozszerzenia", + "import-extension": "Rozszerzenie importu", + "export-extension": "Rozszerzenie eksportu", + "file": "Plik rozszerzeń", + "invalid-file-error": "Nieprawidłowy plik rozszerzenia", + "text": "TEKST", + "json": "JSON", + "binary": "DWÓJKOWY", + "hex": "KLĄTWA" + }, + "feature": { + "advanced-features": "Zaawansowane funkcje" + }, + "filter": { + "add": "Dodaj filtr", + "edit": "Edytuj filtr", + "name": "Nazwa filtra", + "name-required": "Nazwa filtra jest wymagana.", + "duplicate-filter": "Filtr o tej samej nazwie już istnieje.", + "filters": "Filtry", + "unable-delete-filter-title": "Nie można usunąć filtra", + "unable-delete-filter-text": "Filtruj '{{filter}}' nie może zostać usunięty, ponieważ jest używany przez następujące widżety:
{{widgetsList}}", + "duplicate-filter-error": "Znaleziono zduplikowany filtr '{{filter}}'.
Filtry muszą być unikalne w panelu kontrolnym.", + "missing-key-filters-error": "Brak kluczowych filtrów dla filtra '{{filter}}'.", + "filter": "Filtr", + "editable": "Edytowalne", + "no-filters-found": "Nie znaleziono filtrów.", + "no-filter-text": "Nie określono filtra", + "add-filter-prompt": "Proszę dodać filtr", + "no-filter-matching": "'{{filter}}' nie znaleziono.", + "create-new-filter": "Utwórz nowy!", + "create-new": "Create new", + "filter-required": "Filtr jest wymagany.", + "operation": { + "operation": "Operacja", + "equal": "równy", + "not-equal": "nie równe", + "starts-with": "zaczynać z", + "ends-with": "kończy się", + "contains": "zawiera", + "not-contains": "nie zawiera", + "greater": "Lepszy niż", + "less": "mniej niż", + "greater-or-equal": "większy lub równy", + "less-or-equal": "mniejszy lub równy", + "and": "I", + "or": "Lub", + "in": "W", + "not-in": "nie w" + }, + "ignore-case": "zignoruj wielkość liter", + "value": "Wartość", + "remove-filter": "Usuń filtr", + "duplicate-filter-action": "Zduplikowany filtr", + "preview": "Podgląd filtra", + "no-filters": "Nie skonfigurowano żadnych filtrów", + "add-filter": "Dodaj filtr", + "add-complex-filter": "Dodaj złożony filtr", + "add-complex": "Dodaj kompleks", + "complex-filter": "Złożony filtr", + "edit-complex-filter": "Edytuj złożony filtr", + "edit-filter-user-params": "Edytuj parametry użytkownika predykatu filtra", + "filter-user-params": "Filtruj parametry użytkownika predykatu", + "user-parameters": "Parametry użytkownika", + "display-label": "Etykieta do wyświetlenia", + "autogenerated-label": "Automatyczne generowanie etykiety", + "order-priority": "Priorytet zamówienia pola", + "key-filter": "Filtr kluczowy", + "key-filters": "Kluczowe filtry", + "key-name": "Nazwa klucza", + "key-name-required": "Nazwa klucza jest wymagana.", + "key-type": { + "key-type": "Typ klucza", + "attribute": "Atrybut", + "timeseries": "Szereg czasowy", + "entity-field": "Pole obiektu", + "constant": "Stały" + }, + "value-type": { + "value-type": "Typ wartości", + "string": "Strunowy", + "numeric": "Numeryczny", + "boolean": "Wartość logiczna", + "date-time": "Data i godzina" + }, + "value-type-required": "Typ wartości klucza jest wymagany.", + "key-value-type-change-title": "Czy na pewno chcesz zmienić typ wartości klucza?", + "key-value-type-change-message": "Jeśli potwierdzisz nowy typ wartości, wszystkie wprowadzone filtry kluczowe zostaną usunięte.", + "no-key-filters": "Nie skonfigurowano żadnych filtrów kluczowych", + "add-key-filter": "Dodaj filtr kluczy", + "remove-key-filter": "Usuń kluczowy filtr", + "edit-key-filter": "Edytuj filtr kluczy", + "date": "Data", + "time": "Czas", + "current-tenant": "Obecny najemca", + "current-customer": "Obecny klient", + "current-user": "Aktualny użytkownik", + "current-device": "Bieżące urządzenie", + "default-value": "Domyślna wartość", + "dynamic-source-type": "Typ źródła dynamicznego", + "dynamic-value": "Wartość dynamiczna", + "no-dynamic-value": "Brak wartości dynamicznej", + "source-attribute": "Atrybut źródłowy", + "switch-to-dynamic-value": "Przełącz na wartość dynamiczną", + "switch-to-default-value": "Przełącz na wartość domyślną", + "inherit-owner": "Dziedzicz po właścicielu", + "source-attribute-not-set": "Jeśli atrybut źródła nie jest ustawiony" + }, + "fullscreen": { + "expand": "Rozwiń do pełnego ekranu", + "exit": "Wyłączyć tryb pełnoekranowy", + "toggle": "Przełącz tryb pełnoekranowy", + "fullscreen": "Pełny ekran" + }, + "function": { + "function": "Funkcjonować" + }, + "gateway": { + "add-entry": "Dodaj konfigurację", + "advanced": "Advanced", + "checking-device-activity": "Checking device activity", + "command": "Docker commands", + "command-copied-message": "Docker command has been copied to clipboard", + "configuration": "Configuration", + "connector-add": "Dodaj nowe złącze", + "connector-enabled": "Włącz złącze", + "connector-name": "Nazwa złącza", + "connector-name-required": "Nazwa złącza jest wymagana.", + "connector-type": "Typ złącza", + "connector-type-required": "Typ złącza jest wymagany.", + "connectors": "Konfiguracja złączy", + "connectors-config": "Connectors configuration", + "connectors-table-enabled": "Enabled", + "connectors-table-name": "Name", + "connectors-table-type": "Type", + "connectors-table-status": "Status", + "connectors-table-actions": "Actions", + "connectors-table-key": "Key", + "connectors-table-class": "Class", + "rpc-command-send": "Send", + "rpc-command-result": "Result", + "rpc-command-edit-params": "Edit parameters", + "gateway-configuration": "General Configuration", + "docker-label": "In order to run ThingsBoard IoT gateway in docker with credentials for this device you can use the following commands.", + "create-new-gateway": "Utwórz nowy gateway", + "create-new-gateway-text": "Czy na pewno chcesz utworzyć nowy gateway o nazwie: '{{gatewayName}}'?", + "created-time": "Created time", + "configuration-delete-dialog-header": "Configurations will be deleted", + "configuration-delete-dialog-body": "Turning off Remote Configuration is possible only if there is physical access to the Gateway. All previous configurations will be deleted.

\nTo turn off configuration, enter gateway name below", + "configuration-delete-dialog-input": "Gateway name", + "configuration-delete-dialog-input-required": "Gateway name is mandatory", + "configuration-delete-dialog-confirm": "Turn Off", + "delete": "Usuń konfigurację", + "download-tip": "Pobierz plik konfiguracyjny", + "drop-file": "Drop file here or", + "gateway": "Wejście", + "gateway-exists": "Urządzenie o tej samej nazwie już istnieje.", + "gateway-name": "Nazwa Gateway", + "gateway-name-required": "Nazwa Gateway'a jest wymagana.", + "gateway-saved": "Konfiguracja Gatewey'a została pomyślnie zapisana.", + "grpc": "GRPC", + "grpc-keep-alive-timeout": "Keep alive timeout (in ms)", + "grpc-keep-alive-timeout-required": "Keep alive timeout is required", + "grpc-keep-alive-timeout-min": "Keep alive timeout can not be less then 1", + "grpc-keep-alive-timeout-pattern": "Keep alive timeout is not valid", + "grpc-keep-alive": "Keep alive (in ms)", + "grpc-keep-alive-required": "Keep alive is required", + "grpc-keep-alive-min": "Keep alive can not be less then 1", + "grpc-keep-alive-pattern": "Keep alive is not valid", + "grpc-min-time-between-pings": "Min time between pings (in ms)", + "grpc-min-time-between-pings-required": "Min time between pings is required", + "grpc-min-time-between-pings-min": "Min time between pings can not be less then 1", + "grpc-min-time-between-pings-pattern": "Min time between pings is not valid", + "grpc-min-ping-interval-without-data": "Min ping interval without data (in ms)", + "grpc-min-ping-interval-without-data-required": "Min ping interval without data is required", + "grpc-min-ping-interval-without-data-min": "Min ping interval without data can not be less then 1", + "grpc-min-ping-interval-without-data-pattern": "Min ping interval without data is not valid", + "grpc-max-pings-without-data": "Max pings without data", + "grpc-max-pings-without-data-required": "Max pings without data is required", + "grpc-max-pings-without-data-min": "Max pings without data can not be less then 1", + "grpc-max-pings-without-data-pattern": "Max pings without data is not valid", + "inactivity-check-period-seconds": "Inactivity check period (in sec)", + "inactivity-check-period-seconds-required": "Inactivity check period is required", + "inactivity-check-period-seconds-min": "Inactivity check period can not be less then 1", + "inactivity-check-period-seconds-pattern": "Inactivity check period is not valid", + "inactivity-timeout-seconds": "Inactivity timeout (in sec)", + "inactivity-timeout-seconds-required": "Inactivity timeout is required", + "inactivity-timeout-seconds-min": "Inactivity timeout can not be less then 1", + "inactivity-timeout-seconds-pattern": "Inactivity timeout is not valid", + "json-parse": "Nieprawidłowy JSON.", + "json-required": "Pole nie może być puste.", + "logs": { + "logs": "Logs", + "days": "days", + "hours": "hours", + "minutes": "minutes", + "seconds": "seconds", + "date-format": "Date format", + "date-format-required": "Date format required", + "log-format": "Log format", + "log-type": "Log type", + "log-format-required": "Log format required", + "remote": "Remote logging", + "remote-logs": "Remote logs", + "local": "Local logging", + "level": "Log level", + "file-path": "File path", + "file-path-required": "File path required", + "saving-period": "Log saving period", + "saving-period-min": "Log saving period can not be less then 1", + "saving-period-required": "Log saving period required", + "backup-count": "Backup count", + "backup-count-min": "Backup count can not be less then 1", + "backup-count-required": "Backup count required" + }, + "min-pack-send-delay": "Min pack send delay (in ms)", + "min-pack-send-delay-required": "Min pack send delay is required", + "min-pack-send-delay-min": "Min pack send delay can not be less then 0", + "no-connectors": "Brak złączy", + "no-data": "Brak konfiguracji", + "no-gateway-found": "Nie znaleziono gateway'a.", + "no-gateway-matching": " '{{item}}' nie znaleziono.", + "path-logs": "Ścieżka do plików dziennika", + "path-logs-required": "Ścieżka jest wymagana.", + "permit-without-calls": "Keep alive permit without calls", + "remote": "Zdalna konfiguracja", + "remote-logging-level": "Poziom logowania", + "remove-entry": "Usuń konfigurację", + "remote-shell": "Remote shell", + "remote-configuration": "Remote Configuration", + "other": "Other", + "save-tip": "Zapisz plik konfiguracyjny", + "security-type": "Rodzaj zabezpieczenia", + "security-types": { + "access-token": "Token dostępu", + "username-password": "Username and Password", + "tls": "TLS", + "tls-access-token": "TLS + Access Token", + "tls-private-key": "TLS + Private Key" + }, + "server-port": "Server port", + "statistics": { + "statistic": "Statistic", + "statistics": "Statistics", + "statistic-commands-empty": "No statistics available", + "commands": "Commands", + "send-period": "Statistic send period (in sec)", + "send-period-required": "Statistic send period is required", + "send-period-min": "Statistic send period can not be less then 60", + "send-period-pattern": "Statistic send period is not valid", + "check-connectors-configuration": "Check connectors configuration (in sec)", + "check-connectors-configuration-required": "Check connectors configuration is required", + "check-connectors-configuration-min": "Check connectors configuration can not be less then 1", + "check-connectors-configuration-pattern": "Check connectors configuration is not valid", + "add": "Add command", + "timeout": "Timeout", + "timeout-ms": "Timeout (in ms)", + "timeout-required": "Timeout is required", + "timeout-min": "Timeout can not be less then 1", + "timeout-pattern": "Timeout is not valid", + "attribute-name": "Attribute name", + "attribute-name-required": "Attribute name is required", + "command": "Command", + "command-required": "Command is required", + "remove": "Remove command" + }, + "storage": "Składowanie", + "storage-max-file-records": "Maksymalna liczba rekordów w pliku", + "storage-max-files": "Maksymalna liczba plików", + "storage-max-files-min": "Minimalna liczba to 1.", + "storage-max-files-pattern": "Numer jest nieprawidłowy.", + "storage-max-files-required": "Numer jest wymagany.", + "storage-max-records": "Maksymalna liczba rekordów w pamięci", + "storage-max-records-min": "Minimalna liczba rekordów to 1.", + "storage-max-records-pattern": "Numer jest nieprawidłowy.", + "storage-max-records-required": "Maksymalna liczba rekordów jest wymagana.", + "storage-read-record-count": "Read record count in storage", + "storage-read-record-count-min": "Minimum number of records is 1.", + "storage-read-record-count-pattern": "Number is not valid.", + "storage-read-record-count-required": "Read record count is required.", + "storage-max-read-record-count": "Max read record count in storage", + "storage-max-read-record-count-min": "Minimum number of records is 1.", + "storage-max-read-record-count-pattern": "Number is not valid.", + "storage-max-read-record-count-required": "Max Read record count is required.", + "storage-data-folder-path": "Data folder path", + "storage-data-folder-path-required": "Data folder path is required.", + "storage-pack-size": "Maksymalny rozmiar pakietu wydarzeń", + "storage-pack-size-min": "Minimalna liczba to 1.", + "storage-pack-size-pattern": "Numer jest nieprawidłowy.", + "storage-pack-size-required": "Maksymalny rozmiar pakietu wydarzeń jest wymagany.", + "storage-path": "Ścieżka przechowywania", + "storage-path-required": "Ścieżka do przechowywania jest wymagana.", + "storage-type": "Typ składowania", + "storage-types": { + "file-storage": "Nośnik danych", + "memory-storage": "Przechowywanie pamięci", + "sqlite": "SQLITE" + }, + "thingsboard": "ThingsBoard", + "general": "General", + "thingsboard-host": "Gospodarz ThingsBoard", + "thingsboard-host-required": "Host jest wymagany.", + "thingsboard-port": "Port ThingsBoard", + "thingsboard-port-max": "Maksymalny numer portu to 65535.", + "thingsboard-port-min": "Minimalny numer portu to 1.", + "thingsboard-port-pattern": "Port jest nieprawidłowy.", + "thingsboard-port-required": "Port jest wymagany.", + "tidy": "Uporządkuj", + "tidy-tip": "Uporządkowana konfiguracja JSON", + "title-connectors-json": "Złącze {{typeName}} konfiguracja", + "tls-path-ca-certificate": "Ścieżka do certyfikatu CA na gateway", + "tls-path-client-certificate": "Ścieżka do certyfikatu klienta na gateway", + "messages-ttl-check-in-hours": "Messages TTL check in hours", + "messages-ttl-check-in-hours-required": "Messages TTL check in hours is required.", + "messages-ttl-check-in-hours-min": "Min number is 1.", + "messages-ttl-check-in-hours-pattern": "Number is not valid.", + "messages-ttl-in-days": "Messages TTL in days", + "messages-ttl-in-days-required": "Messages TTL in days is required.", + "messages-ttl-in-days-min": "Min number is 1.", + "messages-ttl-in-days-pattern": "Number is not valid.", + "mqtt-qos": "QoS", + "mqtt-qos-required": "QoS is required", + "mqtt-qos-range": "QoS values range is from 0 to 1", + "tls-path-private-key": "Ścieżka do klucza prywatnego na bramce", + "toggle-fullscreen": "Przełącz tryb pełnoekranowy", + "transformer-json-config": "Konfiguracja JSON*", + "update-config": "Dodaj/zaktualizuj konfigurację JSON", + "hints": { + "remote-configuration": "Enables remote configuration and management of the gateway", + "remote-shell": "Enables remote control of the operating system with the gateway from the Remote Shell widget", + "host": "Hostname or IP address of ThingsBoard server", + "port": "Port of MQTT service on ThingsBoard server", + "token": "Access token for the gateway from ThingsBoard server", + "client-id": "MQTT client id for the gateway form ThingsBoard server", + "username": "MQTT username for the gateway form ThingsBoard server", + "password": "MQTT password for the gateway form ThingsBoard server", + "ca-cert": "Path to CA certificate file", + "date-form": "Date format in log message", + "data-folder": "Path to folder, that will contains data (Relative or Absolute)", + "log-format": "Log message format", + "remote-log": "Enables remote logging and logs reading from the gateway", + "backup-count": "If backup count is > 0, when a rollover is done, no more than backup count files are kept - the oldest ones are deleted", + "storage": "Provides configuration for saving incoming data before it is sent to the platform", + "max-file-count": "Maximum count of file that will be created", + "max-read-count": "Count of messages to get from storage and send to ThingsBoard", + "max-records": "Maximum count of records that will be stored in one file", + "read-record-count": "Count of messages to get from storage and send to ThingsBoard", + "max-records-count": "Maximum count of data in storage before send to ThingsBoard", + "ttl-check-hour": "How often will Gateway check data for obsolescence", + "ttl-messages-day": "Maximum days that storage will save data", + "commands": "Commands for collecting additional statistic", + "attribute": "Statistic telemetry key", + "timeout": "Timeout for command executing", + "command": "The result of the command execution, will be used as the value for telemetry", + "check-device-activity": "Enables monitor the activity of each connected device", + "inactivity-timeout": "Time after whose the gateway will disconnect device", + "inactivity-period": "Periodicity of device activity check", + "minimal-pack-delay": "Delay between sending packs of messages (Decreasing this setting results in increased CPU usage)", + "qos": "Quality of Service in MQTT messaging (0 - at most once, 1 - at least once)", + "server-port": "Network port on which GRPC server will listen for incoming connections.", + "grpc-keep-alive-timeout": "Maximum time the server should wait for a keepalive ping response before considering the connection dead.", + "grpc-keep-alive": "Duration between two successive keepalive ping messages when there is no active RPC call.", + "grpc-min-time-between-pings": "Minimum amount of time the server should wait between sending keepalive ping messages", + "grpc-max-pings-without-data": "Maximum number of keepalive ping messages that the server can send without receiving any data before it considers the connection dead.", + "grpc-min-ping-interval-without-data": "Minimum amount of time the server should wait between sending keepalive ping messages when there is no data being sent or received.", + "permit-without-calls": "Allow server to keep the GRPC connection alive even when there are no active RPC calls." } }, - "dialog":{ - "close":"Zamknij okno dialogowe", - "error-message-title":"Wiadomość o błędzie:", - "error-details-title":"Szczegóły błędu" + "grid": { + "delete-item-title": "Czy na pewno chcesz usunąć ten element?", + "delete-item-text": "Bądź ostrożny, po potwierdzeniu tego elementu i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-items-title": "Czy na pewno chcesz usunąć {count, plural, =1 {1 pozycję} other {# pozycji} }?", + "delete-items-action-title": "Usuń {count, plural, =1 {1 pozycję} other {# pozycji} }", + "delete-items-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane elementy zostaną usunięte, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "add-item-text": "Dodaj nową pozycję", + "no-items-text": "Nie znaleziono żadnych elementów", + "item-details": "Szczegóły Przedmiotu", + "delete-item": "Usuń przedmiot", + "delete-items": "Usuń elementy", + "scroll-to-top": "Przewiń na górę" }, - "direction":{ - "column":"Kolumna", - "row":"Wiersz" + "help": { + "goto-help-page": "Przejdź do strony pomocy", + "show-help": "Pokaż pomoc" }, - "edge":{ - "edge":"Krawędź", - "edge-instances":"Instancje krawędzi", - "instances":"Instancje", - "edge-file":"Plik krawędzi", - "name-max-length":"Nazwa powinna być krótsza niż 256", - "label-max-length":"Etykieta powinna być krótsza niż 256", - "type-max-length":"Typ powinien być krótszy niż 256", - "management":"Zarządzanie krawędzią", - "no-edges-matching":"Brak krawędzi pasujących do '{{entity}}'", - "add":"Dodaj krawędź", - "no-edges-text":"Brak znalezionych krawędzi", - "edge-details":"Szczegóły krawędzi", - "add-edge-text":"Dodaj nową krawędź", - "delete":"Usuń krawędź", - "delete-edge-title":"Czy na pewno chcesz usunąć krawędź '{{edgeName}}'?", - "delete-edge-text":"Bądź ostrożny, po potwierdzeniu krawędź i wszystkie związane z nią dane staną się nieodwracalnie utracone.", - "delete-edges-title":"Czy na pewno chcesz usunąć krawędź { count, plural, =1 {1 krawędź} other {# krawędzi} }?", - "delete-edges-text":"Bądź ostrożny, po potwierdzeniu wszystkie wybrane krawędzie zostaną usunięte, a wszystkie związane z nimi dane staną się nieodwracalnie utracone.", - "name":"Nazwa", - "name-starts-with":"Nazwa krawędzi zaczyna się od", - "name-required":"Nazwa jest wymagana.", - "description":"Opis", - "details":"Szczegóły", - "events":"Zdarzenia", - "copy-id":"Kopiuj identyfikator krawędzi", - "id-copied-message":"Identyfikator krawędzi został skopiowany do schowka", - "sync":"Synchronizuj krawędź", - "edge-required":"Wymagana krawędź", - "edge-type":"Typ krawędzi", - "edge-type-required":"Wymagany jest typ krawędzi.", - "event-action":"Akcja zdarzenia", - "entity-id":"Identyfikator jednostki", - "select-edge-type":"Wybierz typ krawędzi", - "assign-to-customer":"Przypisz do klienta", - "assign-to-customer-text":"Proszę wybrać klienta, do którego przypisane będą krawędzie", - "assign-edge-to-customer":"Przypisz krawędź do klienta", - "assign-edge-to-customer-text":"Proszę wybrać krawędzie do przypisania do klienta", - "assignedToCustomer":"Przypisane do klienta", - "edge-public":"Krawędź jest publiczna", - "assigned-to-customer":"Przypisane do: {{customerTitle}}", - "unassign-from-customer":"Odłącz od klienta", - "unassign-edge-title":"Czy na pewno chcesz odłączyć krawędź '{{edgeName}}'?", - "unassign-edge-text":"Po potwierdzeniu krawędź zostanie odłączona i nie będzie dostępna dla klienta.", - "unassign-edges-title":"Czy na pewno chcesz odłączyć { count, plural, =1 {1 krawędź} other {# krawędzie} }?", - "unassign-edges-text":"Po potwierdzeniu wszystkie wybrane krawędzie zostaną odłączone i nie będą dostępne dla klienta.", - "make-public":"Udostępnij publicznie", - "make-public-edge-title":"Czy na pewno chcesz udostępnić publicznie krawędź '{{edgeName}}'?", - "make-public-edge-text":"Po potwierdzeniu krawędź i wszystkie jej dane zostaną udostępnione publicznie i będą dostępne dla innych.", - "make-private":"Udostępnij prywatnie", - "public":"Publiczne", - "make-private-edge-title":"Czy na pewno chcesz udostępnić prywatnie krawędź '{{edgeName}}'?", - "make-private-edge-text":"Po potwierdzeniu krawędź i wszystkie jej dane zostaną udostępnione prywatnie i nie będą dostępne dla innych.", - "import":"Importuj krawędź", - "install-connect-instructions":"Instrukcje instalacji i połączenia", - "install-connect-instructions-edge-created":"Krawędź utworzona! Sprawdź instrukcje instalacji i połączenia", - "loading-edge-instructions":"Ładowanie instrukcji krawędzi...", - "label":"Etykieta", - "load-entity-error":"Nie udało się załadować danych. Jednostka została usunięta.", - "assign-new-edge":"Przypisz nową krawędź", - "unassign-from-edge":"Odłącz od krawędzi", - "edge-key":"Klucz krawędzi", - "copy-edge-key":"Kopiuj klucz krawędzi", - "edge-key-copied-message":"Klucz krawędzi został skopiowany do schowka", - "edge-secret":"Sekret krawędzi", - "copy-edge-secret":"Kopiuj sekret krawędzi", - "edge-secret-copied-message":"Sekret krawędzi został skopiowany do schowka", - "manage-assets":"Zarządzaj zasobami", - "manage-devices":"Zarządzaj urządzeniami", - "manage-entity-views":"Zarządzaj widokami jednostek", - "manage-dashboards":"Zarządzaj pulpitem nawigacyjnym", - "manage-rulechains":"Zarządzaj łańcuchami reguł", - "assets":"Zasoby krawędzi", - "devices":"Urządzenia krawędziowe", - "entity-views":"Widoki jednostek krawędziowych", - "dashboard":"Pulpit nawigacyjny krawędzi", - "dashboards":"Panele nawigacyjne krawędziowe", - "rulechain-templates":"Szablony łańcucha reguł", - "edge-rulechain-templates":"Szablony łańcucha reguł krawędziowych", - "rulechains":"Łańcuchy reguł krawędziowych", - "search":"Wyszukaj krawędzie", - "selected-edges":"{ count, plural, =1 {1 krawędź} other {# krawędzie} } wybrana", - "any-edge":"Dowolna krawędź", - "no-edge-types-matching":"Brak typów krawędzi pasujących do '{{entitySubtype}}'", - "edge-type-list-empty":"Brak wybranych typów krawędzi.", - "edge-types":"Typy krawędzi", - "enter-edge-type":"Wprowadź typ krawędzi", - "deployed":"Wdrożone", - "pending":"Oczekujące", - "downlinks":"Downlinki", - "no-downlinks-prompt":"Brak znalezionych downlinków", - "sync-process-started-successfully":"Proces synchronizacji został pomyślnie uruchomiony!", - "missing-related-rule-chains-title":"Krawędź ma brakujące powiązane łańcuchy reguł", - "missing-related-rule-chains-text":"Przypisane do krawędzi łańcuchy reguł używają węzłów reguł, które przekazują wiadomości do łańcuchów reguł, które nie są przypisane do tej krawędzi.

Lista brakujących łańcuchów reguł:
{{missingRuleChains}}", - "upgrade-instructions":"Instrukcje aktualizacji", - "widget-datasource-error":"Ten widżet obsługuje tylko źródło danych krawędziowe" + "home": { + "home": "Strona główna", + "profile": "Profil", + "logout": "Wyloguj", + "menu": "Menu", + "avatar": "Awatar", + "open-user-menu": "Otwórz menu użytkownika" }, - "edge-event":{ - "type-dashboard":"Panel nawigacyjny", - "type-asset":"Zasób", - "type-device":"Urządzenie", - "type-device-profile":"Profil urządzenia", - "type-asset-profile":"Profil zasobu", - "type-entity-view":"Widok jednostki", - "type-alarm":"Alarm", - "type-rule-chain":"Łańcuch reguł", - "type-rule-chain-metadata":"Metadane łańcucha reguł", - "type-edge":"Krawędź", - "type-user":"Użytkownik", - "type-tenant":"Najemca", - "type-tenant-profile":"Profil najemcy", - "type-customer":"Klient", - "type-relation":"Relacja", - "type-widgets-bundle":"Pakiet widżetów", - "type-widgets-type":"Typ widżetu", - "type-admin-settings":"Ustawienia administratora", - "type-ota-package":"Pakiet OTA", - "type-queue":"Kolejka", - "action-type-added":"Dodane", - "action-type-deleted":"Usunięte", - "action-type-updated":"Zaktualizowane", - "action-type-post-attributes":"Opublikuj atrybuty", - "action-type-attributes-updated":"Zaktualizowane atrybuty", - "action-type-attributes-deleted":"Usunięte atrybuty", - "action-type-timeseries-updated":"Zaktualizowane serie czasowe", - "action-type-credentials-updated":"Zaktualizowane dane uwierzytelniające", - "action-type-assigned-to-customer":"Przypisane do klienta", - "action-type-unassigned-from-customer":"Odłączone od klienta", - "action-type-relation-add-or-update":"Dodaj lub aktualizuj relację", - "action-type-relation-deleted":"Usunięta relacja", - "action-type-rpc-call":"Wywołanie RPC", - "action-type-alarm-ack":"Potwierdzenie alarmu", - "action-type-alarm-clear":"Wyczyść alarm", - "action-type-alarm-assigned":"Przypisany alarm", - "action-type-alarm-unassigned":"Odłączony alarm", - "action-type-assigned-to-edge":"Przypisane do krawędzi", - "action-type-unassigned-from-edge":"Odłączone od krawędzi", - "action-type-credentials-request":"Żądanie danych uwierzytelniających", - "action-type-entity-merge-request":"Żądanie scalenia jednostki" + "file-input": { + "browse-file": "Przeglądaj plik", + "browse-files": "Przeglądaj pliki" }, - "error":{ - "unable-to-connect":"Nie można połączyć się z serwerem! Sprawdź swoje połączenie internetowe.", - "unhandled-error-code":"Niestandardowy kod błędu: {{errorCode}}", - "unknown-error":"Nieznany błąd" + "image-input": { + "drop-images-or": "Przeciągnij i upuść obrazy lub", + "drag-and-drop": "Drag & Drop", + "or": "or", + "browse": "Browse", + "no-images": "Nie wybrano żadnych obrazów", + "images": "Obrazy", + "drop-image-or": "Przeciągnij i upuść obraz lub" }, - "entity":{ - "entity":"Encja", - "entities":"Encje", - "entities-count":"Liczba encji", - "alarms-count":"Liczba alarmów", - "aliases":"Aliasy encji", - "aliases-short":"Aliasy", - "entity-alias":"Alias encji", - "unable-delete-entity-alias-title":"Nie można usunąć aliasu encji", - "unable-delete-entity-alias-text":"Alias encji '{{entityAlias}}' nie może zostać usunięty, ponieważ jest używany przez następujące widżety:
{{widgetsList}}", - "duplicate-alias-error":"Znaleziono zduplikowany alias '{{alias}}'.
Aleasy encji muszą być unikalne w obrębie deski rozdzielczej.", - "missing-entity-filter-error":"Brakuje filtru dla aliasu '{{alias}}'.", - "configure-alias":"Skonfiguruj alias '{{alias}}'", - "alias":"Alias", - "alias-required":"Wymagany jest alias encji.", - "remove-alias":"Usuń alias encji", - "add-alias":"Dodaj alias encji", - "entity-list":"Lista encji", - "entity-type":"Typ encji", - "entity-types":"Typy encji", - "entity-type-list":"Lista typów encji", - "any-entity":"Dowolna encja", - "add-entity-type":"Dodaj typ encji", - "enter-entity-type":"Wprowadź typ encji", - "no-entities-matching":"Nie znaleziono encji pasujących do '{{entity}}'.", - "no-entity-types-matching":"Nie znaleziono typów encji pasujących do '{{entityType}}'.", - "name-starts-with":"Wyrażenie nazwy", - "help-text":"Użyj '%', zgodnie z potrzebą: '%entity_name_contains%', '%entity_name_ends', 'entity_starts_with'.", - "use-entity-name-filter":"Użyj filtra", - "entity-list-empty":"Nie wybrano żadnych encji.", - "entity-type-list-required":"Należy wybrać co najmniej jeden typ encji.", - "entity-name-filter-required":"Wymagany jest filtr nazwy encji.", - "entity-name-filter-no-entity-matched":"Nie znaleziono encji rozpoczynających się od '{{entity}}'.", - "all-subtypes":"Wszystkie", - "select-entities":"Wybierz encje", - "no-aliases-found":"Nie znaleziono aliasów.", - "no-alias-matching":"'{{alias}}' nie znaleziono.", - "create-new-alias":"Utwórz nowy!", - "create-new":"Utwórz nowy", - "key":"Klucz", - "key-name":"Nazwa klucza", - "no-keys-found":"Nie znaleziono kluczy.", - "no-key-matching":"'{{key}}' nie znaleziono.", - "create-new-key":"Utwórz nowy!", - "type":"Typ", - "type-required":"Wymagany jest typ encji.", - "type-device":"Urządzenie", - "type-devices":"Urządzenia", - "list-of-devices":"{ count, plural, =1 {Jedno urządzenie} other {Lista # urządzeń} }", - "device-name-starts-with":"Urządzenia, których nazwy zaczynają się od '{{prefix}}'", - "type-device-profile":"Profil urządzenia", - "type-device-profiles":"Profile urządzeń", - "clear-selected-profiles":"Wyczyść wybrane profile", - "list-of-device-profiles":"{ count, plural, =1 {Jeden profil urządzenia} other {Lista # profili urządzeń} }", - "device-profile-name-starts-with":"Profile urządzeń, których nazwy zaczynają się od '{{prefix}}'", - "type-asset-profile":"Profil zasobów", - "type-asset-profiles":"Profile zasobów", - "list-of-asset-profiles":"{ count, plural, =1 {Jeden profil zasobów} other {Lista # profili zasobów} }", - "asset-profile-name-starts-with":"Profile zasobów, których nazwy zaczynają się od '{{prefix}}'", - "type-asset":"Zasób", - "type-assets":"Zasoby", - "list-of-assets":"{ count, plural, =1 {Jeden zasób} other {Lista # zasobów} }", - "asset-name-starts-with":"Zasoby, których nazwy zaczynają się od '{{prefix}}'", - "type-entity-view":"Widok encji", - "type-entity-views":"Widoki encji", - "list-of-entity-views":"{ count, plural, =1 {Jeden widok encji} other {Lista # widoków encji} }", - "entity-view-name-starts-with":"Widoki encji, których nazwy zaczynają się od '{{prefix}}'", - "type-rule":"Reguła", - "type-rules":"Reguły", - "list-of-rules":"{ count, plural, =1 {Jedna reguła} other {Lista # reguł} }", - "rule-name-starts-with":"Reguły, których nazwy zaczynają się od '{{prefix}}'", - "type-plugin":"Wtyczka", - "type-plugins":"Wtyczki", - "list-of-plugins":"{ count, plural, =1 {Jedna wtyczka} other {Lista # wtyczek} }", - "plugin-name-starts-with":"Wtyczki, których nazwy zaczynają się od '{{prefix}}'", - "type-tenant":"Najemca", - "type-tenants":"Najemcy", - "list-of-tenants":"{ count, plural, =1 {Jeden najemca} other {Lista # najemców} }", - "tenant-name-starts-with":"Najemcy, których nazwy zaczynają się od '{{prefix}}'", - "type-tenant-profile":"Profil najemcy", - "type-tenant-profiles":"Profile najemcy", - "list-of-tenant-profiles":"{ count, plural, =1 {Jeden profil najemcy} other {Lista # profili najemcy} }", - "tenant-profile-name-starts-with":"Profile najemcy, których nazwy zaczynają się od '{{prefix}}'", - "type-customer":"Klient", - "type-customers":"Klienci", - "list-of-customers":"{ count, plural, =1 {Jeden klient} other {Lista # klientów} }", - "customer-name-starts-with":"Klienci, których nazwy zaczynają się od '{{prefix}}'", - "type-user":"Użytkownik", - "type-users":"Użytkownicy", - "list-of-users":"{ count, plural, =1 {Jeden użytkownik} other {Lista # użytkowników} }", - "user-name-starts-with":"Użytkownicy, których nazwy zaczynają się od '{{prefix}}'", - "type-dashboard":"Deska rozdzielcza", - "type-dashboards":"Deski rozdzielcze", - "list-of-dashboards":"{ count, plural, =1 {Jedna deska rozdzielcza} other {Lista # desek rozdzielczych} }", - "dashboard-name-starts-with":"Deski rozdzielcze, których nazwy zaczynają się od '{{prefix}}'", - "type-alarm":"Alarm", - "type-alarms":"Alarmy", - "list-of-alarms":"{ count, plural, =1 {Jeden alarm} other {Lista # alarmów} }", - "alarm-name-starts-with":"Alarmy, których nazwy zaczynają się od '{{prefix}}'", - "type-rulechain":"Łańcuch reguł", - "type-rulechains":"Łańcuchy reguł", - "list-of-rulechains":"{ count, plural, =1 {Jeden łańcuch reguł} other {Lista # łańcuchów reguł} }", - "rulechain-name-starts-with":"Łańcuchy reguł, których nazwy zaczynają się od '{{prefix}}'", - "type-rulenode":"Węzeł reguły", - "type-rulenodes":"Węzły reguł", - "list-of-rulenodes":"{ count, plural, =1 {Jeden węzeł reguły} other {Lista # węzłów reguł} }", - "rulenode-name-starts-with":"Węzły reguł, których nazwy zaczynają się od '{{prefix}}'", - "type-current-customer":"Bieżący Klient", - "type-current-tenant":"Bieżący Najemca", - "type-current-user":"Bieżący Użytkownik", - "type-current-user-owner":"Bieżący Właściciel Użytkownika", - "type-widgets-bundle":"Zestaw Widżetów", - "type-widgets-bundles":"Zestawy Widżetów", - "list-of-widgets-bundles":"{ count, plural, =1 {Jeden zestaw widżetów} other {Lista # zestawów widżetów} }", - "type-widget":"Widżet", - "type-widgets":"Widżety", - "list-of-widgets":"{ count, plural, =1 {Jeden widżet} other {Lista # widżetów} }", - "search":"Szukaj jednostek", - "selected-entities":"{ count, plural, =1 {1 jednostka} other {# jednostki} } wybranych", - "entity-name":"Nazwa jednostki", - "entity-label":"Etykieta jednostki", - "details":"Szczegóły jednostki", - "no-entities-prompt":"Nie znaleziono jednostek", - "no-data":"Brak danych do wyświetlenia", - "columns-to-display":"Kolumny do wyświetlenia", - "type-api-usage-state":"Stan korzystania z API", - "type-edge":"Edge", - "type-edges":"Edges", - "list-of-edges":"{ count, plural, =1 {Jeden edge} other {Lista # edges} }", - "edge-name-starts-with":"Edges, których nazwy zaczynają się od '{{prefix}}'", - "type-tb-resource":"Zasób", - "type-tb-resources":"Zasoby", - "list-of-tb-resources":"{ count, plural, =1 {Jeden zasób} other {Lista # zasobów} }", - "type-ota-package":"Pakiet OTA", - "type-rpc":"RPC", - "type-queue":"Kolejka", - "type-notification":"Powiadomienie", - "type-notification-rule":"Reguła powiadomień", - "type-notification-rules":"Reguły powiadomień", - "list-of-notification-rules":"{ count, plural, =1 {Jedna reguła powiadomień} other {Lista # reguł powiadomień} }", - "type-notification-target":"Odbiorca powiadomienia", - "type-notification-targets":"Odbiorcy powiadomień", - "list-of-notification-targets":"{ count, plural, =1 {Jeden odbiorca powiadomienia} other {Lista # odbiorców powiadomień} }", - "type-notification-request":"Żądanie powiadomienia", - "type-notification-template":"Szablon powiadomienia", - "type-notification-templates":"Szablony powiadomień", - "list-of-notification-templates":"{ count, plural, =1 {Jeden szablon powiadomienia} other {Lista # szablonów powiadomień} }" - }, - "entity-field":{ - "created-time":"Czas utworzenia", - "name":"Nazwa", - "type":"Typ", - "first-name":"Imię", - "last-name":"Nazwisko", - "email":"E-mail", - "title":"Tytuł", - "country":"Kraj", - "state":"Stan", - "city":"Miasto", - "address":"Adres", - "address2":"Adres 2", - "zip":"Kod pocztowy", - "phone":"Telefon", - "label":"Etykieta" - }, - "entity-view":{ - "entity-view":"Widok encji", - "entity-view-required":"Widok encji jest wymagany.", - "entity-views":"Widoki encji", - "management":"Zarządzanie widokiem encji", - "view-entity-views":"Wyświetl widoki encji", - "entity-view-alias":"Alias widoku encji", - "aliases":"Aliasy widoku encji", - "no-alias-matching":"'{{alias}}' nie znaleziono.", - "no-aliases-found":"Nie znaleziono aliasów.", - "no-key-matching":"'{{key}}' nie znaleziono.", - "no-keys-found":"Nie znaleziono kluczy.", - "create-new-alias":"Utwórz nowy!", - "create-new-key":"Utwórz nowy!", - "duplicate-alias-error":"Znaleziono zduplikowany alias '{{alias}}'.
Aliasy widoku encji muszą być unikalne w obrębie panelu.", - "configure-alias":"Konfiguruj alias '{{alias}}'", - "no-entity-views-matching":"Brak widoków encji pasujących do '{{entity}}'.", - "public":"Publiczny", - "alias":"Alias", - "alias-required":"Wymagany jest alias widoku encji.", - "remove-alias":"Usuń alias widoku encji", - "add-alias":"Dodaj alias widoku encji", - "name-starts-with":"Wyrażenie nazwy widoku encji", - "help-text":"Użyj '%' według potrzeb: '%entity-view_name_contains%', '%entity-view_name_ends', 'entity-view_starts_with'.", - "entity-view-list":"Lista widoków encji", - "use-entity-view-name-filter":"Użyj filtra", - "entity-view-list-empty":"Brak wybranych widoków encji.", - "entity-view-name-filter-required":"Wymagany jest filtr nazwy widoku encji.", - "entity-view-name-filter-no-entity-view-matched":"Nie znaleziono widoków encji rozpoczynających się od '{{entityView}}'.", - "add":"Dodaj widok encji", - "entity-view-public":"Widok encji jest publiczny", - "assign-to-customer":"Przypisz do klienta", - "assign-entity-view-to-customer":"Przypisz Widoki Encji Do Klienta", - "assign-entity-view-to-customer-text":"Wybierz widoki encji do przypisania do klienta", - "assign-entity-view-to-edge-title":"Przypisz Widoki Encji Do Krawędzi", - "no-entity-views-text":"Nie znaleziono widoków encji", - "assign-to-customer-text":"Wybierz klienta, do którego chcesz przypisać widoki encji", - "entity-view-details":"Szczegóły widoku encji", - "add-entity-view-text":"Dodaj nowy widok encji", - "delete":"Usuń widok encji", - "assign-entity-views":"Przypisz widoki encji", - "assign-entity-views-text":"Przypisz { count, plural, =1 {1 widok encji} other {# widoków encji} } do klienta", - "delete-entity-views":"Usuń widoki encji", - "unassign-from-customer":"Odłącz od klienta", - "unassign-entity-views":"Odłącz widoki encji", - "unassign-entity-views-action-title":"Odłącz { count, plural, =1 {1 widok encji} other {# widoków encji} } od klienta", - "assign-new-entity-view":"Przypisz nowy widok encji", - "delete-entity-view-title":"Czy na pewno chcesz usunąć widok encji '{{entityViewName}}'?", - "delete-entity-view-text":"Bądź ostrożny, po potwierdzeniu widok encji i wszystkie związane z nim dane staną się nieodwracalnie utracone.", - "delete-entity-views-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 widok encji} other {# widoków encji} }?", - "delete-entity-views-action-title":"Usuń { count, plural, =1 {1 widok encji} other {# widoków encji} }", - "delete-entity-views-text":"Bądź ostrożny, po potwierdzeniu wszystkie wybrane widoki encji zostaną usunięte, a wszystkie związane z nimi dane staną się nieodwracalnie utracone.", - "unassign-entity-view-title":"Czy na pewno chcesz odłączyć widok encji '{{entityViewName}}'?", - "unassign-entity-view-text":"Po potwierdzeniu widok encji zostanie odłączony i nie będzie dostępny dla klienta.", - "unassign-entity-view":"Odłącz widok encji", - "unassign-entity-views-title":"Czy na pewno chcesz odłączyć { count, plural, =1 {1 widok encji} other {# widoków encji} }?", - "unassign-entity-views-text":"Po potwierdzeniu wszystkie wybrane widoki encji zostaną odłączone i nie będą dostępne dla klienta.", - "entity-view-type":"Typ widoku encji", - "entity-view-type-required":"Wymagany jest typ widoku encji.", - "select-entity-view-type":"Wybierz typ widoku encji", - "enter-entity-view-type":"Wprowadź typ widoku encji", - "any-entity-view":"Dowolny widok encji", - "no-entity-view-types-matching":"Brak typów widoków encji pasujących do '{{entitySubtype}}'.", - "entity-view-type-list-empty":"Brak wybranych typów widoków encji.", - "entity-view-types":"Typy widoków encji", - "created-time":"Czas utworzenia", - "name":"Nazwa", - "name-required":"Nazwa jest wymagana.", - "name-max-length":"Nazwa powinna mieć mniej niż 256 znaków.", - "type-max-length":"Typ widoku jednostki powinien mieć mniej niż 256 znaków.", - "description":"Opis", - "events":"Zdarzenia", - "details":"Szczegóły", - "copyId":"Kopiuj identyfikator widoku jednostki", - "idCopiedMessage":"Identyfikator widoku jednostki został skopiowany do schowka.", - "assignedToCustomer":"Przypisane do klienta", - "unable-entity-view-device-alias-title":"Nie można usunąć aliasu widoku jednostki", - "unable-entity-view-device-alias-text":"Alias urządzenia '{{entityViewAlias}}' nie może zostać usunięty, ponieważ jest używany przez następujące widgety:
{{widgetsList}}", - "select-entity-view":"Wybierz widok jednostki", - "make-public":"Udostępnij widok jednostki publicznie", - "make-private":"Udostępnij widok jednostki prywatnie", - "start-date":"Data rozpoczęcia", - "start-ts":"Czas rozpoczęcia", - "end-date":"Data zakończenia", - "end-ts":"Czas zakończenia", - "date-limits":"Ograniczenia dat", - "client-attributes":"Atrybuty klienta", - "shared-attributes":"Współdzielone atrybuty", - "server-attributes":"Atrybuty serwera", - "timeseries":"Szereg czasowy", - "client-attributes-placeholder":"Atrybuty klienta", - "shared-attributes-placeholder":"Współdzielone atrybuty", - "server-attributes-placeholder":"Atrybuty serwera", - "timeseries-placeholder":"Szereg czasowy", - "target-entity":"Docelowa jednostka", - "attributes-propagation":"Propagacja atrybutów", - "attributes-propagation-hint":"Widok jednostki będzie automatycznie kopiować określone atrybuty z Docelowej Jednostki za każdym razem, gdy zapisujesz lub aktualizujesz ten widok jednostki. Ze względów wydajnościowych atrybuty Docelowej Jednostki nie są propagowane do widoku jednostki przy każdej zmianie atrybutu. Możesz włączyć automatyczną propagację, konfigurując węzeł reguły „kopiuj do widoku” w swoim łańcuchu reguł i łącząc wiadomości „Post attributes” i „Attributes Updated” z nowym węzłem reguły.", - "timeseries-data":"Dane szeregu czasowego", - "timeseries-data-hint":"Skonfiguruj klucze danych szeregu czasowego Docelowej Jednostki, które będą dostępne w widoku jednostki. Te dane szeregu czasowego są tylko do odczytu.", - "search":"Szukaj widoków jednostki", - "selected-entity-views":"{ count, plural, =1 {1 widok jednostki} other {# widoki jednostki} } wybrano", - "make-public-entity-view-title":"Czy na pewno chcesz udostępnić widok jednostki '{{entityViewName}}' publicznie?", - "make-public-entity-view-text":"Po potwierdzeniu widok jednostki i wszystkie jego dane staną się publiczne i dostępne dla innych.", - "make-private-entity-view-title":"Czy na pewno chcesz uczynić widok jednostki '{{entityViewName}}' prywatnym?", - "make-private-entity-view-text":"Po potwierdzeniu widok jednostki i wszystkie jego dane staną się prywatne i nie będą dostępne dla innych.", - "assign-entity-view-to-edge":"Przypisz widok jednostki do urządzenia", - "assign-entity-view-to-edge-text":"Wybierz widoki jednostki do przypisania do urządzenia", - "unassign-entity-view-from-edge-title":"Czy na pewno chcesz odpiąć widok jednostki '{{entityViewName}}'?", - "unassign-entity-view-from-edge-text":"Po potwierdzeniu widok jednostki zostanie odpięty i nie będzie dostępny dla urządzenia.", - "unassign-entity-views-from-edge-action-title":"Odpiąć { count, plural, =1 {1 widok jednostki} other {# widoki jednostki} } od urządzenia", - "unassign-entity-view-from-edge":"Odpiąć widok jednostki", - "unassign-entity-views-from-edge-title":"Czy na pewno chcesz odpiąć { count, plural, =1 {1 widok jednostki} other {# widoki jednostki} }?", - "unassign-entity-views-from-edge-text":"Po potwierdzeniu wszystkie wybrane widoki jednostki zostaną odpięte i nie będą dostępne dla urządzenia." - }, - "event":{ - "event-type":"Typ zdarzenia", - "events-filter":"Filtr zdarzeń", - "clean-events":"Wyczyść zdarzenia", - "type-error":"Błąd", - "type-lc-event":"Zdarzenie cyklu życia", - "type-stats":"Statystyki", - "type-debug-rule-node":"Debug", - "type-debug-rule-chain":"Debug", - "no-events-prompt":"Nie znaleziono zdarzeń", - "error":"Błąd", - "alarm":"Alarm", - "event-time":"Czas zdarzenia", - "server":"Serwer", - "body":"Treść", - "method":"Metoda", - "type":"Typ", - "message":"Wiadomość", - "message-id":"Identyfikator wiadomości", - "copy-message-id":"Kopiuj identyfikator wiadomości", - "message-type":"Typ wiadomości", - "data-type":"Typ danych", - "relation-type":"Typ relacji", - "metadata":"Metadane", - "data":"Dane", - "event":"Zdarzenie", - "status":"Status", - "success":"Sukces", - "failed":"Niepowodzenie", - "messages-processed":"Wiadomości przetworzone", - "max-messages-processed":"Maksymalna ilość wiadomości przetworzonych", - "min-messages-processed":"Minimalna ilość wiadomości przetworzonych", - "errors-occurred":"Wystąpiły błędy", - "max-errors-occurred":"Maksymalna ilość wystąpiłych błędów", - "min-errors-occurred":"Minimalna ilość wystąpiłych błędów", - "min-value":"Minimalna wartość to 0.", - "all-events":"Wszystkie", - "has-error":"Zawiera błąd", - "entity-id":"Identyfikator jednostki", - "copy-entity-id":"Kopiuj identyfikator jednostki", - "entity-type":"Typ jednostki", - "clear-filter":"Wyczyść filtr", - "clear-request-title":"Wyczyść wszystkie zdarzenia", - "clear-request-text":"Czy na pewno chcesz wyczyścić wszystkie zdarzenia?", - "started":"Rozpoczęte", - "updated":"Zaktualizowane", - "stopped":"Zatrzymane" - }, - "extension":{ - "extensions":"Rozszerzenia", - "selected-extensions":"{ count, plural, =1 {1 rozszerzenie} other {# rozszerzeń} } wybranych", - "type":"Typ", - "key":"Klucz", - "value":"Wartość", - "id":"Identyfikator", - "extension-id":"Identyfikator rozszerzenia", - "extension-type":"Typ rozszerzenia", - "transformer-json":"JSON *", - "unique-id-required":"Identyfikator rozszerzenia już istnieje.", - "delete":"Usuń rozszerzenie", - "add":"Dodaj rozszerzenie", - "edit":"Edytuj rozszerzenie", - "delete-extension-title":"Czy na pewno chcesz usunąć rozszerzenie '{{extensionId}}'?", - "delete-extension-text":"Bądź ostrożny, po potwierdzeniu rozszerzenie i wszystkie związane z nim dane staną się nieodwracalnie utracone.", - "delete-extensions-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 rozszerzenie} other {# rozszerzeń} }?", - "delete-extensions-text":"Bądź ostrożny, po potwierdzeniu wszystkie wybrane rozszerzenia zostaną usunięte.", - "converters":"Konwertery", - "converter-id":"Identyfikator konwertera", - "configuration":"Konfiguracja", - "converter-configurations":"Konfiguracje konwertera", - "token":"Token bezpieczeństwa", - "add-converter":"Dodaj konwerter", - "add-config":"Dodaj konfigurację konwertera", - "device-name-expression":"Wyrażenie nazwy urządzenia", - "device-type-expression":"Wyrażenie typu urządzenia", - "custom":"Niestandardowe", - "to-double":"Do Double", - "transformer":"Transformator", - "json-required":"Wymagany jest JSON transformatora.", - "json-parse":"Nie można sparsować JSON transformatora.", - "attributes":"Atrybuty", - "add-attribute":"Dodaj atrybut", - "add-map":"Dodaj element mapowania", - "timeseries":"Szereg czasowy", - "add-timeseries":"Dodaj szereg czasowy", - "field-required":"Pole jest wymagane", - "brokers":"Brokerzy", - "add-broker":"Dodaj brokera", - "host":"Host", - "port":"Port", - "port-range":"Port powinien mieć zakres od 1 do 65535.", - "ssl":"SSL", - "credentials":"Dane uwierzytelniające", - "username":"Nazwa użytkownika", - "password":"Hasło", - "retry-interval":"Interwał ponawiania w milisekundach", - "anonymous":"Anonimowy", - "basic":"Podstawowy", - "pem":"PEM", - "ca-cert":"Plik certyfikatu CA *", - "private-key":"Plik klucza prywatnego *", - "cert":"Plik certyfikatu *", - "no-file":"Nie wybrano pliku.", - "drop-file":"Upuść plik lub kliknij, aby wybrać plik do przesłania.", - "mapping":"Mapowanie", - "topic-filter":"Filtr tematów", - "converter-type":"Typ konwertera", - "converter-json":"Json", - "json-name-expression":"Wyrażenie nazwy urządzenia JSON", - "topic-name-expression":"Wyrażenie nazwy tematu urządzenia", - "json-type-expression":"Wyrażenie typu urządzenia JSON", - "topic-type-expression":"Wyrażenie typu tematu urządzenia", - "attribute-key-expression":"Wyrażenie klucza atrybutu", - "attr-json-key-expression":"Wyrażenie klucza JSON atrybutu", - "attr-topic-key-expression":"Wyrażenie klucza tematu atrybutu", - "request-id-expression":"Wyrażenie identyfikatora żądania", - "request-id-json-expression":"Wyrażenie identyfikatora JSON żądania", - "request-id-topic-expression":"Wyrażenie identyfikatora tematu żądania", - "response-topic-expression":"Wyrażenie tematu odpowiedzi", - "value-expression":"Wyrażenie wartości", - "topic":"Temat", - "timeout":"Timeout w milisekundach", - "converter-json-required":"Wymagany jest JSON konwertera.", - "converter-json-parse":"Nie można sparsować JSON konwertera.", - "filter-expression":"Wyrażenie filtru", - "connect-requests":"Żądania połączenia", - "add-connect-request":"Dodaj żądanie połączenia", - "disconnect-requests":"Żądania rozłączenia", - "add-disconnect-request":"Dodaj żądanie rozłączenia", - "attribute-requests":"Żądania atrybutów", - "add-attribute-request":"Dodaj żądanie atrybutu", - "attribute-updates":"Aktualizacje atrybutów", - "add-attribute-update":"Dodaj aktualizację atrybutu", - "server-side-rpc":"RPC po stronie serwera", - "add-server-side-rpc-request":"Dodaj żądanie RPC po stronie serwera", - "device-name-filter":"Filtr nazwy urządzenia", - "attribute-filter":"Filtr atrybutu", - "method-filter":"Filtr metody", - "request-topic-expression":"Wyrażenie tematu żądania", - "response-timeout":"Timeout odpowiedzi w milisekundach", - "topic-expression":"Wyrażenie tematu", - "client-scope":"Zakres klienta", - "add-device":"Dodaj urządzenie", - "opc-server":"Serwery OPC", - "opc-add-server":"Dodaj serwer OPC", - "opc-add-server-prompt":"Proszę dodać serwer OPC", - "opc-application-name":"Nazwa aplikacji", - "opc-application-uri":"URI aplikacji", - "opc-scan-period-in-seconds":"Okres skanowania w sekundach", - "opc-security":"Bezpieczeństwo", - "opc-identity":"Tożsamość", - "opc-keystore":"Schronisko klucza", - "opc-type":"Typ", - "opc-keystore-type":"Typ schroniska klucza", - "opc-keystore-location":"Lokalizacja *", - "opc-keystore-password":"Hasło", - "opc-keystore-alias":"Alias", - "opc-keystore-key-password":"Hasło klucza", - "opc-device-node-pattern":"Wzorzec węzła urządzenia", - "opc-device-name-pattern":"Wzorzec nazwy urządzenia", - "modbus-server":"Serwery/slave'y Modbus", - "modbus-add-server":"Dodaj serwer/slave'a Modbus", - "modbus-add-server-prompt":"Proszę dodać serwer/slave'a Modbus", - "modbus-transport":"Transport", - "modbus-tcp-reconnect":"Automatyczne ponowne połączenie", - "modbus-rtu-over-tcp":"RTU przez TCP", - "modbus-port-name":"Nazwa portu szeregowego", - "modbus-encoding":"Kodowanie", - "modbus-parity":"Parzystość", - "modbus-baudrate":"Prędkość transmisji", - "modbus-databits":"Bity danych", - "modbus-stopbits":"Bity stopu", - "modbus-databits-range":"Bity danych powinny mieć zakres od 7 do 8.", - "modbus-stopbits-range":"Bity stopu powinny mieć zakres od 1 do 2.", - "modbus-unit-id":"Identyfikator jednostki", - "modbus-unit-id-range":"Identyfikator jednostki powinien mieć zakres od 1 do 247.", - "modbus-device-name":"Nazwa urządzenia", - "modbus-poll-period":"Okres sondowania (ms)", - "modbus-attributes-poll-period":"Okres sondowania atrybutów (ms)", - "modbus-timeseries-poll-period":"Okres sondowania szeregów czasowych (ms)", - "modbus-poll-period-range":"Okres sondowania powinien być wartością dodatnią.", - "modbus-tag":"Tag", - "modbus-function":"Funkcja", - "modbus-register-address":"Adres rejestru", - "modbus-register-address-range":"Adres rejestru powinien mieć zakres od 0 do 65535.", - "modbus-register-bit-index":"Indeks bitu", - "modbus-register-bit-index-range":"Indeks bitu powinien mieć zakres od 0 do 15.", - "modbus-register-count":"Liczba rejestrów", - "modbus-register-count-range":"Liczba rejestrów powinna być wartością dodatnią.", - "modbus-byte-order":"Kolejność bajtów", - "sync":{ - "status":"Status", - "sync":"Synchronizowane", - "not-sync":"Niesynchronizowane", - "last-sync-time":"Ostatnia synchronizacja", - "not-available":"Niedostępne" + "import": { + "no-file": "Nie wybrano pliku", + "drop-file": "Upuść plik JSON lub kliknij, aby wybrać plik do przesłania.", + "drop-csv-file": "Upuść plik CSV lub kliknij, aby wybrać plik do przesłania.", + "drop-json-file-or": "Przeciągnij i upuść plik JSON lub", + "drop-file-csv": "Upuść plik CSV lub kliknij, aby wybrać plik do przesłania.", + "drop-file-csv-or": "Przeciągnij i upuść plik CSV lub", + "column-value": "Wartość", + "column-title": "Tytuł", + "column-example": "Przykładowe dane wartości", + "column-key": "Klucz atrybutu/telemetrii", + "credentials": "Dane uwierzytelniające", + "csv-delimiter": "Ogranicznik CSV", + "csv-first-line-header": "Pierwsza linia zawiera nazwy kolumn", + "csv-update-data": "Zaktualizuj atrybuty/telemetrię", + "details": "Szczegóły", + "import-csv-number-columns-error": "Plik powinien zawierać co najmniej dwie kolumny", + "import-csv-invalid-format-error": "Nieprawidłowy format pliku. {{line}}'", + "column-type": { + "name": "Nazwa", + "type": "Typ", + "label": "Etykieta", + "column-type": "Typ kolumny", + "client-attribute": "Atrybut klienta", + "shared-attribute": "Wspólny atrybut", + "server-attribute": "Atrybut serwera", + "timeseries": "Szereg czasowy", + "entity-field": "Pole obiektu", + "access-token": "Token dostępu", + "x509": "X.509", + "mqtt": { + "client-id": "Identyfikator klienta MQTT", + "user-name": "Nazwa użytkownika MQTT", + "password": "Hasło MQTT" + }, + "lwm2m": { + "client-endpoint": "Nazwa klienta punktu końcowego LwM2M", + "security-config-mode": "Tryb konfiguracji zabezpieczeń LwM2M", + "client-identity": "Tożsamość klienta LwM2M", + "client-key": "Klucz klienta LwM2M", + "client-cert": "Klucz publiczny klienta LwM2M", + "bootstrap-server-security-mode": "Tryb bezpieczeństwa serwera startowego LwM2M", + "bootstrap-server-secret-key": "Tajny klucz serwera startowego LwM2M", + "bootstrap-server-public-key-id": "Klucz publiczny lub identyfikator serwera ładowania początkowego LwM2M", + "lwm2m-server-security-mode": "Tryb bezpieczeństwa serwera LwM2M", + "lwm2m-server-secret-key": "Tajny klucz serwera LwM2M", + "lwm2m-server-public-key-id": "Klucz publiczny lub identyfikator serwera LwM2M" + }, + "snmp": { + "host": "SNMP host", + "port": "SNMP port", + "version": "SNMP version (v1, v2c or v3)", + "community-string": "SNMP community string" + }, + "isgateway": "Czy Gateway", + "activity-time-from-gateway-device": "Czas aktywności z Gateway", + "description": "Opis", + "edge-license-key": "Klucz licencyjny", + "cloud-endpoint": "Punkt końcowy w chmurze", + "routing-key": "Klucz Edge", + "secret": "Edge secret" }, - "export-extensions-configuration":"Eksportuj konfigurację rozszerzeń", - "import-extensions-configuration":"Importuj konfigurację rozszerzeń", - "import-extensions":"Importuj rozszerzenia", - "import-extension":"Importuj rozszerzenie", - "export-extension":"Eksportuj rozszerzenie", - "file":"Plik rozszerzeń", - "invalid-file-error":"Błąd - nieprawidłowy plik rozszerzenia" - }, - "feature":{ - "advanced-features":"Zaawansowane funkcje" - }, - "filter":{ - "add":"Dodaj filtr", - "edit":"Edytuj filtr", - "name":"Nazwa filtra", - "name-required":"Wymagana nazwa filtra.", - "duplicate-filter":"Filtr o tej samej nazwie już istnieje.", - "filters":"Filtry", - "unable-delete-filter-title":"Nie można usunąć filtra", - "unable-delete-filter-text":"Nie można usunąć filtra '{{filter}}', ponieważ jest używany przez następujące widżety:
{{widgetsList}}", - "duplicate-filter-error":"Znaleziono zduplikowany filtr '{{filter}}'.
Filtry muszą być unikalne w obrębie pulpitu nawigacyjnego.", - "missing-key-filters-error":"Kluczowe filtry są brakujące w filtrze '{{filter}}'.", - "filter":"Filtr", - "editable":"Możliwość edycji", - "no-filters-found":"Nie znaleziono filtrów.", - "no-filter-text":"Brak określonego filtra", - "add-filter-prompt":"Proszę dodać filtr", - "no-filter-matching":"'{{filter}}' nie znaleziono.", - "create-new-filter":"Utwórz nowy!", - "create-new":"Utwórz nowy", - "filter-required":"Filtr jest wymagany.", - "operation":{ - "operation":"Operacja", - "equal":"równa się", - "not-equal":"nie równa się", - "starts-with":"zaczyna się od", - "ends-with":"kończy się na", - "contains":"zawiera", - "not-contains":"nie zawiera", - "greater":"większa niż", - "less":"mniejsza niż", - "greater-or-equal":"większa lub równa", - "less-or-equal":"mniejsza lub równa", - "and":"i", - "or":"lub", - "in":"w", - "not-in":"nie w" + "stepper-text": { + "select-file": "Wybierz plik", + "configuration": "Importuj konfigurację", + "column-type": "Wybierz typ kolumn", + "creat-entities": "Tworzenie nowych obiektów" }, - "ignore-case":"ignoruj wielkość liter", - "value":"Wartość", - "remove-filter":"Usuń filtr", - "duplicate-filter-action":"Zduplikuj filtr", - "preview":"Podgląd filtra", - "no-filters":"Brak skonfigurowanych filtrów", - "add-filter":"Dodaj filtr", - "add-complex-filter":"Dodaj filtr złożony", - "add-complex":"Dodaj złożony", - "complex-filter":"Filtr złożony", - "edit-complex-filter":"Edytuj filtr złożony", - "edit-filter-user-params":"Edytuj parametry użytkownika predykatu filtra", - "filter-user-params":"Parametry użytkownika predykatu filtra", - "user-parameters":"Parametry użytkownika", - "display-label":"Etykieta do wyświetlenia", - "autogenerated-label":"Automatycznie generowana etykieta", - "order-priority":"Priorytet porządkowania pola", - "key-filter":"Filtr klucza", - "key-filters":"Filtry klucza", - "key-name":"Nazwa klucza", - "key-name-required":"Wymagana jest nazwa klucza.", - "key-type":{ - "key-type":"Typ klucza", - "attribute":"Atrybut", - "timeseries":"Szereg czasowy", - "entity-field":"Pole encji", - "constant":"Stała", - "client-attribute":"Atrybut klienta", - "server-attribute":"Atrybut serwera", - "shared-attribute":"Atrybut wspólny" - }, - "value-type":{ - "value-type":"Value type", - "string":"String", - "numeric":"Numeric", - "boolean":"Boolean", - "date-time":"Datetime" - }, - "value-type-required":"Wymagany jest typ wartości klucza.", - "key-value-type-change-title":"Czy na pewno chcesz zmienić typ wartości klucza?", - "key-value-type-change-message":"Jeśli potwierdzisz nowy typ wartości, wszystkie wprowadzone filtry klucza zostaną usunięte.", - "no-key-filters":"Brak skonfigurowanych filtrów klucza", - "add-key-filter":"Dodaj filtr klucza", - "remove-key-filter":"Usuń filtr klucza", - "edit-key-filter":"Edytuj filtr klucza", - "date":"Data", - "time":"Czas", - "current-tenant":"Bieżący najemca", - "current-customer":"Bieżący klient", - "current-user":"Bieżący użytkownik", - "current-device":"Bieżące urządzenie", - "default-value":"Wartość domyślna", - "dynamic-source-type":"Typ źródła dynamicznego", - "dynamic-value":"Wartość dynamiczna", - "no-dynamic-value":"Brak wartości dynamicznej", - "source-attribute":"Atrybut źródła", - "switch-to-dynamic-value":"Przełącz na wartość dynamiczną", - "switch-to-default-value":"Przełącz na wartość domyślną", - "inherit-owner":"Dziedzicz od właściciela", - "source-attribute-not-set":"Jeśli atrybut źródła nie jest ustawiony" - }, - "fullscreen":{ - "expand":"Rozwiń na pełny ekran", - "exit":"Wyjdź z trybu pełnoekranowego", - "toggle":"Przełącz tryb pełnoekranowy", - "fullscreen":"Pełny ekran" - }, - "function":{ - "function":"Funkcja" - }, - "gateway":{ - "add-entry":"Dodaj konfigurację", - "advanced":"Zaawansowane", - "checking-device-activity":"Sprawdzanie aktywności urządzenia", - "command":"Komendy Docker", - "command-copied-message":"Komenda Docker została skopiowana do schowka", - "configuration":"Konfiguracja", - "connector-add":"Dodaj nowy konektor", - "connector-enabled":"Włącz konektor", - "connector-name":"Nazwa konektora", - "connector-name-required":"Nazwa konektora jest wymagana.", - "connector-type":"Typ konektora", - "connector-type-required":"Typ konektora jest wymagany.", - "connectors":"Konektory", - "connectors-config":"Konfiguracja konektorów", - "connectors-table-enabled":"Włączony", - "connectors-table-name":"Nazwa", - "connectors-table-type":"Typ", - "connectors-table-status":"Status", - "connectors-table-actions":"Akcje", - "connectors-table-key":"Klucz", - "connectors-table-class":"Klasa", - "rpc-command-send":"Wyślij", - "rpc-command-result":"Odpowiedź", - "rpc-command-edit-params":"Edytuj parametry", - "gateway-configuration":"Konfiguracja ogólna", - "docker-label":"Użyj poniższej instrukcji, aby uruchomić bramę IoT w Docker Compose z uwierzytelnieniem dla wybranego urządzenia", - "install-docker-compose":"Skorzystaj z instrukcji, aby pobrać, zainstalować i skonfigurować Docker Compose", - "download-configuration-file":"Pobierz plik konfiguracyjny", - "download-docker-compose":"Pobierz plik docker-compose.yml dla Twojej bramy", - "launch-gateway":"Uruchom bramę", - "launch-docker-compose":"Uruchom bramę, używając poniższej komendy w terminalu z folderu zawierającego plik docker-compose.yml", - "create-new-gateway":"Utwórz nową bramę", - "create-new-gateway-text":"Jesteś pewien, że chcesz utworzyć nową bramę o nazwie: '{{gatewayName}}'?", - "created-time":"Czas utworzenia", - "configuration-delete-dialog-header":"Konfiguracje zostaną usunięte", - "configuration-delete-dialog-body":"Wyłączenie Konfiguracji Zdalnej jest możliwe tylko przy fizycznym dostępie do Bramy. Wszystkie wcześniejsze konfiguracje zostaną usunięte.

\nAby wyłączyć konfigurację, wprowadź poniżej nazwę Bramy", - "configuration-delete-dialog-input":"Nazwa Bramy", - "configuration-delete-dialog-input-required":"Nazwa Bramy jest obowiązkowa", - "configuration-delete-dialog-confirm":"Wyłącz", - "delete":"Usuń konfigurację", - "download-tip":"Pobierz plik konfiguracyjny", - "drop-file":"Upuść plik tutaj lub", - "gateway":"Brama", - "gateway-exists":"Urządzenie o tej samej nazwie już istnieje.", - "gateway-name":"Nazwa Bramy", - "gateway-name-required":"Nazwa Bramy jest wymagana.", - "gateway-saved":"Konfiguracja Bramy została pomyślnie zapisana.", - "grpc":"GRPC", - "grpc-keep-alive-timeout":"Limit czasu Keep Alive (w ms)", - "grpc-keep-alive-timeout-required":"Limit czasu Keep Alive jest wymagany", - "grpc-keep-alive-timeout-min":"Limit czasu Keep Alive nie może być mniejszy niż 1", - "grpc-keep-alive-timeout-pattern":"Limit czasu Keep Alive jest nieprawidłowy", - "grpc-keep-alive":"Keep Alive (w ms)", - "grpc-keep-alive-required":"Keep Alive jest wymagany", - "grpc-keep-alive-min":"Keep Alive nie może być mniejszy niż 1", - "grpc-keep-alive-pattern":"Keep Alive jest nieprawidłowy", - "grpc-min-time-between-pings":"Minimalny czas między pingami (w ms)", - "grpc-min-time-between-pings-required":"Minimalny czas między pingami jest wymagany", - "grpc-min-time-between-pings-min":"Minimalny czas między pingami nie może być mniejszy niż 1", - "grpc-min-time-between-pings-pattern":"Minimalny czas między pingami jest nieprawidłowy", - "grpc-min-ping-interval-without-data":"Minimalny interwał pingowania bez danych (w ms)", - "grpc-min-ping-interval-without-data-required":"Minimalny interwał pingowania bez danych jest wymagany", - "grpc-min-ping-interval-without-data-min":"Minimalny interwał pingowania bez danych nie może być mniejszy niż 1", - "grpc-min-ping-interval-without-data-pattern":"Minimalny interwał pingowania bez danych jest nieprawidłowy", - "grpc-max-pings-without-data":"Maksymalna liczba pingów bez danych", - "grpc-max-pings-without-data-required":"Maksymalna liczba pingów bez danych jest wymagana", - "grpc-max-pings-without-data-min":"Maksymalna liczba pingów bez danych nie może być mniejsza niż 1", - "grpc-max-pings-without-data-pattern":"Maksymalna liczba pingów bez danych jest nieprawidłowa", - "inactivity-check-period-seconds":"Okres sprawdzania braku aktywności (w sekundach)", - "inactivity-check-period-seconds-required":"Okres sprawdzania braku aktywności jest wymagany", - "inactivity-check-period-seconds-min":"Okres sprawdzania braku aktywności nie może być mniejszy niż 1", - "inactivity-check-period-seconds-pattern":"Okres sprawdzania braku aktywności jest nieprawidłowy", - "inactivity-timeout-seconds":"Okres braku aktywności (w sekundach)", - "inactivity-timeout-seconds-required":"Okres braku aktywności jest wymagany", - "inactivity-timeout-seconds-min":"Okres braku aktywności nie może być mniejszy niż 1", - "inactivity-timeout-seconds-pattern":"Okres braku aktywności jest nieprawidłowy", - "json-parse":"Nieprawidłowy format JSON.", - "json-required":"To pole nie może być puste.", - "logs":{ - "logs":"Logi", - "days":"dni", - "hours":"godzin", - "minutes":"minut", - "seconds":"sekund", - "date-format":"Format daty", - "date-format-required":"Wymagany format daty", - "log-format":"Format logów", - "log-type":"Typ logu", - "log-format-required":"Wymagany format logów", - "remote":"Zdalne logowanie", - "remote-logs":"Zdalne logi", - "local":"Lokalne logowanie", - "level":"Poziom logowania", - "file-path":"Ścieżka pliku", - "file-path-required":"Wymagana ścieżka pliku", - "saving-period":"Okres zapisywania logów", - "saving-period-min":"Okres zapisywania logów nie może być krótszy niż 1", - "saving-period-required":"Wymagany okres zapisywania logów", - "backup-count":"Liczba kopii zapasowych", - "backup-count-min":"Liczba kopii zapasowych nie może być mniejsza niż 1", - "backup-count-required":"Wymagana liczba kopii zapasowych" - }, - "min-pack-send-delay":"Minimalny opóźnienie wysyłki paczki (w ms)", - "min-pack-send-delay-required":"Wymagane minimalne opóźnienie wysyłki paczki", - "min-pack-send-delay-min":"Minimalne opóźnienie wysyłki paczki nie może być mniejsze niż 0", - "no-connectors":"Brak konektorów", - "no-data":"Brak konfiguracji", - "no-gateway-found":"Nie znaleziono bramy.", - "no-gateway-matching":"Brak dopasowania do '{{item}}'", - "path-logs":"Ścieżka do plików dziennika", - "path-logs-required":"Wymagana ścieżka", - "permit-without-calls":"Zezwalaj na keep alive bez wywołań", - "remote":"Zdalna konfiguracja", - "remote-logging-level":"Poziom logowania", - "remove-entry":"Usuń konfigurację", - "remote-shell":"Zdalny shell", - "remote-configuration":"Zdalna konfiguracja", - "other":"Inne", - "save-tip":"Zapisz plik konfiguracyjny", - "security-type":"Typ zabezpieczeń", - "security-types":{ - "access-token":"Token dostępu", - "username-password":"Nazwa użytkownika i hasło", - "tls":"TLS", - "tls-access-token":"TLS + Token dostępu", - "tls-private-key":"TLS + Klucz prywatny" - }, - "server-port":"Port serwera", - "statistics":{ - "statistic":"Statystyka", - "statistics":"Statystyki", - "statistic-commands-empty":"Brak dostępnych statystyk", - "commands":"Polecenia", - "send-period":"Okres wysyłania statystyk (w sekundach)", - "send-period-required":"Okres wysyłania statystyk jest wymagany", - "send-period-min":"Okres wysyłania statystyk nie może być krótszy niż 60", - "send-period-pattern":"Okres wysyłania statystyk jest nieprawidłowy", - "check-connectors-configuration":"Sprawdź konfigurację łączników (w sekundach)", - "check-connectors-configuration-required":"Sprawdzenie konfiguracji łączników jest wymagane", - "check-connectors-configuration-min":"Sprawdzenie konfiguracji łączników nie może być krótsze niż 1", - "check-connectors-configuration-pattern":"Sprawdzenie konfiguracji łączników jest nieprawidłowe", - "add":"Dodaj polecenie", - "timeout":"Limit czasu", - "timeout-ms":"Limit czasu (w ms)", - "timeout-required":"Limit czasu jest wymagany", - "timeout-min":"Limit czasu nie może być krótszy niż 1", - "timeout-pattern":"Limit czasu jest nieprawidłowy", - "attribute-name":"Nazwa atrybutu", - "attribute-name-required":"Nazwa atrybutu jest wymagana", - "command":"Polecenie", - "command-required":"Polecenie jest wymagane", - "command-pattern":"Polecenie jest nieprawidłowe", - "remove":"Usuń polecenie" - }, - "storage":"Magazyn", - "storage-max-file-records":"Maksymalna liczba rekordów w pliku", - "storage-max-files":"Maksymalna liczba plików", - "storage-max-files-min":"Minimalna liczba wynosi 1.", - "storage-max-files-pattern":"Liczba jest nieprawidłowa.", - "storage-max-files-required":"Wymagana jest liczba.", - "storage-max-records":"Maksymalna liczba rekordów w magazynie", - "storage-max-records-min":"Minimalna liczba rekordów wynosi 1.", - "storage-max-records-pattern":"Liczba jest nieprawidłowa.", - "storage-max-records-required":"Wymagana jest maksymalna liczba rekordów.", - "storage-read-record-count":"Liczba odczytanych rekordów w magazynie", - "storage-read-record-count-min":"Minimalna liczba rekordów wynosi 1.", - "storage-read-record-count-pattern":"Liczba jest nieprawidłowa.", - "storage-read-record-count-required":"Wymagana jest liczba odczytanych rekordów.", - "storage-max-read-record-count":"Maksymalna liczba odczytanych rekordów w magazynie", - "storage-max-read-record-count-min":"Minimalna liczba rekordów wynosi 1.", - "storage-max-read-record-count-pattern":"Liczba jest nieprawidłowa.", - "storage-max-read-record-count-required":"Wymagana jest maksymalna liczba odczytanych rekordów.", - "storage-data-folder-path":"Ścieżka folderu danych", - "storage-data-folder-path-required":"Wymagana jest ścieżka folderu danych.", - "storage-pack-size":"Maksymalny rozmiar pakietu zdarzeń", - "storage-pack-size-min":"Minimalna liczba wynosi 1.", - "storage-pack-size-pattern":"Liczba jest nieprawidłowa.", - "storage-pack-size-required":"Wymagany jest maksymalny rozmiar pakietu zdarzeń.", - "storage-path":"Ścieżka magazynu", - "storage-path-required":"Wymagana jest ścieżka magazynu.", - "storage-type":"Typ magazynu", - "storage-types":{ - "file-storage":"Magazyn plików", - "memory-storage":"Magazyn pamięci", - "sqlite":"SQLite" - }, - "thingsboard":"ThingsBoard", - "general":"Ogólne", - "thingsboard-host":"Host ThingsBoard", - "thingsboard-host-required":"Host jest wymagany.", - "thingsboard-port":"Port ThingsBoard", - "thingsboard-port-max":"Maksymalny numer portu to 65535.", - "thingsboard-port-min":"Minimalny numer portu to 1.", - "thingsboard-port-pattern":"Port jest niepoprawny.", - "thingsboard-port-required":"Port jest wymagany.", - "tidy":"Porządkuj", - "tidy-tip":"Porządkuj konfigurację JSON", - "title-connectors-json":"Konfiguracja konektora {{typeName}}", - "tls-path-ca-certificate":"Ścieżka do certyfikatu CA na gatewayu", - "tls-path-client-certificate":"Ścieżka do certyfikatu klienta na gatewayu", - "messages-ttl-check-in-hours":"Sprawdź TTL wiadomości w godzinach", - "messages-ttl-check-in-hours-required":"Sprawdzenie TTL wiadomości w godzinach jest wymagane.", - "messages-ttl-check-in-hours-min":"Minimalna liczba to 1.", - "messages-ttl-check-in-hours-pattern":"Liczba jest niepoprawna.", - "messages-ttl-in-days":"TTL wiadomości w dniach", - "messages-ttl-in-days-required":"TTL wiadomości w dniach jest wymagane.", - "messages-ttl-in-days-min":"Minimalna liczba to 1.", - "messages-ttl-in-days-pattern":"Liczba jest niepoprawna.", - "mqtt-qos":"QoS", - "mqtt-qos-required":"QoS jest wymagane", - "mqtt-qos-range":"Wartości QoS są w zakresie od 0 do 1", - "tls-path-private-key":"Ścieżka do prywatnego klucza na gatewayu", - "toggle-fullscreen":"Przełącz pełny ekran", - "transformer-json-config":"Konfiguracja JSON*", - "update-config":"Dodaj/aktualizuj konfigurację JSON", - "hints":{ - "remote-configuration":"Umożliwia zdalną konfigurację i zarządzanie bramką", - "remote-shell":"Umożliwia zdalne sterowanie systemem operacyjnym bramki z widżetu Zdalnej Powłoki", - "host":"Nazwa hosta lub adres IP serwera ThingsBoard", - "port":"Port usługi MQTT na serwerze ThingsBoard", - "token":"Token dostępowy dla bramki na serwerze ThingsBoard", - "client-id":"Identyfikator klienta MQTT dla bramki na serwerze ThingsBoard", - "username":"Nazwa użytkownika MQTT dla bramki na serwerze ThingsBoard", - "password":"Hasło MQTT dla bramki na serwerze ThingsBoard", - "ca-cert":"Ścieżka do pliku certyfikatu CA", - "date-form":"Format daty w komunikatach dziennika", - "data-folder":"Ścieżka do folderu, który będzie zawierał dane (względna lub bezwzględna)", - "log-format":"Format komunikatu dziennika", - "remote-log":"Umożliwia zdalne logowanie i odczyt dziennika z bramki", - "backup-count":"Jeśli liczba kopii zapasowych > 0, po dokonaniu zmiany rolki, nie więcej niż określona liczba plików kopii zapasowych jest przechowywana - najstarsze zostaną usunięte", - "storage":"Zapewnia konfigurację zapisu przychodzących danych przed ich wysłaniem na platformę", - "max-file-count":"Maksymalna liczba plików, które zostaną utworzone", - "max-read-count":"Liczba wiadomości do pobrania z magazynu i wysłania do ThingsBoard", - "max-records":"Maksymalna liczba rekordów przechowywanych w jednym pliku", - "read-record-count":"Liczba wiadomości do pobrania z magazynu i wysłania do ThingsBoard", - "max-records-count":"Maksymalna liczba danych w magazynie przed wysłaniem do ThingsBoard", - "ttl-check-hour":"Jak często brama sprawdza dane pod kątem przestarzałości", - "ttl-messages-day":"Maksymalna liczba dni, przez które dane będą przechowywane w magazynie", - "commands":"Polecenia do zbierania dodatkowych statystyk", - "attribute":"Klucz telemetrii statystyk", - "timeout":"Limit czasu na wykonanie polecenia", - "command":"Wynik wykonania polecenia, będzie używany jako wartość telemetrii", - "check-device-activity":"Umożliwia monitorowanie aktywności każdego podłączonego urządzenia", - "inactivity-timeout":"Czas po którym brama rozłączy urządzenie", - "inactivity-period":"Okresowość sprawdzania aktywności urządzenia", - "minimal-pack-delay":"Opóźnienie między wysyłką paczek wiadomości (zmniejszenie tego ustawienia zwiększa zużycie procesora)", - "qos":"Jakość usługi w komunikacji MQTT (0 - przynajmniej raz, 1 - co najmniej raz)", - "server-port":"Port sieciowy, na którym serwer GRPC nasłuchuje nadchodzących połączeń.", - "grpc-keep-alive-timeout":"Maksymalny czas oczekiwania serwera na odpowiedź keepalive ping przed uznaniem połączenia za martwe.", - "grpc-keep-alive":"Czas między dwoma kolejnymi wiadomościami keepalive ping, gdy nie ma aktywnego wywołania RPC.", - "grpc-min-time-between-pings":"Minimalny czas oczekiwania serwera między wysłaniem wiadomości keepalive ping.", - "grpc-max-pings-without-data":"Maksymalna liczba wiadomości keepalive ping, które serwer może wysłać, nie odbierając żadnych danych, zanim uzna połączenie za martwe.", - "grpc-min-ping-interval-without-data":"Minimalny czas oczekiwania serwera między wysłaniem wiadomości keepalive ping, gdy nie są przesyłane ani odbierane żadne dane.", - "permit-without-calls":"Zezwalaj serwerowi na utrzymanie połączenia GRPC aktywnego, nawet gdy nie ma aktywnych wywołań RPC." + "message": { + "create-entities": "{{count}} pomyślnie utworzono nowe obiekty.", + "update-entities": "{{count}} elementy zostały pomyślnie zaktualizowane.", + "error-entities": "Wystąpił błąd przy tworzeniu {{count}} obiektów." } }, - "grid":{ - "delete-item-title":"Czy na pewno chcesz usunąć ten element?", - "delete-item-text":"Bądź ostrożny, po potwierdzeniu ten element i wszystkie powiązane dane staną się nieodwracalne.", - "delete-items-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 element} other {# elementów} }?", - "delete-items-action-title":"Usuń { count, plural, =1 {1 element} other {# elementów} }", - "delete-items-text":"Bądź ostrożny, po potwierdzeniu wszystkie wybrane elementy zostaną usunięte, a wszystkie powiązane dane staną się nieodwracalne.", - "add-item-text":"Dodaj nowy element", - "no-items-text":"Nie znaleziono elementów", - "item-details":"Szczegóły elementu", - "delete-item":"Usuń element", - "delete-items":"Usuń elementy", - "scroll-to-top":"Przewiń do góry" - }, - "help":{ - "goto-help-page":"Przejdź do strony pomocy", - "show-help":"Pokaż pomoc" - }, - "home":{ - "home":"Strona główna", - "profile":"Profil", - "logout":"Wyloguj się", - "menu":"Menu", - "avatar":"Awatar", - "open-user-menu":"Otwórz menu użytkownika" - }, - "file-input":{ - "browse-file":"Przeglądaj plik", - "browse-files":"Przeglądaj pliki" - }, - "image":{ - "gallery":"Galeria obrazów", - "search":"Wyszukaj obraz", - "selected-images":"{ count, plural, =1 {1 obraz} other {# obrazy} } wybranych", - "created-time":"Czas utworzenia", - "name":"Nazwa", - "name-required":"Nazwa jest wymagana.", - "resolution":"Rozdzielczość", - "size":"Rozmiar", - "system":"System", - "download-image":"Pobierz obraz", - "export-image":"Eksportuj obraz do JSON", - "import-image":"Importuj obraz z JSON", - "upload-image":"Prześlij obraz", - "edit-image":"Edytuj obraz", - "image-details":"Szczegóły obrazu", - "no-images":"Nie znaleziono obrazów", - "delete-image":"Usuń obraz", - "delete-image-title":"Czy na pewno chcesz usunąć obraz '{{imageTitle}}'?", - "delete-image-text":"Bądź ostrożny, po potwierdzeniu obraz stanie się nieodwracalnie utracony.", - "delete-images-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 obraz} other {# obrazy} }?", - "delete-images-text":"Bądź ostrożny, po potwierdzeniu wszystkie wybrane obrazy zostaną usunięte, a wszelkie powiązane dane staną się nieodwracalnie utracone.", - "list-mode":"Widok listy", - "grid-mode":"Widok siatki", - "image-preview":"Podgląd obrazu", - "update-image":"Aktualizuj obraz", - "export-failed-error":"Nie można wyeksportować obrazu: {{error}}", - "image-json-file":"Plik JSON obrazu", - "invalid-image-json-file-error":"Nie można zaimportować obrazu z JSON: Nieprawidłowa struktura danych JSON obrazu.", - "image-is-in-use":"Obraz jest używany przez inne jednostki", - "images-are-in-use":"Obrazy są używane przez inne jednostki", - "image-is-in-use-text":"Obraz '{{title}}' nie został usunięty, ponieważ jest używany przez następujące jednostki:", - "images-are-in-use-text":"Nie wszystkie obrazy zostały usunięte, ponieważ są używane przez inne jednostki.
Możesz zobaczyć odwołane jednostki, klikając przycisk Odwołania w odpowiednim wierszu obrazu.
Jeśli nadal chcesz usunąć te obrazy, zaznacz je w tabeli poniżej i kliknij przycisk Usuń zaznaczone.", - "delete-image-in-use-text":"Jeśli nadal chcesz usunąć obraz, kliknij przycisk Usuń tak czy inaczej.", - "system-entities":"Jednostki systemowe:", - "entities":"jednostki:", - "references":"Odwołania", - "include-system-images":"Dołącz obrazy systemowe", - "clear-image":"Wyczyść obraz", - "no-image":"Brak obrazu", - "no-image-selected":"Nie wybrano obrazu", - "browse-from-gallery":"Przeglądaj z galerii", - "set-link":"Ustaw link", - "image-link":"Link obrazu", - "link":"Link", - "copy-image-link":"Kopiuj link obrazu", - "embed-image":"Osadź obraz", - "embed-to-html":"Osadź w HTML", - "embed-to-html-hint":"Ta funkcja umożliwia udostępnianie linku każdemu nieautoryzowanemu użytkownikowi.", - "embed-to-html-text":"Za pomocą poniższego fragmentu kodu możesz osadzić obraz w komponentach opartych na prostym HTML.
Takie komponenty obejmują widżety karty HTML, funkcje zawartości komórek itp.", - "embed-to-angular-template":"Osadź w szablonie Angular HTML", - "embed-to-angular-template-text":"Za pomocą poniższego fragmentu kodu możesz osadzić obraz w szablonie Angular HTML.
Takie komponenty obejmują widżet Markdown, sekcję HTML w edytorze widżetów, niestandardowe akcje itp." - }, - "image-input":{ - "drop-images-or":"Przeciągnij i upuść obrazy lub", - "drag-and-drop":"Przeciągnij i Upuść", - "or":"lub", - "browse":"Przeglądaj", - "no-images":"Brak wybranych obrazów", - "images":"obrazy" - }, - "import":{ - "no-file":"Nie wybrano pliku", - "drop-file":"Przeciągnij plik JSON lub kliknij, aby wybrać plik do przesłania.", - "drop-json-file-or":"Przeciągnij plik JSON lub", - "drop-file-csv":"Przeciągnij plik CSV lub kliknij, aby wybrać plik do przesłania.", - "drop-file-csv-or":"Przeciągnij plik CSV lub", - "column-value":"Wartość", - "column-title":"Tytuł", - "column-example":"Przykładowa wartość danych", - "column-key":"Atrybut/klucz telemetryczny", - "credentials":"Dane uwierzytelniające", - "csv-delimiter":"Separator CSV", - "csv-first-line-header":"Pierwsza linia zawiera nazwy kolumn", - "csv-update-data":"Aktualizuj atrybuty/telemetrię", - "details":"Szczegóły", - "import-csv-number-columns-error":"Plik powinien zawierać co najmniej dwie kolumny", - "import-csv-invalid-format-error":"Nieprawidłowy format pliku. Linia: '{{line}}'", - "column-type":{ - "name":"Nazwa", - "type":"Typ", - "label":"Etykieta", - "column-type":"Typ kolumny", - "client-attribute":"Atrybut klienta", - "shared-attribute":"Wspólny atrybut", - "server-attribute":"Atrybut serwera", - "timeseries":"Szereg czasowy", - "entity-field":"Pole encji", - "access-token":"Token dostępu", - "x509":"X.509", - "mqtt":{ - "client-id":"ID klienta MQTT", - "user-name":"Nazwa użytkownika MQTT", - "password":"Hasło MQTT" - }, - "lwm2m":{ - "client-endpoint":"Nazwa klienta LwM2M endpoint", - "security-config-mode":"Tryb konfiguracji bezpieczeństwa LwM2M", - "client-identity":"Tożsamość klienta LwM2M", - "client-key":"Klucz klienta LwM2M", - "client-cert":"Certyfikat publiczny klienta LwM2M", - "bootstrap-server-security-mode":"Tryb bezpieczeństwa serwera rozruchowego LwM2M", - "bootstrap-server-secret-key":"Tajny klucz serwera rozruchowego LwM2M", - "bootstrap-server-public-key-id":"Klucz publiczny lub identyfikator serwera rozruchowego LwM2M", - "lwm2m-server-security-mode":"Tryb bezpieczeństwa serwera LwM2M", - "lwm2m-server-secret-key":"Tajny klucz serwera LwM2M", - "lwm2m-server-public-key-id":"Klucz publiczny lub identyfikator serwera LwM2M" - }, - "snmp":{ - "host":"Host SNMP", - "port":"Port SNMP", - "version":"Wersja SNMP (v1, v2c lub v3)", - "community-string":"Ciąg społeczności SNMP" - }, - "isgateway":"Czy to jest Bramą", - "activity-time-from-gateway-device":"Czas aktywności urządzenia bramowego", - "description":"Opis", - "routing-key":"Klucz brzegowy", - "secret":"Sekret brzegowy" + "integration": { + "integration": "Integracja", + "integrations": "Integracje", + "integrations-center": "Centrum Integracji", + "select-integration": "Wybierz integrację", + "no-integrations-matching": "Nie znaleziono integracji pasujących do '{{entity}}'.", + "integration-required": "Integracja jest wymagana", + "delete": "Usuń integrację", + "management": "Zarządzanie integracjami", + "add-integration-text": "Dodaj nową integrację", + "no-integrations-text": "Nie znaleziono integracji", + "data-convertor-name": "{{convertorType}} data converter for {{integrationName}}", + "integration-name": "{{integrationType}} integration", + "selected-integrations": "Wybrano {count, plural, =1 {1 integrację} other {# integracji} }", + "delete-integration-title": "Czy na pewno chcesz usunąć integrację '{{integrationName}}'?", + "delete-integration-text": "Bądź ostrożny, po potwierdzeniu integracji i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-integrations-title": "Czy na pewno chcesz usunąć {count, plural, =1 {1 integrację} other {# integracji} }?", + "delete-integrations-action-title": "Usuń {count, plural, =1 {1 integrację} other {# integracji} }", + "delete-integrations-text": "Uważaj, po potwierdzeniu wszystkie wybrane integracje zostaną usunięte, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "events": "Wydarzenia", + "enabled": "Włącz integrację", + "allow-create-devices-or-assets": "Zezwalaj na tworzenie urządzeń lub zasobów", + "all-types": "Wszystkie typy integracji", + "add": "Dodaj integrację", + "search": "Wyszukaj integracje", + "integration-details": "Szczegóły integracji", + "details": "Szczegóły", + "copyId": "Skopiuj identyfikator integracji", + "idCopiedMessage": "Identyfikator integracji został skopiowany do schowka", + "debug-mode": "Tryb debugowania", + "enable-security": "Włącz zabezpieczenia", + "enable-security-new": "Włącz zabezpieczenia automatycznych aktualizacji tokenów", + "headers-filter": "Filtr nagłówków", + "header": "nagłówek", + "no-headers-filter": "Brak filtra nagłówków", + "downlink-url": "Adres URL łącza w dół", + "downlink-url-required": "Adres URL łącza w dół jest wymagany", + "create-loriot-output": "Utwórz dane wyjściowe aplikacji Loriot", + "send-downlink": "Wyślij łącze w dół", + "allow-downlink": "Allow downlink", + "server": "serwer", + "server-required": "Serwer jest wymagany", + "domain": "Domena", + "app-id": "Identyfikator aplikacji", + "app-id-required": "Identyfikator aplikacji jest wymagany", + "app-token": "Token dostępu do aplikacji", + "app-token-required": "Token dostępu do aplikacji jest wymagany", + "email": "E-mail", + "email-required": "email jest wymagany", + "application-uri": "URI aplikacji", + "as-id": "JAKO ID", + "as-id-required": "Identyfikator AS jest wymagany.", + "as-key": "Klucz AS", + "as-key-required": "Klucz AS jest wymagany.", + "client-id-new": "Identyfikator klienta", + "client-id-new-required": "Identyfikator klienta jest wymagany (login).", + "client-secret": "Sekret Klienta", + "client-secret-required": "Sekret klienta jest wymagany (hasło).", + "max-time-diff-in-seconds": "Maksymalna różnica czasu (sekundy)", + "max-time-diff-in-seconds-required": "Maksymalna różnica czasu jest wymagana.", + "created-time": "Stworzony czas", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana.", + "name-max-length": "Nazwa powinna być mniejsza niż 256", + "description": "Opis", + "base-url": "Bazowy adres URL", + "base-url-required": "Podstawowy adres URL jest wymagany", + "security-key": "Klucz bezpieczeństwa", + "http-endpoint": "Adres URL punktu końcowego HTTP", + "replace-no-content-to-ok": "Zmień status odpowiedzi z „Brak treści” na „OK”", + "copy-http-endpoint-url": "Skopiuj adres URL punktu końcowego HTTP", + "http-endpoint-url-copied-message": "Adres URL punktu końcowego HTTP został skopiowany do schowka", + "host": "Host", + "host-required": "Host jest wymagany.", + "host-private": "Host musi znajdować się w sieci publicznej.", + "url-private": "Adres URL musi należeć do sieci publicznej.", + "host-type": "Typ hosta", + "host-type-required": "Typ hosta jest wymagany.", + "api-version": "Użyj API v3", + "custom-host": "Niestandardowy host", + "custom-host-required": "Niestandardowy host jest wymagany.", + "port": "Port", + "port-required": "Port jest wymagany.", + "port-range": "Port powinien należeć do zakresu od 1 do 65535.", + "connect-timeout": "Limit czasu połączenia (s)", + "connect-timeout-required": "Limit czasu połączenia jest wymagany.", + "connect-timeout-range": "Limit czasu połączenia powinien mieścić się w zakresie od 1 do 200.", + "client-id": "Identyfikator klienta", + "client-id-required": "Identyfikator klienta jest wymagany.", + "client-id-hint": "Wskazówka: opcjonalne. ", + "max-bytes-in-message": "Maksymalna liczba bajtów w wiadomości", + "max-bytes-in-message-range": "Maksymalna liczba bajtów w wiadomości powinna mieścić się w zakresie od 1 do 256000000.", + "device-id": "Identyfikator urzadzenia", + "device-id-required": "Identyfikator urządzenia jest wymagany.", + "device-id-range": "Identyfikator urządzenia powinien mieścić się w zakresie od 1 do 65535 znaków.", + "device-id-pattern": "Identyfikator urządzenia powinien składać się z cyfr oraz wielkich i małych liter. ", + "group-id": "Identyfikator grupy", + "group-id-required": "Identyfikator grupy jest wymagany.", + "topics": "Tematy", + "topics-required": "Temat jest wymagany.", + "routing-keys": "Klucze routingu", + "routing-keys-required": "Klucz routingu jest wymagany.", + "queues": "Kolejki", + "queues-required": "Nazwa kolejki jest wymagana.", + "durable": "Wytrzymały", + "exclusive": "Ekskluzywny", + "autoDelete": "Automatyczne usuwanie", + "exchange-name": "Nazwa wymiany", + "exchange-name-required": "Nazwa giełdy jest wymagana.", + "downlink-topic": "Temat łącza w dół", + "connection-timeout": "Przekroczono limit czasu połączenia, ms", + "connection-timeout-min": "Nieprawidłowa wartość limitu czasu połączenia.", + "handshake-timeout": "Przekroczono limit czasu uzgadniania, ms", + "handshake-timeout-min": "Nieprawidłowa wartość limitu czasu uzgadniania.", + "virtual-host": "Wirtualny gospodarz", + "rabbit-mq-poll-interval": "Interwał ankiety, ms", + "rabbit-mq-poll-interval-min": "Nieprawidłowa wartość interwału odpytywania.", + "application-server-url": "Adres URL serwera aplikacji", + "application-server-url-required": "Adres URL serwera aplikacji jest wymagany.", + "application-server-api-token": "Token API serwera aplikacji", + "application-server-api-token-required": "Token API serwera aplikacji jest wymagany.", + "use-api-four-plus": "Use API for ChirpStack 4+", + "bootstrap-servers": "Serwery startowe", + "bootstrap-servers-required": "Serwery startowe są wymagane.", + "poll-interval": "Interwał ankiety", + "poll-interval-required": "Interwał sondowania jest wymagany.", + "poll-interval-min-value": "Wartość interwału odpytywania nie może być mniejsza niż 1", + "auto-create-topics": "Automatyczne tworzenie tematów", + "clean-session": "Czysta sesja", + "enable-ssl": "Włącz protokół SSL", + "credentials": "Dane uwierzytelniające", + "credentials-type": "Typ poświadczeń", + "credentials-type-required": "Typ danych logowania jest wymagany.", + "username": "Nazwa użytkownika", + "username-required": "Nazwa użytkownika jest wymagana.", + "password": "Hasło", + "password-required": "Hasło jest wymagane.", + "azure-ca-cert": "Plik certyfikatu urzędu certyfikacji", + "ca-cert": "Plik certyfikatu urzędu certyfikacji", + "private-key": "Plik klucza prywatnego", + "private-key-password": "Hasło klucza prywatnego", + "cert": "Plik certyfikatu", + "no-file": "Nie wybrano pliku.", + "drop-file": "Upuść plik lub kliknij, aby wybrać plik do przesłania.", + "drop-file-or": "Przeciągnij i upuść plik lub", + "check-connection": "Sprawdź połączenie", + "check-success": "Połączenie nawiązane.", + "topic-filters": "Filtry tematyczne", + "remove-topic-filter": "Usuń filtr tematu", + "add-topic-filter": "Dodaj filtr tematu", + "add-topic-filter-prompt": "Proszę dodać filtr tematyczny", + "topic": "Temat", + "mqtt-qos": "Jakość usług", + "mqtt-qos-required": "QoS is required", + "mqtt-qos-range": "QoS values range is from 0 to 2", + "mqtt-qos-at-most-once": "Co najwyżej raz", + "mqtt-qos-at-least-once": "Przynajmniej raz", + "mqtt-qos-exactly-once": "Dokładnie raz", + "downlink-topic-pattern": "Wzór tematu łącza w dół", + "downlink-topic-pattern-required": "Wzór tematu łącza w dół jest wymagany.", + "retained-message": "Zachowane", + "aws-access-key-id": "Identyfikator klucza dostępu AWS", + "aws-secret-access-key": "Tajny klucz dostępu AWS", + "aws-region": "Region", + "aws-iot-endpoint": "Punkt końcowy AWS IoT", + "aws-iot-endpoint-required": "Punkt końcowy AWS IoT jest wymagany.", + "aws-iot-credentials": "Poświadczenia AWS IoT", + "aws-sqs-polling-period-in-seconds": "Okres odpytywania w sekundach", + "aws-sqs-queue-url": "Adres URL kolejki SQS", + "aws-sqs-queue-url-required": "Adres URL kolejki SQS jest wymagany", + "aws-sqs-access-key-id-required": "Identyfikator klucza dostępu jest wymagany", + "aws-sqs-secret-access-key-required": "Tajny klucz dostępu jest wymagany", + "application-credentials": "Poświadczenia aplikacji", + "api-key": "Klucz API", + "api-key-required": "Klucz API jest wymagany.", + "api-key-format": "Nieprawidłowy format klucza API.", + "auth-token": "Token uwierzytelniający", + "auth-token-required": "Token uwierzytelniający jest wymagany.", + "region": "Region", + "region-required": "Region jest wymagany.", + "application-id": "Identyfikator aplikacji", + "application-id-required": "Identyfikator aplikacji jest wymagany.", + "access-id": "Identyfikator dostępu", + "access-id-required": "Identyfikator dostępu jest wymagany.", + "access-key": "Klucz dostępu", + "access-key-required": "Klucz dostępu jest wymagany.", + "access-key-min-length": "Klucz dostępu jest za krótki.", + "access-key-max-length": "Klucz dostępu jest za długi.", + "connection-parameters": "Parametry połączenia", + "service-bus-namespace-name": "Nazwa przestrzeni nazw Service Bus", + "service-bus-namespace-name-required": "Nazwa przestrzeni nazw Service Bus jest wymagana.", + "connection-string": "Napis połączenia", + "consumer-group": "Grupa konsumencka", + "connection-string-required": "Wymagany napis połączenia!", + "event-hub-name": "Nazwa centrum zdarzeń", + "event-hub-name-required": "Nazwa centrum zdarzeń jest wymagana.", + "event-iot-hub-name-required": "Nazwa Iot Hub jest wymagana dla łącza w dół", + "sas-key-name": "Nazwa klucza SAS-owego", + "sas-key-name-required": "Nazwa klucza SAS-owego jest wymagana.", + "sas-key": "Klucz SAS-owy", + "sas-key-required": "Klucz SAS jest wymagany.", + "iot-hub-name": "Nazwa IoT Hub (wymagana dla łącza w dół)", + "hostname": "Nazwa hosta", + "hostname-required": "Nazwa hosta jest wymagana", + "integration-clazz": "Klasa integracyjna", + "integration-clazz-required": "Klasa integracyjna jest wymagana", + "integration-configuration": "Konfiguracja integracji JSON", + "metadata": "Metadane", + "type": "Typ integracji", + "select-integration-type": "Wybierz typ integracji", + "type-required": "Typ integracji jest wymagany.", + "type-not-found": "Nie znaleziono typu integracji", + "uplink-converter": "Konwerter danych łącza zwrotnego", + "uplink-converter-required": "Konwerter danych łącza zwrotnego jest wymagany.", + "downlink-converter": "Konwerter danych łącza w dół", + "type-http": "HTTP", + "type-http-description": "Protokół przesyłania plików tekstowych lub multimedialnych.", + "type-ocean-connect": "OceanConnect", + "type-ocean-connect-description": "Integracja urządzeń o różnych możliwościach z platformą IoT.", + "type-sigfox": "SigFox", + "type-sigfox-description": "Lekki protokół do obsługi małych transmisji danych.", + "type-thingpark": "ThingPark", + "type-thingpark-description": "Protokół warstwy transportowej zorientowanej na komunikaty.", + "type-loriot": "Loriota", + "type-loriot-description": "Rozproszona infrastruktura LoRaWAN.", + "type-thingpark-enterprise": "Firma ThingPark", + "type-thingpark-enterprise-description": "Platforma komunikacyjna dla sieci LPWA.", + "type-tmobile-iot-cdp": "iotcreators.com (T-Mobile – IoT CDP)", + "type-tmobile-iot-cdp-description": "Usługa łączności mobilnej IoT.", + "type-mqtt": "MQTT", + "type-mqtt-description": "Protokół sieciowy maszyna do maszyny.", + "type-aws-iot": "AWS IoT", + "type-aws-iot-description": "Usługi zarządzania, przechowywania i analizy.", + "type-aws-sqs": "AWS SQS", + "type-aws-sqs-description": "W pełni zarządzana usługa kolejkowania wiadomości.", + "type-aws-kinesis": "AWS Kinesis", + "type-aws-kinesis-description": "Usługa strumieni wideo i danych w czasie rzeczywistym.", + "type-ibm-watson-iot": "IBM Watson IoT", + "type-ibm-watson-iot-description": "W pełni zarządzana usługa hostowana w chmurze.", + "type-ttn": "The Things Stack Community", + "type-ttn-description": "Otwarta i zdecentralizowana sieć LoRaWAN.", + "type-tti": "The Things Stack Industries", + "type-tti-description": "Oprogramowanie do obsługi prywatnych sieci LoRaWAN na dużą skalę.", + "type-chirpstack": "ChirpStack", + "type-chirpstack-description": "Serwer konfiguracji sieci LoRaWAN.", + "type-particle": "Particle", + "type-particle-description": "IoT enablement platform-as-a-service.", + "type-azure-event-hub": "Centrum zdarzeń platformy Azure", + "type-azure-event-hub-description": "Platforma do strumieniowego przesyłania dużych zbiorów danych i usługa pozyskiwania zdarzeń.", + "type-azure-iot-hub": "Centrum IoT platformy Azure", + "type-azure-iot-hub-description": "Usługa przesyłania wiadomości hostowana w chmurze.", + "type-opc-ua": "OPC-UA", + "type-opc-ua-description": "Wieloplatformowa platforma do wymiany danych z czujników do aplikacji w chmurze.", + "type-custom": "custom", + "type-coap": "CoAP", + "type-coap-description": "Protokół sieciowy maszyna do maszyny dla urządzeń z ograniczeniami.", + "type-udp": "UDP", + "type-udp-description": "Protokół warstwy transportowej zorientowanej na komunikaty.", + "type-tcp": "TCP", + "type-tcp-description": "Protokół zorientowany na połączenie.", + "type-kafka": "Kafka", + "type-kafka-description": "Analityka przesyłania strumieniowego, platforma do przesyłania strumieniowego integracji danych.", + "type-rabbitmq": "RabbitMQ", + "type-rabbitmq-description": "Broker wiadomości obsługujący wiele protokołów przesyłania wiadomości.", + "type-pubsub": "Pub/sub", + "type-pubsub-description": "Usługa asynchronicznej komunikacji między aplikacjami.", + "type-apache-pulsar": "Apache Pulsar", + "type-apache-pulsar-description": "Rozproszona platforma do przesyłania wiadomości i przesyłania strumieniowego między pubami.", + "type-tuya": "Tuya", + "type-tuya-description": "Wiadomości hostowane w chmurze. ", + "type-azure-service-bus": "Magistrala usług platformy Azure", + "type-azure-service-bus-description": "W pełni zarządzany korporacyjny broker komunikatów z kolejkami komunikatów i tematami publikowania i subskrybowania.", + "opc-ua-application-name": "Nazwa aplikacji", + "opc-ua-application-uri": "Nazwa aplikacji", + "opc-ua-scan-period-in-seconds": "Okres skanowania w sekundach", + "opc-ua-scan-period-in-seconds-required": "Okres skanowania jest wymagany", + "opc-ua-timeout": "Limit czasu w milisekundach", + "opc-ua-timeout-required": "Limit czasu jest wymagany", + "opc-ua-security": "Bezpieczeństwo", + "opc-ua-security-required": "Bezpieczeństwo jest wymagane", + "opc-ua-identity": "Tożsamość", + "opc-ua-identity-required": "Tożsamość jest wymagana", + "opc-ua-keystore": "Magazyn kluczy", + "add-opc-ua-keystore-prompt": "Proszę dodać plik magazynu kluczy", + "opc-ua-keystore-required": "Magazyn kluczy jest wymagany", + "opc-ua-type": "Typ", + "opc-ua-keystore-type": "Typ", + "opc-ua-keystore-type-required": "Typ jest wymagany", + "opc-ua-keystore-location": "Lokalizacja *", + "opc-ua-keystore-password": "Hasło", + "opc-ua-keystore-password-required": "Hasło jest wymagane", + "opc-ua-keystore-alias": "Alias", + "opc-ua-keystore-alias-required": "Alias jest wymagany", + "opc-ua-keystore-key-password": "Kluczowe hasło", + "opc-ua-keystore-key-password-required": "Hasło klucza jest wymagane", + "opc-ua-mapping": "Mapowanie", + "add-opc-ua-mapping-prompt": "Proszę dodać mapowanie", + "opc-ua-mapping-type": "Typ mapowania", + "opc-ua-mapping-type-required": "Typ mapowania jest wymagany", + "opc-ua-device-node-pattern": "Wzorzec węzła urządzenia", + "opc-ua-device-node-pattern-required": "Wzorzec węzła urządzenia jest wymagany", + "opc-ua-namespace": "Przestrzeń nazw", + "opc-ua-add-map": "Dodaj element mapowania", + "kinesis-stream-name": "Nazwa strumienia", + "kinesis-stream-name-required": "Nazwa strumienia jest wymagana", + "kinesis-region": "Region", + "kinesis-region-required": "Region jest wymagany", + "kinesis-access-key-id": "Identyfikator klucza dostępu", + "kinesis-access-key-id-required": "Identyfikator klucza dostępu jest wymagany", + "kinesis-secret-access-key": "Tajny klucz dostępu", + "kinesis-secret-access-key-required": "Tajny klucz dostępu jest wymagany", + "kinesis-use-consumers-with-enhanced-fan-out": "Użyj konsumentów z ulepszonym rozgałęzianiem", + "kinesis-use-credentials-from-instance-metadata": "Użyj danych uwierzytelniających z usługi metadanych instancji Amazon EC2", + "kinesis-application-name": "Nazwa aplikacji (domyślnie jest równa nazwie strumienia)", + "kinesis-initial-position-in-stream": "Początkowa pozycja w strumieniu", + "kinesis-initial-position-in-stream-required": "Wymagana pozycja początkowa w strumieniu", + "kinesis-max-records": "Maksymalne rekordy", + "kinesis-max-records-required": "Maksymalna liczba rekordów jest wymagana", + "kinesis-max-records-length-range": "Maksymalna długość rekordów powinna mieścić się w zakresie od 1 do 10000", + "kinesis-request-timeout": "Żądaj limitu czasu w sekundach", + "kinesis-request-timeout-required": "Limit czasu żądania jest wymagany", + "other-properties": "Inne właściwości", + "subscription-tags": "Tagi subskrypcji", + "remove-subscription-tag": "Usuń tag subskrypcji", + "add-subscription-tag": "Dodaj tag subskrypcji", + "add-subscription-tag-prompt": "Dodaj tag subskrypcji", + "key": "Klucz", + "path": "Ścieżka", + "required": "Wymagany", + "integration-key": "Klucz integracyjny", + "copy-integration-key": "Skopiuj klucz integracji", + "integration-key-copied-message": "Klucz integracji został skopiowany do schowka", + "integration-secret": "Sekret integracji", + "copy-integration-secret": "Skopiuj sekret integracji", + "integration-secret-copied-message": "Sekret integracji został skopiowany do schowka", + "execute-remotely": "Wykonuj zdalnie", + "remote": "Zdalny", + "handler-configuration": "Konfiguracja modułu obsługi", + "handler-configuration-type": "Typ obsługi", + "so-broadcast": "Włącz rozgłaszanie - integracja akceptuje pakiety adresów rozgłoszeniowych", + "so-keepalive-option": "Włącz wysyłanie komunikatów podtrzymujących działanie w gniazdach zorientowanych na połączenie", + "so-reuse-addr": "Powiąż proces z portem", + "tcp-no-delay": "Wymusza wysyłanie danych przez gniazdo bez buforowania (wyłącz algorytm buforowania Nagle'a)", + "fail-fast": "Zgłoszony wyjątek, gdy dekoder zauważy, że długość ramki przekracza maksymalny rozmiar", + "strip-delimiter": "Ogranicznik pasków", + "length-field-offset": "Przesunięcie pola długości", + "length-field-offset-required": "Przesunięcie pola długości jest wymagane.", + "length-field-offset-range": "Przesunięcie pola długości powinno mieścić się w zakresie od 0 do 8.", + "length-field-length": "Długość Długość pola", + "length-field-length-required": "Długość Długość pola jest wymagana.", + "length-field-length-range": "Długość pola Długość powinna mieścić się w zakresie od 0 do 8.", + "length-adjustment": "Regulacja długości (wartość kompensacji dodana do wartości pola długości)", + "length-adjustment-required": "Regulacja długości jest wymagana.", + "length-adjustment-range": "Regulacja długości powinna mieścić się w zakresie od 0 do 8.", + "byte-order": "Kolejność bajtów w polu długości", + "initial-bytes-to-strip": "Liczba pierwszych bajtów do usunięcia z zdekodowanej ramki", + "initial-bytes-to-strip-required": "Liczba pierwszych bajtów do usunięcia z zdekodowanej ramki jest wymagana.", + "initial-bytes-to-strip-range": "Liczba pierwszych bajtów do usunięcia z zdekodowanej ramki powinna mieścić się w zakresie od 0 do 8.", + "so-backlog-option": "Maksymalna liczba oczekujących połączeń na gnieździe", + "so-backlog-option-required": "Maksymalna liczba oczekujących połączeń na gnieździe jest wymagana.", + "so-backlog-option-range": "Maksymalna liczba oczekujących połączeń w gnieździe powinna mieścić się w zakresie od 1 do 65535.", + "so-rcv-buf": "Rozmiar bufora dla gniazda przychodzącego (w KB)", + "so-rcv-buf-required": "Rozmiar bufora dla gniazda przychodzącego (w KB) jest wymagany.", + "so-rcv-buf-range": "Rozmiar bufora dla gniazda przychodzącego (w KB) powinien mieścić się w przedziale od 1 do 65535.", + "so-snd-buf": "Rozmiar bufora dla gniazda wychodzącego (w KB)", + "so-snd-buf-required": "Rozmiar bufora dla gniazda wychodzącego (w KB) jest wymagany.", + "so-snd-buf-range": "Rozmiar bufora dla gniazda wychodzącego (w KB) powinien mieścić się w przedziale od 1 do 65535.", + "charset-name": "Nazwa zestawu znaków", + "charset-name-required": "Nazwa zestawu znaków jest wymagana.", + "message-separator": "Separator wiadomości", + "message-separator-required": "Separator wiadomości jest wymagany.", + "character-sequence": "Sekwencja znaków", + "character-sequence-required": "Sekwencja znaków jest wymagana.", + "max-frame-length": "Maksymalna długość ramki (w bajtach)", + "max-frame-length-required": "Maksymalna długość ramki (w bajtach) jest wymagana.", + "max-frame-length-range": "Maksymalna długość ramki (w bajtach) powinna mieścić się w zakresie od 1 do 65535.", + "handler-type": "Typ obsługi", + "message-size": "Rozmiar wiadomości", + "message-size-required": "Rozmiar wiadomości jest wymagany.", + "service-url": "Adres URL usługi", + "service-url-required": "Adres URL usługi jest wymagany.", + "subscription-name": "Nazwa subskrypcji", + "subscription-name-required": "Nazwa subskrypcji jest wymagana.", + "max-num-messages": "Maksymalna liczba wiadomości", + "max-num-messages-required": "Maksymalna liczba wiadomości jest wymagana.", + "max-num-bytes": "Maksymalna liczba bajtów", + "max-num-bytes-required": "Wymagana maksymalna liczba bajtów.", + "timeout-in-ms": "Limit czasu w milisekundach", + "timeout-in-ms-required": "Limit czasu w milisekundach jest wymagany.", + "user-id": "Identyfikator użytkownika", + "user-id-required": "Identyfikator użytkownika jest wymagany.", + "token": "Znak", + "token-required": "Token jest wymagany.", + "project-id": "Identyfikator projektu", + "project-id-required": "Identyfikator projektu jest wymagany.", + "subscription-id": "Identyfikator subskrypcji", + "subscription-id-required": "Identyfikator subskrypcji jest wymagany.", + "service-account-key": "Plik klucza konta usługi", + "service-account-key-required": "Plik klucza konta usługi jest wymagany.", + "tcp": { + "system-line-separator": "Separator linii systemowych", + "nul-delimiter": "Separator Nul", + "byte-order-little-endian": "Little Endian", + "byte-order-big-endian": "Big Endian" }, - "stepper-text":{ - "select-file":"Wybierz plik", - "configuration":"Importuj konfigurację", - "column-type":"Wybierz typy kolumn", - "creat-entities":"Tworzenie nowych jednostek" + "cache-size": "Rozmiar pamięci podręcznej", + "cache-time-to-live": "Czas działania pamięci podręcznej w minutach", + "min-cache-size": "Rozmiar pamięci podręcznej nie może być mniejszy niż 0", + "min-cache-time-to-live": "Czas życia pamięci podręcznej nie może być mniejszy niż 0", + "max-cache-time-to-live": "Nieprawidłowy czas aktywności pamięci podręcznej. Wybierz wartość z zakresu od 0 do 525600", + "coap-security-mode": "Tryb Bezpieczny", + "coap-security-mode-required": "Tryb zabezpieczeń CoAP jest wymagany", + "coap-security-mode-no-secure": "NIE BEZPIECZNIE", + "coap-security-mode-dtls": "DTLS", + "coap-security-mode-mixed": "MIESZANY", + "coap-endpoint": "Adres URL punktu końcowego CoAP", + "coap-endpoint-url-copied-message": "Adres URL punktu końcowego CoAP został skopiowany do schowka", + "copy-coap-endpoint-url": "Skopiuj adres URL punktu końcowego CoAP", + "copy-coap-dtls-endpoint-url": "Skopiuj adres URL punktu końcowego CoAP DTLS", + "coap-dtls-base-url": "Podstawowy adres URL DTLS", + "coap-dtls-base-url-required": "Podstawowy adres URL DTLS jest wymagany", + "coap-dtls-endpoint": "Adres URL punktu końcowego CoAP DTLS", + "coap-dtls-endpoint-url-copied-message": "Adres URL punktu końcowego CoAP DTLS został skopiowany do schowka", + "unassign-integration-title": "Czy na pewno chcesz anulować przypisanie integracji '{{integrationName}}'?", + "unassign-integration-from-edge-text": "Po potwierdzeniu integracja zostanie anulowana i nie będzie dostępna z Edge.", + "unassign-integrations-from-edge-title": "Czy na pewno chcesz usunąć przypisanie {count, plural, =1 {1 integracji} other {# integracji} }?", + "unassign-integrations-from-edge-text": "Po potwierdzeniu wszystkie wybrane integracje zostaną usunięte i nie będą dostępne na Edge.", + "unassign-integrations": "Usuń przypisanie integracji", + "edge-placeholder-hint": "Możesz użyć symbolu zastępczego ${{ATTRIBUTE_KEY}} aby zastąpić pole integracji wartością atrybutu z konkretnego obiektu Edge. Na przykład, 'Edge A' ma atrybut 'baseUrl' wynoszący 'http://localhost:9999'. Możesz ustawić {{baseUrl}} jako jedno z pól integracji i zostanie ono zastąpione przez 'http://localhost:9999” podczas przypisywania tej integracji do 'Edge A'. Dodatkowo, jeśli 'Edge A' atrybut 'baseUrl' zostanie zaktualizowany - integracja z nową zaktualizowaną wartością będzie automatycznie zapewniona 'Edge A'.", + "status": { + "status": "Status", + "active": "Aktywny", + "disabled": "Wyłączony", + "failed": "Błąd", + "pending": "Aż do" }, - "message":{ - "create-entities":"{{count}} nowych jednostek zostało pomyślnie utworzonych.", - "update-entities":"{{count}} jednostek zostało pomyślnie zaktualizowanych.", - "error-entities":"Wystąpił błąd podczas tworzenia {{count}} jednostek." + "daily-activity": "Dzienna aktywność", + "enable-debug-mode": "Włącz tryb debugowania", + "disable-debug-mode": "Wyłącz tryb debugowania", + "advanced-settings": "Zaawansowane ustawienia", + "basic-settings": "Podstawowe ustawienia", + "existing-converter": "Select existing", + "new-converter": "Create new", + "connection": "Połączenie", + "connected": "Połączony", + "not-connected": "Nie połączony", + "environment": "Środowisko", + "environment-required": "Środowisko jest wymagane.", + "region-cn": "Chiny", + "region-us": "Stany Zjednoczone", + "region-eu": "Europa", + "region-in": "Indie", + "topic-name": "Nazwa tematu", + "topic-name-required": "Nazwa tematu jest wymagana", + "sub-name": "Nazwa subskrypcji", + "sub-name-required": "Nazwa subskrypcji jest wymagana", + "downlink-connection-string": "Parametry połączenia łącza w dół", + "downlink-connection-string-required": "Parametry połączenia łącza w dół są wymagane", + "downlink-topic-name": "Nazwa tematu łącza w dół", + "downlink-topic-name-required": "Nazwa tematu łącza w dół jest wymagana", + "client-id-range": "Identyfikator klienta powinien zawierać się w zakresie od 1 do 23 znaków. ", + "client-id-pattern": "Identyfikator klienta powinien składać się z cyfr, wielkich i małych liter. ", + "existing-uplink-converter": "Wybierz istniejący konwerter danych łącza zwrotnego", + "new-uplink-converter": "Utwórz nowy konwerter danych łącza zwrotnego", + "existing-downlink-converter": "Wybierz istniejący konwerter danych łącza w dół", + "new-downlink-converter": "Utwórz nowy konwerter danych łącza w dół" + }, + "item": { + "selected": "Wybrany" + }, + "js-func": { + "no-return-error": "Funkcja musi zwracać wartość!", + "return-type-mismatch": "Funkcja musi zwracać wartość '{{type}}' typ!", + "tidy": "Czysty", + "mini": "Mini" + }, + "key-val": { + "key": "Klucz", + "value": "Wartość", + "remove-entry": "Usuń wpis", + "add-entry": "Dodaj wpis", + "no-data": "Brak wpisów" + }, + "layout": { + "layout": "Układ", + "layouts": "Layouts", + "manage": "Zarządzaj układem panelu", + "settings": "Ustawienia układu", + "color": "Kolor", + "main": "Główny", + "right": "Prawy", + "left": "Lewy", + "select": "Wybierz układ docelowy", + "percentage-width": "Szerokość procentowa (%)", + "fixed-width": "Stała szerokość (px)", + "left-width": "Lewa kolumna (%)", + "right-width": "Prawa kolumna (%)", + "pick-fixed-side": "Naprawiono stronę: ", + "layout-fixed-width": "Stała szerokość (px)", + "value-min-error": "Wartość musi być zatem większa {{min}}{{unit}}", + "value-max-error": "Wartość musi być wtedy mniejsza {{max}}{{unit}}", + "layout-fixed-width-required": "Stała szerokość jest wymagana", + "right-width-percentage-required": "Odpowiedni procent jest wymagany", + "left-width-percentage-required": "Lewy procent jest wymagany", + "divider": "Rozdziel panel", + "right-side": "Układ prawej strony", + "left-side": "Układ lewej strony" + }, + "legend": { + "direction": "Kierunek legendy", + "position": "Pozycja legendy", + "show-values": "Show values", + "min-option": "Min", + "max-option": "Max", + "average-option": "Average", + "total-option": "Total", + "latest-option": "Latest", + "sort-legend": "Sortuj klucze danych w legendzie", + "show-max": "Pokaż wartość maksymalną", + "show-min": "Pokaż wartość minimalną", + "show-avg": "Pokaż średnią wartość", + "show-total": "Pokaż całkowitą wartość", + "show-latest": "Pokaż najnowszą wartość", + "settings": "Ustawienia legendy", + "min": "min", + "max": "maks", + "avg": "śr", + "total": "całkowity", + "latest": "najnowszy", + "comparison-time-ago": { + "previousInterval": "(poprzedni interwał)", + "customInterval": "(interwał niestandardowy)", + "days": "(dzień temu)", + "weeks": "(tydzień temu)", + "months": "(miesiąc temu)", + "years": "(rok temu)" } }, - "item":{ - "selected":"Wybrane" + "login": { + "login": "Zaloguj sie", + "request-password-reset": "Poproś o zresetowanie hasła", + "reset-password": "Zresetuj hasło", + "create-password": "Stwórz hasło", + "two-factor-authentication": "Uwierzytelnianie dwuskładnikowe", + "passwords-mismatch-error": "Wpisane hasła muszą być takie same!", + "password-again": "Hasło ponownie", + "sign-in": "proszę, zaloguj się", + "username": "Nazwa użytkownika (e-mail)", + "remember-me": "Zapamiętaj mnie", + "forgot-password": "Zapomniałeś hasła?", + "password-reset": "Resetowania hasła", + "expired-password-reset-message": "Twoje dane uwierzytelniające wygasły! ", + "new-password": "Nowe hasło", + "new-password-again": "Potwierdź nowe hasło", + "password-link-sent-message": "Link resetujący został wysłany", + "email": "E-mail", + "no-account": "Nie masz konta?", + "create-account": "Utwórz konto", + "login-with": "Zaloguj się z {{name}}", + "or": "Lub", + "error": "Błąd logowania", + "verify-your-identity": "Zweryfikować Twoją tożsamość", + "select-way-to-verify": "Wybierz sposób weryfikacji", + "resend-code": "Wyślij kod ponownie", + "resend-code-wait": "Wyślij kod ponownie za { time, plural, =1 {1 sekunda} other { # sekundy } }", + "try-another-way": "Spróbuj w inny sposób", + "totp-auth-description": "Wprowadź kod zabezpieczający z aplikacji uwierzytelniającej.", + "totp-auth-placeholder": "Kod", + "sms-auth-description": "Kod zabezpieczający został wysłany na Twój telefon pod adresem {{contact}}.", + "sms-auth-placeholder": "Kod SMS", + "email-auth-description": "Kod zabezpieczający został wysłany na Twój adres e-mail pod adresem {{contact}}.", + "email-auth-placeholder": "Kod e-mail", + "backup-code-auth-description": "Wprowadź jeden ze swoich kodów zapasowych.", + "backup-code-auth-placeholder": "Kod zapasowy" }, - "js-func":{ - "no-return-error":"Funkcja musi zwrócić wartość!", - "return-type-mismatch":"Funkcja musi zwrócić wartość typu '{{type}}'!", - "tidy":"Porządek", - "mini":"Mini" + "signup": { + "firstname": "Imię", + "lastname": "Nazwisko", + "email": "E-mail", + "signup": "Zapisz się", + "create-password": "Stwórz hasło", + "repeat-password": "Powtórz swoje hasło", + "have-account": "Posiadasz już konto?", + "signin": "Zaloguj się", + "no-captcha-message": "Musisz potwierdzić, że nie jesteś robotem", + "password-length-message": "Twoje hasło musi mieć co najmniej 6 znaków", + "email-verification": "Weryfikacja adresu e-mail", + "email-verification-message": "Na podany adres e-mail została wysłana wiadomość e-mail zawierająca szczegóły weryfikacji.
Aby dokończyć procedurę rejestracji, postępuj zgodnie z instrukcjami zawartymi w wiadomości e-mail.
Uwaga: jeśli nie widziałeś wiadomości e-mail przez jakiś czas, sprawdź folder „spam” lub spróbuj wysłać wiadomość ponownie, klikając przycisk „Wyślij ponownie”.", + "account-activation-title": "Aktywacja konta", + "account-activated": "Konto zostało pomyślnie aktywowane!", + "account-activated-text": "Gratulacje!
Twoje konto zostało aktywowane.", + "resend": "Wyślij ponownie", + "inactive-user-exists-title": "Nieaktywny użytkownik już istnieje", + "inactive-user-exists-text": "Istnieje już zarejestrowany użytkownik z niezweryfikowanym adresem e-mail.
Kliknij przycisk „Wyślij ponownie”, jeśli chcesz ponownie wysłać wiadomość weryfikacyjną.", + "activating-account": "Aktywuję konto...", + "activating-account-text": "Twoje konto jest obecnie aktywowane. Czekaj...", + "accept-privacy-policy": "Zaakceptuj Politykę prywatności", + "accept": "Akceptuj", + "privacy-policy": "Polityka prywatności", + "accept-privacy-policy-message": "Musisz zaakceptować naszą Politykę prywatności", + "recaptcha-title": "reCAPTCHA", + "terms-of-use": "Warunki użytkowania", + "accept-terms-of-use-message": "Musisz zaakceptować nasze Warunki użytkowania" }, - "key-val":{ - "key":"Klucz", - "value":"Wartość", - "remove-entry":"Usuń wpis", - "add-entry":"Dodaj wpis", - "no-data":"Brak danych" - }, - "layout":{ - "layout":"Układ", - "layouts":"Układy", - "manage":"Zarządzaj układami", - "settings":"Ustawienia układu", - "color":"Kolor", - "main":"Główny", - "right":"Prawo", - "left":"Lewo", - "select":"Wybierz docelowy układ", - "percentage-width":"Szerokość procentowa (%)", - "fixed-width":"Szerokość stała (px)", - "left-width":"Szerokość lewej kolumny (%)", - "right-width":"Szerokość prawej kolumny (%)", - "pick-fixed-side":"Stała strona: ", - "layout-fixed-width":"Szerokość stała (px)", - "value-min-error":"Wartość musi być większa niż {{min}}{{unit}}", - "value-max-error":"Wartość musi być mniejsza niż {{max}}{{unit}}", - "layout-fixed-width-required":"Szerokość stała jest wymagana", - "right-width-percentage-required":"Wymagany jest procent szerokości prawej strony", - "left-width-percentage-required":"Wymagany jest procent szerokości lewej strony", - "divider":"Podziałka", - "right-side":"Układ prawej strony", - "left-side":"Układ lewej strony" - }, - "legend":{ - "direction":"Kierunek", - "position":"Pozycja", - "show-values":"Pokaż wartości", - "min-option":"Min", - "max-option":"Maks.", - "average-option":"Średnia", - "total-option":"Suma", - "latest-option":"Najnowsza", - "sort-legend":"Sortuj klucze danych w legendzie", - "show-max":"Pokaż maksymalną wartość", - "show-min":"Pokaż minimalną wartość", - "show-avg":"Pokaż średnią wartość", - "show-total":"Pokaż sumę wartości", - "show-latest":"Pokaż najnowszą wartość", - "settings":"Ustawienia legendy", - "min":"min", - "max":"maks.", - "avg":"śr.", - "total":"suma", - "latest":"najnowsza", - "comparison-time-ago":{ - "previousInterval":"(poprzedni przedział)", - "customInterval":"(niestandardowy przedział)", - "days":"(dzień temu)", - "weeks":"(tydzień temu)", - "months":"(miesiąc temu)", - "years":"(rok temu)" + "notification": { + "action-button": "Przycisk akcji", + "action-type": "Rodzaj działania", + "active": "Aktywny", + "add-notification-recipients-group": "Dodaj grupę odbiorców powiadomień", + "add-notification-template": "Dodaj szablon powiadomienia", + "add-recipient": "Dodaj odbiorcę", + "add-recipients": "Dodaj odbiorców", + "add-rule": "Dodaj regułę", + "add-stage": "Dodaj scenę", + "add-template": "Dodaj szablon", + "after": "Po", + "alarm-assignment-trigger-settings": "Ustawienia wyzwalacza przypisania alarmu", + "alarm-comment-trigger-settings": "Ustawienia wyzwalania komentarza alarmowego", + "alarm-trigger-settings": "Ustawienia wyzwalania alarmu", + "all": "Wszystko", + "api-feature-hint": "Jeśli pole jest puste, wyzwalacz zostanie zastosowany do wszystkich funkcji interfejsu API", + "api-usage-trigger-settings": "Ustawienia wyzwalacza użycia interfejsu API", + "new-platform-version-trigger-settings": "Ustawienia wyzwalacza nowej wersji platformy", + "rate-limits-trigger-settings": "Exceeded rate limits trigger settings", + "at-least-one-should-be-selected": "Należy wybrać przynajmniej jeden", + "basic-settings": "Podstawowe ustawienia", + "button-text": "Przycisk tekstowy", + "button-text-required": "Tekst przycisku jest wymagany", + "button-text-max-length": "Długość tekst przycisku powinna być mniejsza lub równa {{ length }} znaków", + "compose": "Komponuj", + "conversation": "Rozmowa", + "conversation-required": "Rozmowa jest konieczna", + "copy-notification-template": "Skopiuj szablon powiadomienia", + "copy-rule": "Skopiuj regułę", + "copy-template": "Skopiuj szablon", + "create-new": "Stwórz nowe", + "created": "Utworzony", + "delete-notification-text": "Uważaj, po potwierdzeniu powiadomienia nie będzie można odzyskać.", + "delete-notification-title": "Czy na pewno chcesz usunąć powiadomienie?", + "delete-notifications-text": "Bądź ostrożny, po potwierdzeniu powiadomienia staną się nie do odzyskania.", + "delete-notifications-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 przypomnienie} other {# przypomnień} }?", + "delete-recipient-text": "Uważaj, po potwierdzeniu odbiorcy nie będzie można odzyskać.", + "delete-recipient-title": "Czy na pewno chcesz usunąć odbiorcę {{recipientName}}'?", + "delete-recipients-text": "Bądź ostrożny, po potwierdzeniu odbiorcy staną się niemożliwi do odzyskania.", + "delete-recipients-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 odbiorcę} other {# odbiorców} }?", + "delete-request-text": "Bądź ostrożny, po tym jak prośba o potwierdzenie stanie się niemożliwa do odzyskania.", + "delete-request-title": "Czy na pewno chcesz usunąć rządanie?", + "delete-requests-text": "Bądź ostrożny, po tym jak prośby o potwierdzenie staną się nie do odzyskania.", + "delete-requests-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 rządanie} other {# rządań} }?", + "delete-rule-text": "Bądź ostrożny, gdy reguła potwierdzenia stanie się niemożliwa do odzyskania.", + "delete-rule-title": "Czy na pewno chcesz usunąć regułę '{{ruleName}}'?", + "delete-rules-text": "Bądź ostrożny, po tym jak zasady potwierdzenia staną się nie do odzyskania.", + "delete-rules-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 regułę} other {# reguł} }?", + "delete-template-text": "Zachowaj ostrożność, ponieważ szablon potwierdzenia stanie się niemożliwy do odzyskania.", + "delete-template-title": "Czy na pewno chcesz usunąć szablon '{{templateName}}'?", + "delete-templates-text": "Bądź ostrożny, gdy szablony potwierdzeń staną się nie do odzyskania.", + "delete-templates-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 szablon} other {# szablonów} }?", + "deleted": "Usunięto", + "delivery-method": { + "delivery-method": "Sposób przesyłu", + "email": "E-mail", + "email-preview": "Podgląd powiadomienia e-mail", + "slack": "Slack", + "slack-preview": "Podgląd powiadomień Slacka", + "microsoft-teams": "Microsoft Teams", + "microsoft-teams-preview": "Microsoft Teams notification preview", + "sms": "SMS", + "sms-preview": "Podgląd powiadomień SMS", + "web": "Sieć", + "web-preview": "Podgląd powiadomień internetowych" }, - "label":"Etykieta", - "value":"Wartość" - }, - "login":{ - "login":"Zaloguj się", - "request-password-reset":"Zażądaj resetu hasła", - "reset-password":"Resetuj hasło", - "create-password":"Utwórz hasło", - "two-factor-authentication":"Autentykacja dwuskładnikowa", - "passwords-mismatch-error":"Wprowadzone hasła muszą być takie same!", - "password-again":"Powtórz hasło", - "sign-in":"Proszę się zalogować", - "username":"Nazwa użytkownika (e-mail)", - "remember-me":"Zapamiętaj mnie", - "forgot-password":"Zapomniałeś hasła?", - "password-reset":"Reset hasła", - "expired-password-reset-message":"Twoje dane uwierzytelniające wygasły! Proszę utworzyć nowe hasło.", - "new-password":"Nowe hasło", - "new-password-again":"Potwierdź nowe hasło", - "password-link-sent-message":"Link do resetowania hasła został wysłany", - "email":"E-mail", - "login-with":"Zaloguj się za pomocą {{name}}", - "or":"lub", - "error":"Błąd logowania", - "verify-your-identity":"Zweryfikuj swoją tożsamość", - "select-way-to-verify":"Wybierz sposób weryfikacji", - "resend-code":"Wyślij kod ponownie", - "resend-code-wait":"Ponownie wyślij kod za { time, plural, =1 {1 sekundę} other {# sekundy} }", - "try-another-way":"Spróbuj inną metodę", - "totp-auth-description":"Proszę podać kod z aplikacji autoryzacyjnej.", - "totp-auth-placeholder":"Kod", - "sms-auth-description":"Kod zabezpieczający został wysłany na Twój telefon pod numerem {{contact}}.", - "sms-auth-placeholder":"Kod SMS", - "email-auth-description":"Kod zabezpieczający został wysłany na Twój adres e-mailowy {{contact}}.", - "email-auth-placeholder":"Kod e-mailowy", - "backup-code-auth-description":"Proszę podać jeden z kodów zapasowych.", - "backup-code-auth-placeholder":"Kod zapasowy" - }, - "markdown":{ - "edit":"Edytuj", - "preview":"Podgląd", - "copy-code":"Kliknij, aby skopiować", - "copied":"Skopiowano!" - }, - "notification":{ - "action-button":"Przycisk akcji", - "action-type":"Typ akcji", - "active":"Aktywny", - "add-notification-recipients-group":"Dodaj grupę odbiorców powiadomień", - "add-notification-template":"Dodaj szablon powiadomienia", - "add-recipient":"Dodaj odbiorcę", - "add-recipients":"Dodaj odbiorców", - "add-rule":"Dodaj regułę", - "add-stage":"Dodaj etap", - "add-template":"Dodaj szablon", - "after":"Po", - "alarm-assignment-trigger-settings":"Ustawienia wyzwalacza przypisania alarmu", - "alarm-comment-trigger-settings":"Ustawienia wyzwalacza komentarza alarmu", - "alarm-trigger-settings":"Ustawienia wyzwalacza alarmu", - "all":"Wszystkie", - "api-feature-hint":"Jeśli pole jest puste, wyzwalacz zostanie zastosowany do wszystkich funkcji API", - "api-usage-trigger-settings":"Ustawienia wyzwalacza korzystania z API", - "new-platform-version-trigger-settings":"Ustawienia wyzwalacza nowej wersji platformy", - "rate-limits-trigger-settings":"Ustawienia wyzwalacza przekroczenia limitów szybkości", - "at-least-one-should-be-selected":"Przynajmniej jedna pozycja musi być zaznaczona", - "basic-settings":"Podstawowe ustawienia", - "button-text":"Tekst przycisku", - "button-text-required":"Tekst przycisku jest wymagany", - "button-text-max-length":"Tekst przycisku powinien być krótszy lub równy {{ length }} znaków", - "compose":"Komponuj", - "conversation":"Rozmowa", - "conversation-required":"Rozmowa jest wymagana", - "copy-notification-template":"Skopiuj szablon powiadomienia", - "copy-rule":"Skopiuj regułę", - "copy-template":"Skopiuj szablon", - "create-new":"Utwórz nowe", - "created":"Utworzono", - "delete-notification-text":"Uważaj, po potwierdzeniu powiadomienie stanie się nieodwracalne.", - "delete-notification-title":"Czy na pewno chcesz usunąć powiadomienie?", - "delete-notifications-text":"Uważaj, po potwierdzeniu powiadomienia staną się nieodwracalne.", - "delete-notifications-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 powiadomienie} other {# powiadomienia} }?", - "delete-recipient-text":"Uważaj, po potwierdzeniu odbiorca stanie się nieodwracalny.", - "delete-recipient-title":"Czy na pewno chcesz usunąć odbiorcę '{{recipientName}}'?", - "delete-recipients-text":"Uważaj, po potwierdzeniu odbiorcy staną się nieodwracalni.", - "delete-recipients-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 odbiorcę} other {# odbiorców} }?", - "delete-request-text":"Uważaj, po potwierdzeniu żądanie stanie się nieodwracalne.", - "delete-request-title":"Czy na pewno chcesz usunąć żądanie?", - "delete-requests-text":"Uważaj, po potwierdzeniu żądania staną się nieodwracalne.", - "delete-requests-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 żądanie} other {# żądań} }?", - "delete-rule-text":"Uważaj, po potwierdzeniu reguła stanie się nieodwracalna.", - "delete-rule-title":"Czy na pewno chcesz usunąć regułę '{{ruleName}}'?", - "delete-rules-text":"Uważaj, po potwierdzeniu reguły staną się nieodwracalne.", - "delete-rules-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 regułę} other {# reguł} }?", - "delete-template-text":"Uważaj, po potwierdzeniu szablon stanie się nieodwracalny.", - "delete-template-title":"Czy na pewno chcesz usunąć szablon '{{templateName}}'?", - "delete-templates-text":"Uważaj, po potwierdzeniu szablony staną się nieodwracalne.", - "delete-templates-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 szablon} other {# szablonów} }?", - "deleted":"Usunięto", - "delivery-method":{ - "delivery-method":"Metoda dostarczania", - "email":"Email", - "email-preview":"Podgląd powiadomienia email", - "slack":"Slack", - "slack-preview":"Podgląd powiadomienia Slack", - "microsoft-teams":"Microsoft Teams", - "microsoft-teams-preview":"Podgląd powiadomienia Microsoft Teams", - "sms":"SMS", - "sms-preview":"Podgląd powiadomienia SMS", - "web":"Web", - "web-preview":"Podgląd powiadomienia web" + "delivery-method-not-configure-click": "Metoda dostawy nie jest skonfigurowana. ", + "delivery-method-not-configure-contact": "Metoda dostawy nie jest skonfigurowana. ", + "delivery-methods": "metody dostarczania", + "description": "Opis", + "device-activity-trigger-settings": "Ustawienia aktywnego wyzwalacza urządzenia", + "device-list-rule-hint": "Jeśli pole jest puste, wyzwalacz zostanie zastosowany do wszystkich urządzeń", + "device-profiles-list-rule-hint": "Jeśli pole będzie puste, wyzwalacz zostanie zastosowany do wszystkich profili urządzeń", + "disabled": "Wyłączony", + "edit-notification-recipients-group": "Edytuj grupę odbiorców powiadomień", + "edit-notification-template": "Edytuj szablon powiadomienia", + "edit-rule": "Edytuj regułę", + "edit-template": "Edytuj szablon", + "enabled": "Włączony", + "entities-limit-trigger-settings": "Ustawienia wyzwalacza ograniczania obiektów", + "entity-action-trigger-settings": "Ustawienia wyzwalacza akcji obiektu", + "entity-type": "Typ obiektu", + "escalation-chain": "Łańcuch eskalacji", + "failed-send": "Niepowodzenie wysyłania", + "fails": "{ count, plural, =1 {1 niepowodzenie} other {# niepowodzeń} }", + "filter": "Filtr", + "first-recipient": "Pierwszy odbiorca", + "inactive": "Nieaktywny", + "inbox": "Skrzynka odbiorcza", + "notification-inbox": "Powiadomienia / Skrzynka odbiorcza", + "input-field-support-templatization": "Szablonowanie obsługi pola wejściowego.", + "input-fields-support-templatization": "Pola wejściowe obsługują szablonowanie.", + "integration-action-trigger-settings": "Ustawienia wyzwalacza zdarzeń integracji", + "integration-list-rule-hint": "Jeśli pole będzie puste, wyzwalacz zostanie zastosowany do wszystkich integracji", + "link": "Link", + "link-required": "Link jest wymagany", + "link-type": { + "dashboard": "Otwórz Panel", + "link": "Otwórz łącze URL" }, - "delivery-method-not-configure-click":"Metoda dostarczania nie jest skonfigurowana. Kliknij, aby skonfigurować.", - "delivery-method-not-configure-contact":"Metoda dostarczania nie jest skonfigurowana. Skontaktuj się z administratorem systemu.", - "delivery-methods":"Metody dostarczania", - "description":"Opis", - "device-activity-trigger-settings":"Ustawienia wyzwalacza aktywności urządzenia", - "device-list-rule-hint":"Jeśli pole jest puste, wyzwalacz zostanie zastosowany do wszystkich urządzeń", - "device-profiles-list-rule-hint":"Jeśli pole jest puste, wyzwalacz zostanie zastosowany do wszystkich profili urządzeń", - "disabled":"Wyłączone", - "edit-notification-recipients-group":"Edytuj grupę odbiorców powiadomień", - "edit-notification-template":"Edytuj szablon powiadomień", - "edit-rule":"Edytuj regułę", - "edit-template":"Edytuj szablon", - "enabled":"Włączone", - "entities-limit-trigger-settings":"Ustawienia wyzwalacza limitu encji", - "entity-action-trigger-settings":"Ustawienia wyzwalacza akcji encji", - "entity-type":"Typ encji", - "escalation-chain":"Łańcuch eskalacji", - "failed-send":"Błędy wysyłki", - "fails":"{ count, plural, =1 {1 błąd} other {# błędów} }", - "filter":"Filtr", - "first-recipient":"Pierwszy odbiorca", - "inactive":"Nieaktywne", - "inbox":"Skrzynka odbiorcza", - "notification-inbox":"Powiadomienia / Skrzynka odbiorcza", - "input-field-support-templatization":"Pole wejściowe obsługuje szablonowanie.", - "input-fields-support-templatization":"Pola wejściowe obsługują szablonowanie.", - "link":"Odnośnik", - "link-required":"Odnośnik jest wymagany", - "link-type":{ - "dashboard":"Otwórz pulpit nawigacyjny", - "link":"Otwórz link URL" + "loading-notifications": "Loading notifications...", + "management": "Zarządzanie powiadomieniami", + "mark-all-as-read": "Oznacz wszystkie jako przeczytane", + "mark-as-read": "Oznacz jako przeczytane", + "message": "Wiadomość", + "message-required": "Wiadomość jest wymagana", + "message-max-length": "Komunikat powinien być mniejszy lub równy {{ length }} znaków", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana", + "new-notification": "Nowe powiadomienie", + "no-inbox-notification": "Nie znaleziono powiadomienia", + "no-notification-request": "Brak żądania powiadomienia", + "no-notification-templates": "Nie znaleziono szablonów powiadomień", + "no-notifications-yet": "Nie ma jeszcze żadnych powiadomień", + "no-recipients-notification": "Brak powiadomienia odbiorców", + "no-rule": "Nie skonfigurowano żadnej reguły", + "no-rules-notification": "Brak powiadomienia o zasadach", + "no-severity-found": "Nie znaleziono powagi", + "no-severity-matching": "'{{severity}}' nie znaleziono.", + "no-template-matching": "Brak dopasowania zasobów '{{template}}' zostały znalezione.", + "not-found-slack-recipient": "Nie znaleziono odbiorcy Slacka", + "notification": "Powiadomienie", + "notification-center": "Centrum powiadomień", + "notify": "powiadom", + "notify-again": "Powiadom ponownie", + "notify-alarm-action": { + "acknowledged": "Alarm potwierdzony", + "assigned": "Alarm przypisany", + "cleared": "Alarm usunięty", + "created": "Utworzono alarm", + "severity-changed": "Zmieniono wagę alarmu", + "unassigned": "Alarm nieprzypisany" }, - "loading-notifications":"Ładowanie powiadomień...", - "management":"Zarządzanie powiadomieniami", - "mark-all-as-read":"Oznacz wszystkie jako przeczytane", - "mark-as-read":"Oznacz jako przeczytane", - "message":"Wiadomość", - "message-required":"Wiadomość jest wymagana", - "message-max-length":"Wiadomość powinna mieć mniej niż {{ length }} znaków", - "name":"Nazwa", - "name-required":"Nazwa jest wymagana", - "new-notification":"Nowe powiadomienie", - "no-inbox-notification":"Nie znaleziono powiadomień", - "no-notification-request":"Brak zapytania o powiadomienie", - "no-notification-templates":"Nie znaleziono szablonów powiadomień", - "no-notifications-yet":"Brak powiadomień", - "no-recipients-notification":"Powiadomienie bez odbiorców", - "no-rule":"Nie skonfigurowano reguły", - "no-rules-notification":"Brak powiadomienia o regułach", - "no-severity-found":"Nie znaleziono powagi", - "no-severity-matching":"Nie znaleziono '{{severity}}'.", - "no-template-matching":"Nie znaleziono zasobów pasujących do '{{template}}'.", - "not-found-slack-recipient":"Nie znaleziono odbiorcy Slack", - "notification":"Powiadomienie", - "notification-center":"Centrum powiadomień", - "notify":"powiadomić", - "notify-again":"Powiadom ponownie", - "notify-alarm-action":{ - "acknowledged":"Alarm potwierdzony", - "assigned":"Alarm przypisany", - "cleared":"Alarm wyczyszczony", - "created":"Alarm utworzony", - "severity-changed":"Zmieniono powagę alarmu", - "unassigned":"Alarm nieprzypisany" + "notify-on": "Powiadom dalej", + "notify-on-comment-update": "Powiadom o aktualizacji komentarza", + "notify-on-required": "Powiadomienie jest wymagane", + "notify-on-unassign": "Powiadom o anulowaniu przypisania", + "notify-only-integrations-errors": "Powiadamiaj tylko o błędzie", + "notify-only-user-comments": "Powiadamiaj tylko o komentarzach użytkowników", + "only-rule-chain-lifecycle-failures": "Tylko awarie cyklu życia łańcucha reguł", + "only-rule-node-lifecycle-failures": "Tylko awarie cyklu życia węzła reguły", + "platform-users": "Użytkownicy platformy", + "rate-limits": "Rate limits", + "rate-limits-hint": "If the field is empty, the trigger will be applied to all rate limits", + "recipient": "Odbiorca", + "recipient-group": "Grupa odbiorców", + "recipient-type": { + "affected-tenant-administrators": "Dotknięci administratorzy Tenanta", + "affected-user": "Dotknięty użytkownik", + "affected-user-hint": "Dotknięta wskazówka dla użytkownika", + "all-users": "Wszyscy użytkownicy", + "customer-users": "Użytkownicy klientów", + "system-administrators": "Administratorzy systemu", + "tenant-administrators": "Administratorzy tenanta", + "user-filters": "Filtr użytkownika", + "user-group-list": "Lista grup użytkowników", + "user-list": "Lista użytkowników", + "user-role": "Rola użytkownika", + "users-entity-owner": "Użytkownicy właściciela obiektu", + "users-entity-owner-hint": "Użytkownicy podpowiedzi właściciela obiektu" }, - "notify-on":"Powiadamiaj o", - "notify-on-comment-update":"Powiadamiaj o aktualizacji komentarza", - "notify-on-required":"Wymagane jest powiadomienie o", - "notify-on-unassign":"Powiadamiaj o cofnięciu przypisania", - "notify-only-user-comments":"Powiadamiaj tylko o komentarzach użytkownika", - "only-rule-chain-lifecycle-failures":"Tylko niepowodzenia cyklu życia łańcucha reguł", - "only-rule-node-lifecycle-failures":"Tylko niepowodzenia cyklu życia węzła reguły", - "platform-users":"Użytkownicy platformy", - "rate-limits":"Limity częstotliwości", - "rate-limits-hint":"Jeśli pole jest puste, wyzwalacz zostanie zastosowany do wszystkich limitów częstotliwości", - "recipient":"Odbiorca", - "recipient-group":"Grupa odbiorców", - "recipient-type":{ - "affected-tenant-administrators":"Dotknięci administratorzy najemcy", - "affected-user":"Dotknięty użytkownik", - "all-users":"Wszyscy użytkownicy", - "customer-users":"Użytkownicy klientów", - "system-administrators":"Administratorzy systemu", - "tenant-administrators":"Administratorzy najemcy", - "user-filters":"Filtr użytkowników", - "user-list":"Lista użytkowników", - "users-entity-owner":"Użytkownicy właściciela jednostki" + "recipients": "Odbiorcy", + "notification-recipients": "Powiadomienia / Odbiorcy", + "recipients-count": "{ count, plural, =1 {1 odbiorca} other {# odbiorców} }", + "recipients-required": "Odbiorcy są potrzebni", + "refresh-allow-delivery-method": "Odśwież zezwól na metodę dostawy", + "request-search": "Poproś o wyszukiwanie", + "request-status": { + "processing": "Przetwarzanie", + "scheduled": "Zaplanowany", + "sent": "Wysłano" }, - "recipients":"Odbiorcy", - "notification-recipients":"Powiadomienia / Odbiorcy", - "recipients-count":"{ count, plural, =1 {1 odbiorca} other {# odbiorców} }", - "recipients-required":"Odbiorcy są wymagani", - "refresh-allow-delivery-method":"Odśwież metodę dostarczania", - "request-search":"Wyszukaj żądanie", - "request-status":{ - "processing":"Przetwarzanie", - "scheduled":"Zaplanowane", - "sent":"Wysłane" + "review": "Recenzja", + "rule": "Reguła", + "rule-chain-list-rule-hint": "Jeśli pole jest puste, wyzwalacz zostanie zastosowany do wszystkich łańcuchów reguł", + "rule-engine-events-trigger-settings": "Ustawienia wyzwalania zdarzeń silnika reguł", + "rule-engine-filter": "Filtr silnika reguł", + "rule-name": "Nazwa reguły", + "rule-name-required": "Nazwa jest wymagana", + "rule-disable": "Disable notification rule", + "rule-enable": "Enable notification rule", + "rule-node-filter": "Filtr węzła reguły", + "rules": "Zasady", + "notification-rules": "Powiadomienia / Zasady", + "scheduler-later": "Zaplanuj na później", + "search-notification": "Wyszukaj powiadomienia", + "search-recipients": "Wyszukaj odbiorców", + "search-rules": "Zasady wyszukiwania", + "search-templates": "Wyszukaj szablony", + "see-documentation": "Zobacz dokumentację", + "selected-notifications": "Wybrano { count, plural, =1 {1 powiadomienie} other {# powiadomień} }", + "selected-recipients": "Wybrano { count, plural, =1 {1 odbiorcę} other {# odbiorców} }", + "selected-requests": "Wybrano { count, plural, =1 {1 rządanie} other {# rządań} }", + "selected-rules": "Wybrano { count, plural, =1 {1 zasadę} other {# zasad} }", + "selected-template": "Wybrano { count, plural, =1 {1 szablon} other {# szablonów} }", + "send-notification": "Wyślij powiadomienie", + "sent": "Wysłano", + "notification-sent": "Powiadomienia / Wysłane", + "set-entity-from-notification": "Ustaw obiekt z powiadomienia na stan panelu", + "slack-chanel-type": "Typ kanału slack", + "slack-chanel-types": { + "direct": "Wiadomość docelowa", + "private-channel": "Kanał prywatny", + "public-channel": "Kanał publiczny" }, - "review":"Recenzja", - "rule":"Reguła", - "rule-chain-list-rule-hint":"Jeśli pole jest puste, wyzwalacz zostanie zastosowany do wszystkich łańcuchów reguł", - "rule-engine-events-trigger-settings":"Ustawienia wyzwalaczy zdarzeń silnika reguł", - "rule-engine-filter":"Filtr silnika reguł", - "rule-name":"Nazwa reguły", - "rule-name-required":"Nazwa jest wymagana", - "rule-disable":"Wyłącz regułę powiadomienia", - "rule-enable":"Włącz regułę powiadomienia", - "rule-node-filter":"Filtr węzła reguły", - "rules":"Reguły", - "notification-rules":"Powiadomienia / Reguły", - "scheduler-later":"Zaplanuj na później", - "search-notification":"Wyszukaj powiadomienia", - "search-recipients":"Wyszukaj odbiorców", - "search-rules":"Wyszukaj reguły", - "search-templates":"Wyszukaj szablony", - "see-documentation":"Zobacz dokumentację", - "selected-notifications":"{ count, plural, =1 {1 powiadomienie} other {# powiadomień} } wybrano", - "selected-recipients":"{ count, plural, =1 {1 odbiorca} other {# odbiorców} } wybrano", - "selected-requests":"{ count, plural, =1 {1 żądanie} other {# żądań} } wybrano", - "selected-rules":"{ count, plural, =1 {1 reguła} other {# reguł} } wybrano", - "selected-template":"{ count, plural, =1 {1 szablon} other {# szablonów} } wybrano", - "send-notification":"Wyślij powiadomienie", - "sent":"Wysłane", - "notification-sent":"Powiadomienia / Wysłane", - "set-entity-from-notification":"Ustaw jednostkę z powiadomienia na stan pulpitu nawigacyjnego", - "slack-chanel-type":"Typ kanału Slack", - "slack-chanel-types":{ - "direct":"Wiadomość bezpośrednia", - "private-channel":"Prywatny kanał", - "public-channel":"Publiczny kanał" + "start-from-scratch": "Zacznij od początku", + "status": "Status", + "stop-escalation-alarm-status-become": "Zatrzymaj eskalację stanu alarmowego:", + "subject": "Temat", + "subject-required": "Temat jest wymagany", + "template": "Szablon", + "template-name": "Nazwa szablonu", + "template-required": "Szablon jest wymagany", + "template-type": { + "alarm": "Alarm", + "alarm-assignment": "Przypisanie alarmu", + "alarm-comment": "Komentarz alarmowy", + "api-usage-limit": "Limit wykorzystania API", + "device-activity": "Aktywność urządzenia", + "entities-limit": "Limit obiektów", + "entity-action": "Działanie obiektu", + "general": "Ogólny", + "integration-lifecycle-event": "Zdarzenie cyklu życia integracji", + "rule-engine-lifecycle-event": "Zdarzenie cyklu życia silnika reguł", + "rule-node": "Węzeł reguły", + "new-platform-version": "Nowa wersja platformy", + "rate-limits": "Exceeded rate limits" }, - "start-from-scratch":"Rozpocznij od początku", - "status":"Status", - "stop-escalation-alarm-status-become":"Zatrzymaj eskalację, gdy status alarmu stanie się:", - "subject":"Temat", - "subject-required":"Temat jest wymagany", - "template":"Szablon", - "template-name":"Nazwa szablonu", - "template-required":"Szablon jest wymagany", - "template-type":{ - "alarm":"Alarm", - "alarm-assignment":"Przypisanie alarmu", - "alarm-comment":"Komentarz do alarmu", - "api-usage-limit":"Limit użycia API", - "device-activity":"Aktywność urządzenia", - "entities-limit":"Limit jednostek", - "entity-action":"Akcja jednostki", - "general":"Ogólny", - "rule-engine-lifecycle-event":"Zdarzenie cyklu życia silnika reguł", - "rule-node":"Węzeł reguły", - "new-platform-version":"Nowa wersja platformy", - "rate-limits":"Przekroczono limity częstotliwości" + "templates": "Szablony", + "notification-templates": "Powiadomienia / Szablony", + "tenant-profiles-list-rule-hint": "Jeśli pole jest puste, wyzwalacz zostanie zastosowany do wszystkich profili tenantów", + "tenants-list-rule-hint": "Jeśli pole jest puste, wyzwalacz zostanie zastosowany do wszystkich Tenantów", + "threshold": "Próg", + "theme-color": "Theme color", + "time": "Czas", + "track-rule-node-events": "Śledź zdarzenia węzła reguły", + "trigger": { + "alarm": "Alarm", + "alarm-assignment": "Przypisanie alarmu", + "alarm-comment": "Komentarz alarmowy", + "api-usage-limit": "Limit wykorzystania API", + "device-activity": "Aktywność urządzenia", + "entities-limit": "Limit obiektów", + "entity-action": "Działanie obiektu", + "integration-lifecycle-event": "Zdarzenie cyklu życia integracji", + "rule-engine-lifecycle-event": "Zdarzenie cyklu życia silnika reguł", + "new-platform-version": "Nowa wersja platformy", + "rate-limits": "Exceeded rate limits", + "trigger": "Wyzwalacz", + "trigger-required": "Wyzwalacz jest wymagany" }, - "templates":"Szablony", - "notification-templates":"Powiadomienia / Szablony", - "tenant-profiles-list-rule-hint":"Jeśli pole jest puste, wyzwalacz zostanie zastosowany do wszystkich profili najemców", - "tenants-list-rule-hint":"Jeśli pole jest puste, wyzwalacz zostanie zastosowany do wszystkich najemców", - "threshold":"Próg", - "theme-color":"Kolor motywu", - "time":"Czas", - "track-rule-node-events":"Śledź zdarzenia węzła reguły", - "trigger":{ - "alarm":"Alarm", - "alarm-assignment":"Przypisanie alarmu", - "alarm-comment":"Komentarz do alarmu", - "api-usage-limit":"Limit użycia API", - "device-activity":"Aktywność urządzenia", - "entities-limit":"Limit jednostek", - "entity-action":"Akcja jednostki", - "rule-engine-lifecycle-event":"Zdarzenie cyklu życia silnika reguł", - "new-platform-version":"Nowa wersja platformy", - "rate-limits":"Przekroczono limity częstotliwości", - "trigger":"Wyzwalacz", - "trigger-required":"Wymagany jest wyzwalacz" - }, - "type":"Typ", - "unread":"Nieprzeczytane", - "updated":"Zaktualizowane", - "use-template":"Użyj szablonu", - "view-all":"Pokaż wszystko", - "warning":"Ostrzeżenie", - "webhook-url":"URL Webhooka", - "webhook-url-required":"URL Webhooka jest wymagany", - "channel-name":"Nazwa kanału", - "channel-name-required":"Nazwa kanału jest wymagana", - "settings":{ - "notification-settings":"Ustawienia powiadomień", - "reset-all":"Zresetuj wszystkie ustawienia", - "reset-all-title":"Czy na pewno chcesz zresetować formularz?", - "reset-all-text":"Po potwierdzeniu, formularz ustawień zostanie zresetowany do domyślnej wartości i zapisany.", - "type":"Typ", - "enable-all":"Włącz wszystkie", - "disable-all":"Wyłącz wszystkie", - "delivery-not-configured":"Metoda dostarczania nie jest skonfigurowana" + "type": "Typ", + "unread": "Nieprzeczytane", + "updated": "Zaktualizowane", + "use-template": "Użyj szablonu", + "view-all": "Pokaż wszystkie", + "view-notification-recipients-group": "Wyświetl grupę odbiorców powiadomień", + "view-notification-template": "Wyświetl szablon powiadomienia", + "view-rule": "Zobacz regułę", + "warning": "Ostrzeżenie", + "webhook-url": "Webhook URL", + "webhook-url-required": "Webhook URL is required", + "channel-name": "Channel name", + "channel-name-required": "Channel name is required", + "settings": { + "notification-settings": "Notification settings", + "reset-all": "Reset all settings", + "reset-all-title": "Are you sure you want to reset form?", + "reset-all-text": "After the confirmation, the settings form will reset to the default value and save.", + "type": "Type", + "enable-all": "Enable all", + "disable-all": "Disable all", + "delivery-not-configured": "Delivery method is not configured" } }, - "ota-update":{ - "add":"Dodaj pakiet", - "assign-firmware":"Przypisane oprogramowanie", - "assign-firmware-required":"Przypisane oprogramowanie jest wymagane", - "assign-software":"Przypisane oprogramowanie", - "assign-software-required":"Przypisane oprogramowanie jest wymagane", - "auto-generate-checksum":"Automatycznie generuj sumę kontrolną", - "checksum":"Suma kontrolna", - "checksum-hint":"Jeśli suma kontrolna jest pusta, zostanie wygenerowana automatycznie", - "checksum-algorithm":"Algorytm sumy kontrolnej", - "checksum-copied-message":"Suma kontrolna pakietu została skopiowana do schowka", - "change-firmware":"Zmiana oprogramowania może spowodować aktualizację { count, plural, =1 {1 urządzenia} other {# urządzeń} }.", - "change-software":"Zmiana oprogramowania może spowodować aktualizację { count, plural, =1 {1 urządzenia} other {# urządzeń} }.", - "chose-compatible-device-profile":"Wgrany pakiet będzie dostępny tylko dla urządzeń z wybranym profilem.", - "chose-firmware-distributed-device":"Wybierz oprogramowanie, które zostanie rozprowadzone na urządzenia", - "chose-software-distributed-device":"Wybierz oprogramowanie, które zostanie rozprowadzone na urządzenia", - "content-type":"Typ zawartości", - "copy-checksum":"Kopiuj sumę kontrolną", - "copy-direct-url":"Kopiuj bezpośredni adres URL", - "copyId":"Kopiuj identyfikator pakietu", - "copied":"Skopiowane!", - "delete":"Usuń pakiet", - "delete-ota-update-text":"Bądź ostrożny, po potwierdzeniu aktualizacja OTA stanie się nieodwracalna.", - "delete-ota-update-title":"Czy na pewno chcesz usunąć aktualizację OTA „{{title}}”?", - "delete-ota-updates-text":"Bądź ostrożny, po potwierdzeniu wszystkie wybrane aktualizacje OTA zostaną usunięte.", - "delete-ota-updates-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 aktualizację OTA} other {# aktualizacji OTA} }?", - "description":"Opis", - "direct-url":"Bezpośredni adres URL", - "direct-url-copied-message":"Bezpośredni adres URL pakietu został skopiowany do schowka", - "direct-url-required":"Bezpośredni adres URL jest wymagany", - "download":"Pobierz pakiet", - "drop-file":"Przeciągnij i upuść plik pakietu lub kliknij, aby wybrać plik do przesłania.", - "drop-package-file-or":"Przeciągnij i upuść plik pakietu lub", - "file-name":"Nazwa pliku", - "file-size":"Rozmiar pliku", - "file-size-bytes":"Rozmiar pliku w bajtach", - "idCopiedMessage":"Identyfikator pakietu został skopiowany do schowka", - "no-firmware-matching":"Nie znaleziono kompatybilnych pakietów aktualizacji oprogramowania układowego pasujących do „{{entity}}”.", - "no-firmware-text":"Brak kompatybilnych pakietów aktualizacji oprogramowania układowego.", - "no-packages-text":"Nie znaleziono pakietów", - "no-software-matching":"Nie znaleziono kompatybilnych pakietów aktualizacji oprogramowania pasujących do „{{entity}}”.", - "no-software-text":"Brak kompatybilnych pakietów aktualizacji oprogramowania.", - "ota-update":"Aktualizacja OTA", - "ota-update-details":"Szczegóły aktualizacji OTA", - "ota-updates":"Aktualizacje OTA", - "package-file":"Plik pakietu", - "package-type":"Typ pakietu", - "packages-repository":"Repozytorium pakietów", - "search":"Szukaj pakietów", - "selected-package":"{ count, plural, =1 {1 pakiet} other {# pakietów} } wybrano", - "title":"Tytuł", - "title-required":"Tytuł jest wymagany.", - "title-max-length":"Tytuł powinien mieć mniej niż 256", - "types":{ - "firmware":"Oprogramowanie układowe", - "software":"Oprogramowanie" + "ota-update": { + "add": "Dodaj pakiet", + "assign-firmware": "Przypisane oprogramowanie sprzętowe", + "assign-firmware-required": "Przypisane oprogramowanie sprzętowe jest wymagane", + "assign-software": "Przydzielone oprogramowanie", + "assign-software-required": "Przypisane oprogramowanie jest wymagane", + "auto-generate-checksum": "Automatycznie generuj sumę kontrolną", + "cant-applied-group-all": "Nie można zastosować do grupy Wszystkie", + "checksum": "Suma kontrolna", + "checksum-hint": "Jeśli suma kontrolna jest pusta, zostanie wygenerowana automatycznie", + "checksum-algorithm": "Algorytm sumy kontrolnej", + "checksum-copied-message": "Suma kontrolna pakietu została skopiowana do schowka", + "change-firmware": "Zmiana oprogramowania sprzętowego może spowodować aktualizację { count, plural, =1 {1 urządzenia} other {# urządzeń} }.", + "change-software": "Zmiana oprogramowania może spowodować aktualizację { count, plural, =1 {1 urządzenia} other {# urządzeń} }.", + "chose-compatible-device-profile": "Przesłany pakiet będzie dostępny tylko dla urządzeń z wybranym profilem.", + "chose-firmware-distributed-device": "Wybierz oprogramowanie sprzętowe, które będzie dystrybuowane na urządzenia", + "chose-software-distributed-device": "Wybierz oprogramowanie, które będzie dystrybuowane na urządzenia", + "content-type": "Typ zawartości", + "copy-checksum": "Skopiuj sumę kontrolną", + "copy-direct-url": "Skopiuj bezpośredni adres URL", + "copyId": "Skopiuj identyfikator pakietu", + "copied": "Skopiowano!", + "delete": "Usuń pakiet", + "delete-ota-update-text": "Uważaj, po potwierdzeniu aktualizacji OTA nie będzie można odzyskać.", + "delete-ota-update-title": "Czy na pewno chcesz usunąć aktualizację OTA {{title}}'?", + "delete-ota-updates-text": "Uważaj, po potwierdzeniu wszystkie wybrane aktualizacje OTA zostaną usunięte.", + "delete-ota-updates-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 OTA update} other {# OTA updates} }?", + "description": "Opis", + "direct-url": "Bezpośredni adres URL", + "direct-url-copied-message": "Bezpośredni adres URL pakietu został skopiowany do schowka", + "direct-url-required": "Bezpośredni adres URL jest wymagany", + "download": "Pobierz pakiet", + "drop-file": "Upuść plik pakietu lub kliknij, aby wybrać plik do przesłania.", + "drop-package-file-or": "Przeciągnij i upuść plik pakietu lub", + "file-name": "Nazwa pliku", + "file-size": "Rozmiar pliku", + "file-size-bytes": "Rozmiar pliku w bajtach", + "idCopiedMessage": "Identyfikator pakietu został skopiowany do schowka", + "no-firmware-matching": "Nie znaleziono kompatybilnych pakietów aktualizacji oprogramowania sprzętowego OTA pasujących do '{{entity}}'.", + "no-firmware-text": "Brak kompatybilnych pakietów aktualizacji oprogramowania sprzętowego OTA.", + "no-packages-text": "Nie znaleziono pakietów", + "no-software-matching": "Nie znaleziono kompatybilnych pakietów aktualizacji oprogramowania OTA pasujących do '{{entity}}'.", + "no-software-text": "Brak kompatybilnych pakietów aktualizacji oprogramowania OTA.", + "ota-update": "Aktualizacja OTA", + "ota-update-details": "Szczegóły aktualizacji OTA", + "ota-updates": "Aktualizacje OTA", + "package-type": "Typ pakietu", + "packages-repository": "Repozytorium pakietów", + "search": "Wyszukaj pakiety", + "selected-package": "Wybrano { count, plural, =1 {1 pakiet} other {# pakietów} }", + "title": "Tytuł", + "title-required": "Tytuł jest wymagany.", + "title-max-length": "Tytuł powinien być mniejszy niż 256", + "types": { + "firmware": "Oprogramowanie sprzętowe", + "software": "Oprogramowanie" }, - "upload-binary-file":"Prześlij plik binarny", - "use-external-url":"Użyj zewnętrznego adresu URL", - "version":"Wersja", - "version-required":"Wersja jest wymagana.", - "version-tag":"Tag wersji", - "version-tag-hint":"Niestandardowy tag powinien pasować do wersji pakietu zgłoszonej przez Twoje urządzenie.", - "version-max-length":"Wersja powinna mieć mniej niż 256", - "warning-after-save-no-edit":"Po przesłaniu pakietu nie będziesz mógł edytować tytułu, wersji, profilu urządzenia i typu pakietu." + "upload-binary-file": "Prześlij plik binarny", + "use-external-url": "Użyj zewnętrznego adresu URL", + "version": "Wersja", + "version-required": "Wersja jest wymagana.", + "version-tag": "Oznaczenie wersji", + "version-tag-hint": "Tag niestandardowy powinien odpowiadać wersji pakietu zgłaszanej przez Twoje urządzenie.", + "version-max-length": "Wersja powinna być mniejsza niż 256", + "warning-after-save-no-edit": "Po przesłaniu pakietu nie będzie można modyfikować tytułu, wersji, profilu urządzenia ani typu pakietu." }, - "position":{ - "top":"Góra", - "bottom":"Dół", - "left":"Lewo", - "right":"Prawo" + "position": { + "top": "Początek", + "bottom": "Koniec", + "left": "Lewy", + "right": "Prawy" }, - "profile":{ - "profile":"Profil", - "last-login-time":"Ostatnie logowanie", - "change-password":"Zmień hasło", - "current-password":"Obecne hasło", - "copy-jwt-token":"Kopiuj token JWT", - "jwt-token":"Token JWT", - "token-valid-till":"Token jest ważny do", - "tokenCopiedSuccessMessage":"Token JWT został skopiowany do schowka", - "tokenCopiedWarnMessage":"Token JWT wygasł! Proszę odświeżyć stronę." + "profile": { + "profile": "Profil", + "last-login-time": "Ostatnie logowanie", + "change-password": "Zmień hasło", + "current-password": "Aktualne hasło", + "copy-jwt-token": "Skopiuj token JWT", + "jwt-token": "token JWT", + "token-valid-till": "Token jest ważny do", + "tokenCopiedSuccessMessage": "Token JWT został skopiowany do schowka", + "tokenCopiedWarnMessage": "Token JWT wygasł! Odświerz stronę" }, - "profiles":{ - "profiles":"Profile" + "profiles": { + "profiles": "Profile" }, - "security":{ - "security":"Bezpieczeństwo", - "general-settings":"Ogólne ustawienia bezpieczeństwa", - "access-token":"Token dostępu", - "access-token-required":"Token dostępu jest wymagany", - "clientId":"ID klienta", - "clientId-required":"ID klienta jest wymagane", - "username":"Nazwa użytkownika", - "username-required":"Nazwa użytkownika jest wymagana", - "ca-cert":"Certyfikat CA", - "2fa":{ - "2fa":"Uwierzytelnianie dwuskładnikowe", - "2fa-description":"Uwierzytelnianie dwuskładnikowe chroni Twoje konto przed nieautoryzowanym dostępem. Wystarczy wprowadzić kod zabezpieczeń podczas logowania.", - "authenticate-with":"Możesz uwierzytelniać się za pomocą:", - "disable-2fa-provider-text":"Wyłączenie {{name}} spowoduje obniżenie poziomu bezpieczeństwa Twojego konta", - "disable-2fa-provider-title":"Czy na pewno chcesz wyłączyć {{name}}?", - "get-new-code":"Pobierz nowy kod", - "main-2fa-method":"Użyj jako główna metoda uwierzytelniania dwuskładnikowego", - "dialog":{ - "activation-step-description-email":"Następnym razem, gdy się zalogujesz, zostaniesz poproszony o wprowadzenie kodu zabezpieczeń, który zostanie wysłany na Twój adres e-mail.", - "activation-step-description-sms":"Następnym razem, gdy się zalogujesz, zostaniesz poproszony o wprowadzenie kodu zabezpieczeń, który zostanie wysłany na numer telefonu.", - "activation-step-description-totp":"Następnym razem, gdy się zalogujesz, będziesz musiał wprowadzić kod uwierzytelniania dwuskładnikowego.", - "activation-step-label":"Aktywacja", - "backup-code-description":"Wydrukuj kody, aby mieć je pod ręką, gdy będziesz musiał ich użyć do zalogowania się na swoje konto. Każdy kod zapasowy można użyć tylko raz.", - "backup-code-warn":"Po opuszczeniu tej strony te kody nie będą już dostępne. Przechowuj je bezpiecznie, korzystając z dostępnych opcji poniżej.", - "download-txt":"Pobierz (txt)", - "email-step-description":"Podaj adres e-mail, który będziesz używać jako autentykatora.", - "email-step-label":"E-mail", - "enable-email-title":"Włącz autentykator e-mail", - "enable-sms-title":"Włącz autentykator SMS", - "enable-totp-title":"Włącz autentykator aplikacji", - "enter-verification-code":"Wprowadź tutaj 6-cyfrowy kod", - "get-backup-code-title":"Pobierz kod zapasowy", - "next":"Dalej", - "scan-qr-code":"Zeskanuj ten kod QR za pomocą swojej aplikacji uwierzytelniającej", - "send-code":"Wyślij kod", - "sms-step-description":"Podaj numer telefonu, który będziesz używać jako autentykatora.", - "sms-step-label":"Numer telefonu", - "success":"Sukces!", - "totp-step-description-install":"Możesz zainstalować aplikacje takie jak Google Authenticator, Authy lub Duo.", - "totp-step-description-open":"Otwórz aplikację autentykatora na swoim telefonie komórkowym.", - "totp-step-label":"Pobierz aplikację", - "verification-code":"Kod weryfikacyjny 6-cyfrowy", - "verification-code-invalid":"Nieprawidłowy format kodu weryfikacyjnego", - "verification-code-incorrect":"Kod weryfikacyjny jest niepoprawny", - "verification-code-many-request":"Zbyt wiele żądań sprawdzenia kodu weryfikacyjnego", - "verification-step-description":"Wprowadź 6-cyfrowy kod, który właśnie wysłaliśmy na adres {{address}}", - "verification-step-label":"Weryfikacja" + "security": { + "security": "Bezpieczeństwo", + "general-settings": "Ogólne ustawienia zabezpieczeń", + "access-token": "Access token", + "access-token-required": "Access token is required", + "clientId": "Client ID", + "clientId-required": "Client ID is required", + "username": "Username", + "username-required": "Username is required", + "ca-cert": "CA certificate", + "2fa": { + "2fa": "Uwierzytelnianie dwuskładnikowe", + "2fa-description": "Uwierzytelnianie dwuskładnikowe chroni Twoje konto przed nieautoryzowanym dostępem. Wszystko co musisz zrobić, to wpisać kod bezpieczeństwa przy logowaniu.", + "authenticate-with": "Możesz uwierzytelnić się za pomocą:", + "disable-2fa-provider-text": "Wyłączanie {{name}} sprawi, że Twoje konto będzie mniej bezpieczne", + "disable-2fa-provider-title": "Czy na pewno chcesz wyłączyć {{name}}?", + "get-new-code": "Zdobądź nowy kod", + "main-2fa-method": "Użyj jako głównej metody uwierzytelniania dwuskładnikowego", + "dialog": { + "activation-step-description-email": "Przy następnym logowaniu zostaniesz poproszony o podanie kodu zabezpieczającego, który zostanie wysłany na Twój adres e-mail.", + "activation-step-description-sms": "Przy następnym logowaniu zostaniesz poproszony o podanie kodu zabezpieczającego, który zostanie wysłany na numer telefonu.", + "activation-step-description-totp": "Przy następnym logowaniu konieczne będzie podanie dwuskładnikowego kodu uwierzytelniającego.", + "activation-step-label": "Aktywacja", + "backup-code-description": "Wydrukuj kody, aby mieć je pod ręką, gdy będziesz musiał ich użyć do zalogowania się na swoje konto. ", + "backup-code-warn": "Po opuszczeniu tej strony kody te nie będą mogły zostać wyświetlone ponownie. ", + "download-txt": "Pobierz (txt)", + "email-step-description": "Wpisz adres e-mail, który będzie używany jako moduł uwierzytelniający.", + "email-step-label": "E-mail", + "enable-email-title": "Włącz uwierzytelnianie poczty e-mail", + "enable-sms-title": "Włącz uwierzytelnianie SMS", + "enable-totp-title": "Włącz aplikację uwierzytelniającą", + "enter-verification-code": "Wpisz tutaj 6-cyfrowy kod", + "get-backup-code-title": "Uzyskaj kod zapasowy", + "next": "Dalej", + "scan-qr-code": "Zeskanuj ten kod QR za pomocą aplikacji weryfikacyjnej", + "send-code": "Wyślij kod", + "sms-step-description": "Wprowadź numer telefonu, który będzie używany jako moduł uwierzytelniający.", + "sms-step-label": "Numer telefonu", + "success": "Sukces!", + "totp-step-description-install": "Możesz zainstalować aplikacje takie jak Google Authenticator, Authy lub Duo.", + "totp-step-description-open": "Otwórz aplikację uwierzytelniającą na swoim telefonie komórkowym.", + "totp-step-label": "Ściągnij aplikację", + "verification-code": "6-cyfrowy kod", + "verification-code-invalid": "Nieprawidłowy format kodu weryfikacyjnego", + "verification-code-incorrect": "Kod weryfikacyjny jest nieprawidłowy", + "verification-code-many-request": "Zbyt wiele próśb o sprawdzenie kodu weryfikacyjnego", + "verification-step-description": "Wpisz 6-cyfrowy kod, który właśnie wysłaliśmy na adres {{address}}", + "verification-step-label": "Weryfikacja" }, - "provider":{ - "email":"E-mail", - "email-description":"Użyj kodu zabezpieczeń wysłanego na Twój adres e-mail do uwierzytelniania.", - "email-hint":"Kody uwierzytelniania są wysyłane przez e-mail na adres {{ info }}", - "sms":"SMS", - "sms-description":"Użyj telefonu do uwierzytelniania. Wyślemy Ci kod zabezpieczeń za pomocą wiadomości SMS podczas logowania.", - "sms-hint":"Kody uwierzytelniania są wysyłane jako wiadomości tekstowe na numer telefonu {{ info }}", - "totp":"Aplikacja autentykatora", - "totp-description":"Używaj aplikacji takich jak Google Authenticator, Authy lub Duo na swoim telefonie do uwierzytelniania. Wygeneruje ona kod zabezpieczeń do logowania.", - "totp-hint":"Aplikacja autentykatora jest skonfigurowana dla Twojego konta", - "backup_code":"Kod zapasowy", - "backup-code-description":"Te jednorazowe kody do wydruku pozwalają Ci się zalogować, gdy jesteś z dala od telefonu, na przykład podczas podróży.", - "backup-code-hint":"Obecnie aktywnych jest {{ info }} jednorazowych kodów" + "provider": { + "email": "E-mail", + "email-description": "Do uwierzytelnienia użyj kodu zabezpieczającego wysłanego na Twój adres e-mail.", + "email-hint": "Kody uwierzytelniające wysyłane są e-mailem na adres {{ info }}", + "sms": "SMS-em", + "sms-description": "Użyj telefonu do uwierzytelnienia. Wyślemy ci kod bezpieczeństwa SMS-em przy logowaniu", + "sms-hint": "Kody uwierzytelniające wysyłane są SMS-em na {{ info }}", + "totp": "Aplikacja uwierzytelniająca", + "totp-description": "Do uwierzytelniania użyj aplikacji takich jak Google Authenticator, Authy lub Duo na swoim telefonie. ", + "totp-hint": "Aplikacja Authenticator jest skonfigurowana dla Twojego konta", + "backup_code": "Kod zapasowy", + "backup-code-description": "Te jednorazowe kody do wydrukowania umożliwiają logowanie się, gdy nie masz przy sobie telefonu, na przykład podczas podróży.", + "backup-code-hint": "{{ info }} kody jednorazowe są w tym momencie aktywne" } }, - "password-requirement":{ - "at-least":"Przynajmniej:", - "character":"{ count, plural, =1 {1 znak} other {# znaków} }", - "digit":"{ count, plural, =1 {1 cyfra} other {# cyfr} }", - "incorrect-password-try-again":"Nieprawidłowe hasło. Spróbuj ponownie", - "lowercase-letter":"{ count, plural, =1 {1 mała litera} other {# małe litery} }", - "new-passwords-not-match":"Nowe hasło nie pasuje", - "password-should-not-contain-spaces":"Twoje hasło nie powinno zawierać spacji", - "password-not-meet-requirements":"Hasło nie spełnia wymagań", - "password-requirements":"Wymagania dotyczące hasła", - "password-should-difference":"Nowe hasło powinno różnić się od bieżącego", - "special-character":"{ count, plural, =1 {1 znak specjalny} other {# znaków specjalnych} }", - "uppercase-letter":"{ count, plural, =1 {1 wielka litera} other {# wielkie litery} }", - "at-most":"Maksymalnie:" + "password-requirement": { + "at-least": "Co najmniej:", + "character": "{ count, plural, =1 {1 znak} other {# znaków} }", + "digit": "{ count, plural, =1 {1 cyfra} other {# cyfr} }", + "incorrect-password-try-again": "Niepoprawne hasło. Spróbuj jeszcze raz", + "lowercase-letter": "{ count, plural, =1 {1 mała litera} other {# małych liter} }", + "new-passwords-not-match": "Nowe hasło nie pasuje", + "password-should-not-contain-spaces": "Twoje hasło nie powinno zawierać spacji", + "password-not-meet-requirements": "Hasło nie spełnia wymagań", + "password-requirements": "Wymagania dotyczące hasła", + "password-should-difference": "Nowe hasło powinno różnić się od obecnego", + "special-character": "{ count, plural, =1 {1 znak specjalny} other {# znaków specjalnych} }", + "uppercase-letter": "{ count, plural, =1 {1 duża litera} other {# dużych liter} }" } }, - "relation":{ - "relations":"Relacje", - "direction":"Kierunek", - "clear-relation-type":"Wyczyść typ relacji", - "search-direction":{ - "FROM":"Od", - "TO":"Do" + "relation": { + "relations": "Relacje", + "direction": "Kierunek", + "clear-relation-type": "Clear relation type", + "search-direction": { + "FROM": "Z", + "TO": "Do" }, - "direction-type":{ - "FROM":"from", - "TO":"to" + "direction-type": { + "FROM": "z", + "TO": "do" }, - "from-relations":"Wychodzące relacje", - "to-relations":"Przychodzące relacje", - "selected-relations":"{ count, plural, =1 {1 relacja} other {# relacji} } wybrano", - "type":"Typ", - "to-entity-type":"Typ jednostki docelowej", - "to-entity-name":"Nazwa jednostki docelowej", - "from-entity-type":"Typ jednostki źródłowej", - "from-entity-name":"Nazwa jednostki źródłowej", - "to-entity":"Jednostka docelowa", - "from-entity":"Jednostka źródłowa", - "delete":"Usuń relację", - "relation-type":"Typ relacji", - "relation-type-required":"Wymagany jest typ relacji.", - "relation-type-max-length":"Typ relacji powinien mieć mniej niż 256 znaków", - "any-relation-type":"Dowolny typ", - "add":"Dodaj relację", - "edit":"Edytuj relację", - "delete-to-relation-title":"Czy na pewno chcesz usunąć relację do jednostki '{{entityName}}'?", - "delete-to-relation-text":"Bądź ostrożny, po potwierdzeniu jednostka '{{entityName}}' zostanie odłączona od bieżącej jednostki.", - "delete-to-relations-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 relacja} other {# relacje} }?", - "delete-to-relations-text":"Bądź ostrożny, po potwierdzeniu wszystkie wybrane relacje zostaną usunięte, a odpowiednie jednostki zostaną odłączone od bieżącej jednostki.", - "delete-from-relation-title":"Czy na pewno chcesz usunąć relację z jednostki '{{entityName}}'?", - "delete-from-relation-text":"Bądź ostrożny, po potwierdzeniu bieżąca jednostka zostanie odłączona od jednostki '{{entityName}}'.", - "delete-from-relations-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 relacja} other {# relacje} }?", - "delete-from-relations-text":"Bądź ostrożny, po potwierdzeniu wszystkie wybrane relacje zostaną usunięte, a bieżąca jednostka zostanie odłączona od odpowiednich jednostek.", - "remove-relation-filter":"Usuń filtr relacji", - "remove-filter":"Usuń filtr", - "add-relation-filter":"Dodaj filtr relacji", - "any-relation":"Dowolna relacja", - "relation-filters":"Filtry relacji", - "additional-info":"Dodatkowe informacje (JSON)", - "invalid-additional-info":"Nie można sparsować dodatkowych informacji json.", - "no-relations-text":"Nie znaleziono relacji" + "from-relations": "Relacje wychodzące", + "to-relations": "Relacje przychodzące", + "selected-relations": "Wybrano { count, plural, =1 {1 relację} other {# relacji} }", + "type": "Typ", + "to-entity-type": "Do typu obiektu", + "to-entity-name": "Do nazwy obiektu", + "from-entity-type": "Z typu obiektu", + "from-entity-name": "Od nazwy obiektu", + "to-entity": "Do obiektu", + "from-entity": "Od obiektu", + "delete": "Usuń relację", + "relation-type": "Typ relacji", + "relation-type-required": "Typ relacji jest wymagany.", + "relation-type-max-length": "Typ relacji powinien być mniejszy niż 256", + "any-relation-type": "Dowolny typ", + "add": "Dodaj relację", + "edit": "Edytuj relację", + "view": "Zobacz relację", + "delete-to-relation-title": "Czy na pewno chcesz usunąć relację z obiektem '{{entityName}}'?", + "delete-to-relation-text": "Uważaj, po potwierdzeniu obiekt '{{entityName}}' nie będzie powiązany z obecnym obiektem.", + "delete-to-relations-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 relację} other {# relacji} }?", + "delete-to-relations-text": "Uważaj, po potwierdzeniu wszystkie wybrane relacje zostaną usunięte, a odpowiadające im obiekty nie będą powiązane z bieżącym obiektem.", + "delete-from-relation-title": "Czy na pewno chcesz usunąć relację z obiektu '{{entityName}}'?", + "delete-from-relation-text": "Uważaj, po potwierdzeniu bieżący obiekt nie będzie powiązany z obiektem '{{entityName}}'.", + "delete-from-relations-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 relację} other {# relacji} }?", + "delete-from-relations-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane relacje zostaną usunięte, a bieżący obiekt nie będzie powiązana z odpowiednimi obiektami.", + "remove-relation-filter": "Usuń filtr relacji", + "remove-filter": "Remove filter", + "add-relation-filter": "Dodaj filtr relacji", + "any-relation": "Dowolny związek", + "relation-filters": "Filtry relacji", + "additional-info": "Dodatkowe informacje (JSON)", + "invalid-additional-info": "Nie można przeanalizować dodatkowych informacji json.", + "no-relations-text": "Nie znaleziono żadnych relacji" }, - "resource":{ - "add":"Dodaj zasób", - "all-types":"Wszystkie", - "copyId":"Skopiuj identyfikator zasobu", - "delete":"Usuń zasób", - "delete-resource-text":"Bądź ostrożny, po potwierdzeniu zasób zostanie bezpowrotnie usunięty.", - "delete-resource-title":"Czy na pewno chcesz usunąć zasób '{{resourceTitle}}'?", - "delete-resources-action-title":"Usuń { count, plural, =1 {1 zasób} other {# zasobów} }", - "delete-resources-text":"Proszę zauważyć, że wybrane zasoby, nawet jeśli są używane w profilach urządzeń, zostaną usunięte.", - "delete-resources-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 zasób} other {# zasobów} }?", - "download":"Pobierz zasób", - "drop-file":"Upuść plik zasobu lub kliknij, aby wybrać plik do przesłania.", - "drop-resource-file-or":"Przeciągnij i upuść plik zasobu lub", - "empty":"Zasób jest pusty", - "file-name":"Nazwa pliku", - "idCopiedMessage":"Identyfikator zasobu został skopiowany do schowka", - "no-resource-matching":"Nie znaleziono zasobów pasujących do '{{widgetsBundle}}'.", - "no-resource-text":"Nie znaleziono zasobów", - "open-widgets-bundle":"Otwórz paczkę widżetów", - "resource":"Zasób", - "resource-file":"Plik zasobu", - "resource-files":"Pliki zasobów", - "resource-library-details":"Szczegóły zasobu", - "resource-type":"Typ zasobu", - "resources-library":"Biblioteka zasobów", - "search":"Szukaj zasobów", - "selected-resources":"{ count, plural, =1 {1 zasób} other {# zasobów} } wybrano", - "system":"System", - "title":"Tytuł", - "title-required":"Tytuł jest wymagany.", - "title-max-length":"Tytuł powinien mieć mniej niż 256 znaków", - "type":{ - "jks":"JKS", - "js-module":"Moduł JS", - "lwm2m-model":"Model LWM2M", - "pkcs-12":"PKCS #12" + "resource": { + "add": "Dodaj bibliotekę", + "all-types": "All", + "copyId": "Skopiuj identyfikator biblioteki", + "delete": "Usuń bibliotekę", + "delete-resource-text": "Bądź ostrożny, po potwierdzeniu biblioteka stanie się niemożliwa do odzyskania.", + "delete-resource-title": "Czy na pewno chcesz usunąć bibliotekę '{{resourceTitle}}'?", + "delete-resources-action-title": "Usuń { count, plural, =1 {1 bibliotekę} other {# bibliotek} }", + "delete-resources-text": "Pamiętaj, że wybrane biblioteki, nawet jeśli są używane w profilach urządzeń, zostaną usunięte.", + "delete-resources-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 bibliotekę} other {# bibliotek} }?", + "download": "Pobierz bibliotekę", + "drop-file": "Upuść plik bibliotek lub kliknij, aby wybrać plik do przesłania.", + "drop-resource-file-or": "Przeciągnij i upuść plik bibliotek lub", + "empty": "Biblioteka jest pusta", + "file-name": "Nazwa pliku", + "idCopiedMessage": "Identyfikator biblioteki został skopiowany do schowka", + "no-resource-matching": "Nie znaleziono bibliotek pasujących do '{{widgetsBundle}}'.", + "no-resource-text": "Nie znaleziono bibliotek", + "open-widgets-bundle": "Otwórz pakiet widżetów", + "resource": "Biblioteka", + "resource-library-details": "Szczegóły bibliotek", + "resource-type": "Typ biblioteki", + "resources-library": "Biblioteka bibliotek", + "search": "Przeszukaj biblioteki", + "selected-resources": "Wybrano { count, plural, =1 {1 bibliotekę} other {# bibliotek} }", + "system": "System", + "title": "Tytuł", + "title-required": "Tytuł jest wymagany.", + "title-max-length": "Tytuł powinien być mniejszy niż 256", + "type": { + "jks": "JKS", + "js-module": "JS module", + "lwm2m-model": "LWM2M model", + "pkcs-12": "PKCS #12" } }, - "rulechain":{ - "rulechain":"Łańcuch reguł", - "rulechain-events":"Zdarzenia łańcucha reguł", - "rulechains":"Łańcuchy reguł", - "root":"Korzeń", - "delete":"Usuń łańcuch reguł", - "name":"Nazwa", - "name-required":"Nazwa jest wymagana.", - "name-max-length":"Nazwa powinna mieć mniej niż 256 znaków", - "description":"Opis", - "add":"Dodaj łańcuch reguł", - "set-root":"Ustaw łańcuch reguł jako korzeń", - "set-root-rulechain-title":"Jesteś pewien, że chcesz ustawić łańcuch reguł '{{ruleChainName}}' jako korzeń?", - "set-root-rulechain-text":"Po potwierdzeniu łańcuch reguł stanie się korzeniem i będzie obsługiwał wszystkie przychodzące wiadomości transportowe.", - "delete-rulechain-title":"Jesteś pewien, że chcesz usunąć łańcuch reguł '{{ruleChainName}}'?", - "delete-rulechain-text":"Bądź ostrożny, po potwierdzeniu łańcuch reguł i wszystkie powiązane dane staną się nieodwracalne.", - "delete-rulechains-title":"Jesteś pewien, że chcesz usunąć { count, plural, =1 {1 łańcuch reguł} other {# łańcuchów reguł} }?", - "delete-rulechains-action-title":"Usuń { count, plural, =1 {1 łańcuch reguł} other {# łańcuchów reguł} }", - "delete-rulechains-text":"Bądź ostrożny, po potwierdzeniu wszystkie wybrane łańcuchy reguł zostaną usunięte, a wszystkie powiązane dane staną się nieodwracalne.", - "add-rulechain-text":"Dodaj nowy łańcuch reguł", - "no-rulechains-text":"Nie znaleziono łańcuchów reguł", - "rulechain-details":"Szczegóły łańcucha reguł", - "details":"Szczegóły", - "events":"Zdarzenia", - "system":"System", - "import":"Importuj łańcuch reguł", - "export":"Eksportuj łańcuch reguł", - "export-failed-error":"Nie można wyeksportować łańcucha reguł: {{error}}", - "create-new-rulechain":"Utwórz nowy łańcuch reguł", - "rulechain-file":"Plik łańcucha reguł", - "invalid-rulechain-file-error":"Nie można zaimportować łańcucha reguł: Nieprawidłowa struktura danych łańcucha reguł.", - "copyId":"Skopiuj identyfikator łańcucha reguł", - "idCopiedMessage":"Identyfikator łańcucha reguł został skopiowany do schowka", - "select-rulechain":"Wybierz łańcuch reguł", - "no-rulechains-matching":"Nie znaleziono łańcuchów reguł pasujących do '{{entity}}'.", - "rulechain-required":"Łańcuch reguł jest wymagany", - "management":"Zarządzanie regułami", - "debug-mode":"Tryb debugowania", - "search":"Wyszukaj łańcuchy reguł", - "selected-rulechains":"{ count, plural, =1 {1 łańcuch reguł} other {# łańcuchów reguł} } wybranych", - "open-rulechain":"Otwórz łańcuch reguł", - "edge-template-root":"Korzeń szablonu", - "assign-to-edge":"Przypisz do krawędzi", - "edge-rulechain":"Łańcuch reguł krawędzi", - "unassign-rulechain-from-edge-text":"Po potwierdzeniu łańcuch reguł zostanie odłączony i nie będzie dostępny dla krawędzi.", - "unassign-rulechains-from-edge-title":"Jesteś pewien, że chcesz odłączyć { count, plural, =1 {1 łańcuch reguł} other {# łańcuchów reguł} }?", - "unassign-rulechains-from-edge-text":"Po potwierdzeniu wszystkie wybrane łańcuchy reguł zostaną odłączone i nie będą dostępne dla krawędzi.", - "assign-rulechain-to-edge-title":"Przypisz łańcuch(y) reguł do krawędzi", - "assign-rulechain-to-edge-text":"Wybierz łańcuchy reguł do przypisania do krawędzi", - "set-edge-template-root-rulechain":"Ustaw łańcuch reguł jako korzeń szablonu krawędzi", - "set-edge-template-root-rulechain-title":"Jesteś pewien, że chcesz ustawić łańcuch reguł '{{ruleChainName}}' jako korzeń szablonu krawędzi?", - "set-edge-template-root-rulechain-text":"Po potwierdzeniu łańcuch reguł stanie się korzeniem szablonu krawędzi i będzie korzeniem łańcucha reguł dla nowo tworzonych krawędzi.", - "invalid-rulechain-type-error":"Nie można zaimportować łańcucha reguł: Nieprawidłowy typ łańcucha reguł. Oczekiwany typ to {{expectedRuleChainType}}.", - "set-auto-assign-to-edge":"Przypisz łańcuch reguł do krawędzi podczas tworzenia", - "set-auto-assign-to-edge-title":"Jesteś pewien, że chcesz przypisać łańcuch reguł krawędzi '{{ruleChainName}}' do krawędzi podczas tworzenia?", - "set-auto-assign-to-edge-text":"Po potwierdzeniu łańcuch reguł krawędzi zostanie automatycznie przypisany do krawędzi podczas tworzenia.", - "unset-auto-assign-to-edge":"Nie przypisuj łańcucha reguł do krawędzi podczas tworzenia", - "unset-auto-assign-to-edge-title":"Jesteś pewien, że nie chcesz przypisywać łańcucha reguł krawędzi '{{ruleChainName}}' do krawędzi podczas tworzenia?", - "unset-auto-assign-to-edge-text":"Po potwierdzeniu łańcuch reguł krawędzi nie będzie automatycznie przypisywany do krawędzi podczas tworzenia.", - "unassign-rulechain-title":"Jesteś pewien, że chcesz odłączyć łańcuch reguł '{{ruleChainName}}'?", - "unassign-rulechains":"Odłącz łańcuchy reguł" + "rulechain": { + "rulechain": "Łańcuch reguł", + "rulechain-events": "Zdarzenia łańcucha reguł", + "rulechains": "Łańcuchy reguł", + "root": "Źródło", + "delete": "Usuń łańcuch reguł", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana.", + "name-max-length": "Nazwa powinna być mniejsza niż 256", + "description": "Opis", + "add": "Dodaj łańcuch reguł", + "set-root": "Utwórz katalog główny łańcucha reguł", + "set-root-rulechain-title": "Czy na pewno chcesz utworzyć łańcuch reguł '{{ruleChainName}}' źródło?", + "set-root-rulechain-text": "Po potwierdzeniu łańcuch reguł stanie się rootem i będzie obsługiwał wszystkie przychodzące komunikaty transportowe.", + "delete-rulechain-title": "Czy na pewno chcesz usunąć łańcuch reguł '{{ruleChainName}}'?", + "delete-rulechain-text": "Bądź ostrożny, po potwierdzeniu łańcucha reguł i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-rulechains-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 łańcuch reguł} other {# łańcuchów reguł} }?", + "delete-rulechains-action-title": "Usuń { count, plural, =1 {1 łańcuch reguł} other {# łańcuchów reguł} }", + "delete-rulechains-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane łańcuchy reguł zostaną usunięte, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "add-rulechain-text": "Dodaj nowy łańcuch reguł", + "no-rulechains-text": "Nie znaleziono łańcuchów reguł", + "rulechain-details": "Szczegóły łańcucha reguł", + "details": "Szczegóły", + "events": "Wydarzenia", + "system": "System", + "import": "Importuj łańcuch reguł", + "export": "Eksportuj łańcuch reguł", + "export-failed-error": "Nie można wyeksportować łańcucha reguł: {{error}}", + "create-new-rulechain": "Utwórz nowy łańcuch reguł", + "rulechain-file": "Plik łańcucha reguł", + "invalid-rulechain-file-error": "Nie można zaimportować łańcucha reguł: Nieprawidłowa struktura danych łańcucha reguł.", + "copyId": "Skopiuj identyfikator łańcucha reguł", + "idCopiedMessage": "Identyfikator łańcucha reguł został skopiowany do schowka", + "select-rulechain": "Wybierz łańcuch reguł", + "no-rulechains-matching": "Nie znaleziono łańcuchów regół pasujących do '{{entity}}'.", + "rulechain-required": "Łańcuch reguł jest wymagany", + "management": "Zarządzanie regułami", + "debug-mode": "Tryb debugowania", + "search": "Przeszukaj łańcuchy reguł", + "selected-rulechains": "Wybrano { count, plural, =1 {1 łańcuch reguł} other {# łańcuchów reguł} }", + "open-rulechain": "Otwórz łańcuch reguł", + "edge-template-root": "Katalog główny szablonu", + "assign-to-edge": "Przypisz do Edge", + "edge-rulechain": "Łańcuch reguł Edge", + "unassign-rulechain-from-edge-text": "Po potwierdzeniu łańcuch reguł zostanie usunięty i nie będzie dostępny na urządzeniu Edge.", + "unassign-rulechains-from-edge-title": "Czy na pewno chcesz anulować przypisanie { count, plural, =1 {1 łańcucha reguł} other {# łańcuchów reguł} }?", + "unassign-rulechains-from-edge-text": "Po potwierdzeniu wszystkie wybrane łańcuchy reguł zostaną anulowane i nie będą dostępne na urządzeniu Edge.", + "assign-rulechain-to-edge-title": "Przypisz łańcuch(y) reguł do Edge", + "assign-rulechain-to-edge-text": "Wybierz łańcuchy reguł, które chcesz przypisać do Edge", + "set-edge-template-root-rulechain": "Utwórz łańcuch reguł jako główny szablon Edge", + "set-edge-tscheduler-eventemplate-root-rulechain": "Utwórz łańcuch reguł jako główny szablon Edge", + "set-edge-template-root-rulechain-title": "Czy na pewno chcesz utworzyć łańcuch reguł '{{ruleChainName}}' Katalog główny szablonu Edge?", + "set-edge-template-root-rulechain-text": "Po potwierdzeniu łańcuch reguł stanie się głównym szablonem Edge i będzie głównym łańcuchem reguł dla nowo utworzonych Edge.", + "invalid-rulechain-type-error": "Nie można zaimportować łańcucha reguł: nieprawidłowy typ łańcucha reguł. {{expectedRuleChainType}}.", + "set-auto-assign-to-edge": "Przypisz łańcuch reguł do Edge podczas tworzenia", + "set-auto-assign-to-edge-title": "Czy na pewno chcesz przypisać łańcuch reguł Edge '{{ruleChainName}}' do Edge podczas tworzenia?", + "set-auto-assign-to-edge-text": "Po potwierdzeniu łańcuch reguł Edge zostanie automatycznie przypisany do Edge podczas tworzenia.", + "unset-auto-assign-to-edge": "Nie przypisuj łańcucha reguł do Edge podczas tworzenia", + "unset-auto-assign-to-edge-title": "Czy na pewno nie chcesz przypisać łańcucha reguł Edge '{{ruleChainName}}' do Edge podczas tworzenia?", + "unset-auto-assign-to-edge-text": "Po potwierdzeniu łańcuch reguł Edge nie będzie już automatycznie przypisywany do Edge podczas tworzenia.", + "unassign-rulechain-title": "Czy na pewno chcesz usunąć przypisanie łańcucha reguł '{{ruleChainName}}'?", + "unassign-rulechains": "Usuń przypisanie łańcuchów reguł" }, - "rulenode":{ - "rule-node-events":"Zdarzenia węzła reguły", - "details":"Szczegóły", - "events":"Zdarzenia", - "search":"Wyszukaj węzły", - "open-node-library":"Otwórz bibliotekę węzłów", - "close-node-library":"Zamknij bibliotekę węzłów", - "add":"Dodaj węzeł reguły", - "name":"Nazwa", - "name-required":"Nazwa jest wymagana.", - "name-max-length":"Nazwa powinna mieć mniej niż 256 znaków", - "type":"Typ", - "rule-node-description":"Opis węzła reguły", - "delete":"Usuń węzeł reguły", - "select-all-objects":"Zaznacz wszystkie węzły i połączenia", - "deselect-all-objects":"Odznacz wszystkie węzły i połączenia", - "delete-selected-objects":"Usuń wybrane węzły i połączenia", - "delete-selected":"Usuń zaznaczone", - "create-nested-rulechain":"Utwórz zagnieżdżony łańcuch reguł", - "select-all":"Zaznacz wszystkie", - "copy-selected":"Skopiuj zaznaczone", - "deselect-all":"Odznacz wszystkie", - "rulenode-details":"Szczegóły węzła reguły", - "debug-mode":"Tryb debugowania", - "singleton-mode":"Tryb pojedynczej instancji", - "configuration":"Konfiguracja", - "link":"Połączenie", - "link-details":"Szczegóły połączenia węzła reguły", - "add-link":"Dodaj połączenie", - "link-label":"Etykieta połączenia", - "link-label-required":"Etykieta połączenia jest wymagana.", - "custom-link-label":"Niestandardowa etykieta połączenia", - "custom-link-label-required":"Niestandardowa etykieta połączenia jest wymagana.", - "link-labels":"Etykiety połączeń", - "link-labels-required":"Wymagane są etykiety połączeń.", - "no-link-labels-found":"Nie znaleziono etykiet połączeń", - "no-link-label-matching":"'{{label}}' nie zostało znalezione.", - "create-new-link-label":"Utwórz nową!", - "type-filter":"Filtr", - "type-filter-details":"Filtruj przychodzące wiadomości z określonymi warunkami", - "type-enrichment":"Wzbogacenie", - "type-enrichment-details":"Dodaj dodatkowe informacje do metadanych wiadomości", - "type-transformation":"Transformacja", - "type-transformation-details":"Zmień ładunek wiadomości i metadane", - "type-action":"Akcja", - "type-action-details":"Wykonaj specjalną akcję", - "type-external":"Zewnętrzne", - "type-external-details":"Komunikuje się z zewnętrznym systemem", - "type-rule-chain":"Łańcuch reguł", - "type-rule-chain-details":"Przekazuje przychodzące wiadomości do określonego łańcucha reguł", - "type-flow":"Przepływ", - "type-flow-details":"Organizuje przepływ wiadomości", - "type-input":"Wejście", - "type-input-details":"Logiczne wejście łańcucha reguł, przekazuje przychodzące wiadomości do następnego powiązanego węzła reguły", - "type-unknown":"Nieznany", - "type-unknown-details":"Nierozwiązany węzeł reguły", - "directive-is-not-loaded":"Zdefiniowana dyrektywa konfiguracji '{{directiveName}}' nie jest dostępna.", - "ui-resources-load-error":"Nie udało się załadować zasobów interfejsu użytkownika konfiguracji.", - "invalid-target-rulechain":"Nie można rozpoznać docelowego łańcucha reguł!", - "test-script-function":"Funkcja skryptu testowego", - "script-lang-java-script":"JavaScript", - "script-lang-tbel":"TBEL", - "message":"Wiadomość", - "message-type":"Typ wiadomości", - "select-message-type":"Wybierz typ wiadomości", - "message-type-required":"Wymagany jest typ wiadomości", - "metadata":"Metadane", - "metadata-required":"Wpisy metadanych nie mogą być puste.", - "output":"Wynik", - "test":"Test", - "help":"Pomoc", - "reset-debug-mode":"Zresetuj tryb debugowania we wszystkich węzłach", - "test-with-this-message":"{{test}} z tą wiadomością", - "queue-hint":"Wybierz kolejkę do przekazywania wiadomości do innej kolejki. Domyślnie używana jest kolejka „Main”.", - "queue-singleton-hint":"Wybierz kolejkę do przekazywania wiadomości w środowiskach wielu instancji. Domyślnie używana jest kolejka „Main”." + "rulenode": { + "rule-node-events": "Zdarzenia węzła reguły", + "details": "Szczegóły", + "events": "Wydarzenia", + "search": "Wyszukaj węzły", + "open-node-library": "Otwórz bibliotekę węzłów", + "close-node-library": "Close node library", + "add": "Dodaj węzeł reguły", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana.", + "name-max-length": "Nazwa powinna być mniejsza niż 256", + "type": "Typ", + "rule-node-description": "Rule node description", + "delete": "Usuń węzeł reguły", + "select-all-objects": "Wybierz wszystkie węzły i połączenia", + "deselect-all-objects": "Odznacz wszystkie węzły i połączenia", + "delete-selected-objects": "Usuń wybrane węzły i połączenia", + "delete-selected": "Usuń wybrane", + "create-nested-rulechain": "Utwórz zagnieżdżony łańcuch reguł", + "select-all": "Zaznacz wszystko", + "copy-selected": "Skopiuj wybrane", + "deselect-all": "Odznacz wszystkie", + "rulenode-details": "Szczegóły węzła reguły", + "debug-mode": "Tryb debugowania", + "singleton-mode": "Tryb singletonowy", + "configuration": "Konfiguracja", + "link": "Połączenie", + "link-details": "Szczegóły połączenia węzła reguły", + "add-link": "Dodaj połączenie", + "link-label": "Etykieta połączenia", + "link-label-required": "Etykieta połączenia jest wymagana.", + "custom-link-label": "Niestandardowa etykieta połączenia", + "custom-link-label-required": "Niestandardowa etykieta połączenia jest wymagana.", + "link-labels": "Etykiety połaczeń", + "link-labels-required": "Etykiety połączeń są wymagane.", + "no-link-labels-found": "Nie znaleziono etykiet połączeń", + "no-link-label-matching": "Nie znaleziono '{{label}}'.", + "create-new-link-label": "Utwórz nowy!", + "type-filter": "Filtr", + "type-filter-details": "Filtruj wiadomości przychodzące według skonfigurowanych warunków", + "type-enrichment": "Wzbogacenie", + "type-enrichment-details": "Dodaj dodatkowe informacje do metadanych wiadomości", + "type-transformation": "Transformacja", + "type-transformation-details": "Zmień ładunek wiadomości i metadane", + "type-action": "Akcja", + "type-action-details": "Wykonaj akcję specjalną", + "type-analytics": "Analityka", + "type-analytics-details": "Wykonuj analizę danych przesyłanych strumieniowo lub utrwalonych", + "type-external": "Zewnętrzny", + "type-external-details": "Współpracuje z systemem zewnętrznym", + "type-rule-chain": "Łańcuch reguł", + "type-rule-chain-details": "Przekazuje przychodzące wiadomości do określonego łańcucha reguł", + "type-flow": "Przepływ", + "type-flow-details": "Organizuje przepływ wiadomości", + "type-input": "Wejście", + "type-input-details": "Logiczne wejście łańcucha reguł przekazuje przychodzące wiadomości do następnego powiązanego węzła reguł", + "type-unknown": "Nieznany", + "type-unknown-details": "Nierozwiązany węzeł reguły", + "directive-is-not-loaded": "Zdefiniowana dyrektywa konfiguracyjna '{{directiveName}}' jest niedostępne.", + "ui-resources-load-error": "Nie udało się załadować bibliotek interfejsu konfiguracyjnego.", + "invalid-target-rulechain": "Nie można rozwiązać docelowego łańcucha reguł!", + "test-script-function": "Funkcja skryptu testowego", + "script-lang-java-script": "Java Script", + "script-lang-tbel": "TBEL", + "message": "Wiadomość", + "message-type": "Typ wiadomości", + "select-message-type": "Wybierz typ wiadomości", + "message-type-required": "Typ wiadomości jest wymagany", + "metadata": "Metadane", + "metadata-required": "Wpisy metadanych nie mogą być puste.", + "output": "Wyjście", + "test": "Test", + "help": "Pomoc", + "reset-debug-mode": "Zresetuj tryb debugowania we wszystkich węzłach", + "test-with-this-message": "{{test}} with this message", + "description": "Opis" }, - "timezone":{ - "timezone":"Strefa czasowa", - "select-timezone":"Wybierz strefę czasową", - "no-timezones-matching":"Nie znaleziono stref czasowych pasujących do '{{timezone}}'.", - "timezone-required":"Strefa czasowa jest wymagana.", - "browser-time":"Czas przeglądarki" - }, - "queue":{ - "queue-name":"Kolejka", - "no-queues-found":"Nie znaleziono kolejek.", - "no-queues-matching":"Nie znaleziono kolejek pasujących do '{{queue}}'.", - "select-name":"Wybierz nazwę kolejki", - "name":"Nazwa", - "name-required":"Nazwa kolejki jest wymagana!", - "name-unique":"Nazwa kolejki nie jest unikalna!", - "name-pattern":"Nazwa kolejki zawiera znak inny niż alfanumeryczny ASCII, '.', '_', i '-'!", - "queue-required":"Kolejka jest wymagana!", - "topic-required":"Temat kolejki jest wymagany!", - "poll-interval-required":"Interwał odpytywania jest wymagany!", - "poll-interval-min-value":"Wartość interwału odpytywania nie może być mniejsza niż 1", - "partitions-required":"Partycje są wymagane!", - "partitions-min-value":"Wartość partycji nie może być mniejsza niż 1", - "pack-processing-timeout-required":"Limit czasu przetwarzania jest wymagany", - "pack-processing-timeout-min-value":"Wartość limitu czasu przetwarzania nie może być mniejsza niż 1", - "batch-size-required":"Rozmiar partii jest wymagany!", - "batch-size-min-value":"Wartość rozmiaru partii nie może być mniejsza niż 1", - "retries-required":"Liczba prób jest wymagana!", - "retries-min-value":"Wartość liczby prób nie może być ujemna", - "failure-percentage-required":"Procent awaryjnych wiadomości jest wymagany!", - "failure-percentage-min-value":"Wartość procenta awaryjnych wiadomości nie może być mniejsza niż 0", - "failure-percentage-max-value":"Wartość procenta awaryjnych wiadomości nie może być większa niż 100", - "pause-between-retries-required":"Odstęp między próbami jest wymagany!", - "pause-between-retries-min-value":"Wartość odstępu między próbami nie może być mniejsza niż 1", - "max-pause-between-retries-required":"Maksymalny odstęp między próbami jest wymagany!", - "max-pause-between-retries-min-value":"Wartość maksymalnego odstępu między próbami nie może być mniejsza niż 1", - "submit-strategy-type-required":"Typ strategii przesyłania jest wymagany!", - "processing-strategy-type-required":"Typ strategii przetwarzania jest wymagany!", - "queues":"Kolejki", - "selected-queues":"{ count, plural, =1 {1 kolejka} other {# kolejek} } wybranych", - "delete-queue-title":"Czy na pewno chcesz usunąć kolejkę '{{queueName}}'?", - "delete-queues-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 kolejkę} other {# kolejki} }?", - "delete-queue-text":"Bądź ostrożny, po potwierdzeniu kolejka i wszystkie związane z nią dane zostaną bezpowrotnie usunięte.", - "delete-queues-text":"Po potwierdzeniu wszystkie wybrane kolejki zostaną usunięte i nie będą dostępne.", - "search":"Wyszukaj kolejkę", - "add":"Dodaj kolejkę", - "details":"Szczegóły kolejki", - "topic":"Temat", - "submit-settings":"Ustawienia przesyłania", - "submit-strategy":"Typ strategii *", - "grouping-parameter":"Parametr grupowania", - "processing-settings":"Ustawienia przetwarzania", - "processing-strategy":"Typ przetwarzania *", - "retries-settings":"Ustawienia prób", - "polling-settings":"Ustawienia odpytywania", - "batch-processing":"Przetwarzanie partiami", - "poll-interval":"Interwał odpytywania", - "partitions":"Partycje", - "immediate-processing":"Natychmiastowe przetwarzanie", - "consumer-per-partition":"Wysyłaj odpytywanie dla każdego konsumenta", - "consumer-per-partition-hint":"Włącz oddzielnych konsumentów dla każdej partycji", - "processing-timeout":"Przetwarzaj w ciągu, ms", - "batch-size":"Rozmiar partii", - "retries":"Liczba prób (0 - nieograniczona)", - "failure-percentage":"Procent awaryjnych wiadomości do pominięcia prób", - "pause-between-retries":"Odstęp między próbami, s", - "max-pause-between-retries":"Maksymalny odstęp między próbami, s", - "delete":"Usuń kolejkę", - "copyId":"Skopiuj Id kolejki", - "idCopiedMessage":"Id kolejki zostało skopiowane do schowka", - "description":"Opis", - "description-hint":"Ten tekst będzie wyświetlany w opisie kolejki zamiast wybranej strategii", - "alt-description":"Strategia przesyłania: {{submitStrategy}}, Strategia przetwarzania: {{processingStrategy}}", - "custom-properties":"Własne właściwości", - "custom-properties-hint":"Własne właściwości tworzenia kolejki (tematu), np. 'retention.ms:604800000;retention.bytes:1048576000'", - "strategies":{ - "sequential-by-originator-label":"Sekwencyjne według nadawcy", - "sequential-by-originator-hint":"Nowa wiadomość, na przykład dla urządzenia A, nie jest przesyłana, dopóki poprzednia wiadomość dla urządzenia A nie zostanie potwierdzona", - "sequential-by-tenant-label":"Sekwencyjne według najemcy", - "sequential-by-tenant-hint":"Nowa wiadomość, na przykład dla najemcy A, nie jest przesyłana, dopóki poprzednia wiadomość dla najemcy A nie zostanie potwierdzona", - "sequential-label":"Sekwencyjne", - "sequential-hint":"Nowa wiadomość nie jest przesyłana, dopóki poprzednia wiadomość nie zostanie potwierdzona", - "burst-label":"Burst", - "burst-hint":"Wszystkie wiadomości są przesyłane do łańcuchów reguł w kolejności ich przyjścia", - "batch-label":"Partia", - "batch-hint":"Nowa partia nie jest przesyłana, dopóki poprzednia partia nie zostanie potwierdzona", - "skip-all-failures-label":"Pomiń wszystkie awarie", - "skip-all-failures-hint":"Ignoruj wszystkie awarie", - "skip-all-failures-and-timeouts-label":"Pomiń wszystkie awarie i przerwy czasowe", - "skip-all-failures-and-timeouts-hint":"Ignoruj wszystkie awarie i przerwy czasowe", - "retry-all-label":"Ponów wszystkie", - "retry-all-hint":"Ponów wszystkie wiadomości z pakietu przetwarzania", - "retry-failed-label":"Ponów nieudane", - "retry-failed-hint":"Ponów wszystkie nieudane wiadomości z pakietu przetwarzania", - "retry-timeout-label":"Ponów przerwę czasową", - "retry-timeout-hint":"Ponów wszystkie wiadomości przekroczone czasem z pakietu przetwarzania", - "retry-failed-and-timeout-label":"Ponów nieudane i przerwę czasową", - "retry-failed-and-timeout-hint":"Ponów wszystkie nieudane i przekroczone czasem wiadomości z pakietu przetwarzania" + "role": { + "role": "Rola", + "roles": "Role", + "management": "Zarządzanie rolami", + "view-roles": "Wyświetl role", + "no-roles-matching": "Nie znaleziono ról pasujących do '{{entity}}'.", + "role-list": "Lista ról", + "role-list-required": "Lista ról jest wymagana", + "add": "Dodaj rolę", + "view": "Wyświetl rolę", + "search": "Szukaj ról", + "selected-roles": "Wybrano { count, plural, =1 {1 rolę} other {# ról} }", + "no-roles-text": "Nie znaleziono ról", + "role-details": "Szczegóły roli", + "add-role-text": "Dodaj nową rolę", + "delete": "Usuń rolę", + "delete-roles": "Usuń role", + "delete-role-title": "Czy na pewno chcesz usunąć rolę '{{roleName}}'?", + "delete-role-text": "Bądź ostrożny, po potwierdzeniu roli i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-roles-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 rolę} other {# ról} }?", + "delete-roles-action-title": "Usuń { count, plural, =1 {1 rolę} other {# ról} }", + "delete-roles-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane role zostaną usunięte, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "role-type": "Typ roli", + "role-type-required": "Typ roli jest wymagany.", + "select-role-type": "Wybierz typ roli", + "enter-role-type": "Wpisz typ roli", + "any-role": "Dowolna rola", + "no-role-types-matching": "Nie znaleziono typów ról pasujących do '{{entitySubtype}}'.", + "role-type-list-empty": "Nie wybrano typów ról.", + "role-types": "Typy ról", + "created-time": "Stworzony czas", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana.", + "name-max-length": "Nazwa powinna być mniejsza niż 256", + "description": "Opis", + "events": "Wydarzenia", + "details": "Szczegóły", + "copyId": "Skopiuj identyfikator roli", + "idCopiedMessage": "Identyfikator roli został skopiowany do schowka", + "permissions": "Uprawnienia", + "role-required": "Wymagana rola", + "roles-required": "Wymagane role", + "display-type": { + "GENERIC": "Ogólny", + "GROUP": "Grupa" } }, - "server-error":{ - "general":"Ogólny błąd serwera", - "authentication":"Błąd uwierzytelniania", - "jwt-token-expired":"Token JWT wygasł", - "tenant-trial-expired":"Próba najemcy wygasła", - "credentials-expired":"Wygasły poświadczenia", - "permission-denied":"Brak uprawnień", - "invalid-arguments":"Nieprawidłowe argumenty", - "bad-request-params":"Nieprawidłowe parametry żądania", - "item-not-found":"Nie znaleziono elementu", - "too-many-requests":"Zbyt wiele żądań", - "too-many-updates":"Zbyt wiele aktualizacji" + "group-permission": { + "user-group-roles": "Role grupy użytkowników", + "entity-group-permissions": "Uprawnienia grupy obiektów", + "role-type": "Typ roli", + "role-name": "Nazwa roli", + "group-type": "Typ grupy", + "group-name": "Nazwa grupy", + "group-owner": "Właściciel grupy", + "user-group-name": "Nazwa grupy użytkowników", + "user-group-owner": "Właściciel grupy użytkowników", + "edit": "Edytuj uprawnienia", + "delete": "Usuń uprawnienia", + "selected-group-permissions": "Wybrano { count, plural, =1 {1 grupowe uprawnienie} other {# grupowych uprawnień} }", + "delete-group-permission-title": "Czy na pewno chcesz usunąć uprawnienia grupy {{roleName}}'?", + "delete-group-permission-text": "Bądź ostrożny, po potwierdzeniu uprawnienia grupy i wszystkie powiązane dane staną się nie do odzyskania.", + "delete-group-permission": "Usuń uprawnienia grupy", + "delete-group-permissions-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 grupowe uprawnienie} other {# grupowych uprawnień} }?", + "delete-group-permissions-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane uprawnienia grupowe zostaną usunięte, a odpowiadający im użytkownicy utracą dostęp do określonych bibliotek.", + "delete-group-permissions": "Usuń uprawnienia grupy", + "add-group-permission": "Dodaj uprawnienia grupy", + "edit-group-permission": "Edytuj uprawnienia grupy", + "entity-group": "Grupa obiektów", + "user-group": "Grupa użytkowników", + "no-owners-matching": "Nie znaleziono właściciela '{{owner}}'.", + "target-owner-required": "Właściciel grupy obiektów jest wymagany.", + "target-user-group-owner-required": "Właściciel grupy użytkowników jest wymagany.", + "no-group-permissions-text": "Nie znaleziono uprawnień grupy" }, - "tenant":{ - "tenant":"Najemca", - "tenants":"Najemcy", - "management":"Zarządzanie najemcami", - "add":"Dodaj najemcę", - "admins":"Administratorzy", - "manage-tenant-admins":"Zarządzaj administratorami najemcy", - "delete":"Usuń najemcę", - "add-tenant-text":"Dodaj nowego najemcę", - "no-tenants-text":"Nie znaleziono najemców", - "tenant-details":"Szczegóły najemcy", - "title-max-length":"Tytuł powinien zawierać mniej niż 256 znaków", - "delete-tenant-title":"Czy na pewno chcesz usunąć najemcę '{{tenantTitle}}'?", - "delete-tenant-text":"Bądź ostrożny, po potwierdzeniu najemca i wszystkie związane z nim dane zostaną bezpowrotnie usunięte.", - "delete-tenants-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 najemcę} other {# najemców} }?", - "delete-tenants-action-title":"Usuń { count, plural, =1 {1 najemcę} other {# najemców} }", - "delete-tenants-text":"Bądź ostrożny, po potwierdzeniu wszyscy wybrani najemcy zostaną usunięci, a wszystkie związane z nimi dane zostaną bezpowrotnie usunięte.", - "title":"Tytuł", - "title-required":"Tytuł jest wymagany.", - "description":"Opis", - "details":"Szczegóły", - "events":"Zdarzenia", - "copyId":"Kopiuj Id najemcy", - "idCopiedMessage":"Id najemcy zostało skopiowane do schowka", - "select-tenant":"Wybierz najemcę", - "no-tenants-matching":"Nie znaleziono najemców pasujących do '{{entity}}'", - "tenant-required":"Najemca jest wymagany", - "search":"Szukaj najemców", - "selected-tenants":"{ count, plural, =1 {1 najemca} other {# najemcy} } wybrano", - "isolated-tb-rule-engine":"Użyj izolowanych kolejek ThingsBoard Rule Engine", - "isolated-tb-rule-engine-details":"Każdy najemca będzie miał dedykowane kolejki Rule Engine" - }, - "tenant-profile":{ - "tenant-profile":"Profil najemcy", - "tenant-profiles":"Profile najemców", - "add":"Dodaj profil najemcy", - "add-profile":"Dodaj profil", - "edit":"Edytuj profil najemcy", - "tenant-profile-details":"Szczegóły profilu najemcy", - "no-tenant-profiles-text":"Nie znaleziono profili najemców", - "name-max-length":"Nazwa powinna zawierać mniej niż 256 znaków", - "search":"Szukaj profili najemców", - "selected-tenant-profiles":"{ count, plural, =1 {1 profil najemcy} other {# profile najemców} } wybrano", - "no-tenant-profiles-matching":"Nie znaleziono profili najemców pasujących do '{{entity}}'", - "tenant-profile-required":"Profil najemcy jest wymagany", - "idCopiedMessage":"Id profilu najemcy zostało skopiowane do schowka", - "set-default":"Ustaw profil najemcy jako domyślny", - "delete":"Usuń profil najemcy", - "copyId":"Kopiuj Id profilu najemcy", - "name":"Nazwa", - "name-required":"Nazwa jest wymagana.", - "data":"Dane profilu", - "profile-configuration":"Konfiguracja profilu", - "description":"Opis", - "default":"Domyślny", - "delete-tenant-profile-title":"Czy na pewno chcesz usunąć profil najemcy '{{tenantProfileName}}'?", - "delete-tenant-profile-text":"Bądź ostrożny, po potwierdzeniu profil najemcy i wszystkie związane z nim dane zostaną bezpowrotnie usunięte.", - "delete-tenant-profiles-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 profil najemcy} other {# profile najemców} }?", - "delete-tenant-profiles-text":"Bądź ostrożny, po potwierdzeniu wszystkie wybrane profile najemców zostaną usunięte, a wszystkie związane z nimi dane zostaną bezpowrotnie usunięte.", - "set-default-tenant-profile-title":"Czy na pewno chcesz ustawić profil najemcy '{{tenantProfileName}}' jako domyślny?", - "set-default-tenant-profile-text":"Po potwierdzeniu profil najemcy zostanie oznaczony jako domyślny i będzie używany dla nowych najemców bez określonego profilu.", - "no-tenant-profiles-found":"Nie znaleziono profili najemców.", - "create-new-tenant-profile":"Utwórz nowy!", - "create-tenant-profile":"Utwórz nowy profil najemcy", - "import":"Importuj profil najemcy", - "export":"Eksportuj profil najemcy", - "export-failed-error":"Nie można wyeksportować profilu najemcy: {{error}}", - "tenant-profile-file":"Plik profilu najemcy", - "invalid-tenant-profile-file-error":"Nie można zaimportować profilu najemcy: Nieprawidłowa struktura danych profilu najemcy.", - "advanced-settings":"Ustawienia zaawansowane", - "entities":"Encje", - "rule-engine":"Silnik reguł", - "time-to-live":"Czas życia", - "alarms-and-notifications":"Alarmy i powiadomienia", - "ota-files-in-bytes":"Pliki", - "ws-title":"WS", - "unlimited":"(0 - nielimitowany)", - "maximum-devices":"Maksymalna liczba urządzeń", - "maximum-devices-required":"Maksymalna liczba urządzeń jest wymagana.", - "maximum-devices-range":"Maksymalna liczba urządzeń nie może być ujemna", - "maximum-assets":"Maksymalna liczba zasobów", - "maximum-assets-required":"Maksymalna liczba zasobów jest wymagana.", - "maximum-assets-range":"Maksymalna liczba zasobów nie może być ujemna", - "maximum-customers":"Maksymalna liczba klientów", - "maximum-customers-required":"Maksymalna liczba klientów jest wymagana.", - "maximum-customers-range":"Maksymalna liczba klientów nie może być ujemna", - "maximum-users":"Maksymalna liczba użytkowników", - "maximum-users-required":"Maksymalna liczba użytkowników jest wymagana.", - "maximum-users-range":"Maksymalna liczba użytkowników nie może być ujemna", - "maximum-dashboards":"Maksymalna liczba desek rozdzielczych", - "maximum-dashboards-required":"Maksymalna liczba desek rozdzielczych jest wymagana.", - "maximum-dashboards-range":"Maksymalna liczba desek rozdzielczych nie może być ujemna", - "maximum-rule-chains":"Maksymalna liczba łańcuchów reguł", - "maximum-rule-chains-required":"Maksymalna liczba łańcuchów reguł jest wymagana.", - "maximum-rule-chains-range":"Maksymalna liczba łańcuchów reguł nie może być ujemna", - "maximum-resources-sum-data-size":"Maksymalny łączny rozmiar plików zasobów (bajty)", - "maximum-resources-sum-data-size-required":"Maksymalny łączny rozmiar plików zasobów jest wymagany.", - "maximum-resources-sum-data-size-range":"Maksymalny łączny rozmiar plików zasobów nie może być ujemny", - "maximum-resource-size":"Maksymalny rozmiar pliku zasobu (bajty)", - "maximum-resource-size-required":"Maksymalny rozmiar pliku zasobu jest wymagany", - "maximum-resource-size-range":"Maksymalny rozmiar pliku zasobu nie może być ujemny", - "maximum-ota-packages-sum-data-size":"Maksymalny łączny rozmiar plików pakietów OTA (bajty)", - "maximum-ota-package-sum-data-size-required":"Maksymalny łączny rozmiar plików pakietów OTA jest wymagany.", - "maximum-ota-package-sum-data-size-range":"Maksymalny łączny rozmiar plików pakietów OTA nie może być ujemny", - "rest-requests-for-tenant":"Zapytania REST dla najemcy", - "transport-tenant-telemetry-msg-rate-limit":"Limit wiadomości telemetrii najemcy", - "transport-tenant-telemetry-data-points-rate-limit":"Limit punktów danych telemetrii najemcy", - "transport-device-msg-rate-limit":"Limit wiadomości urządzenia", - "transport-device-telemetry-msg-rate-limit":"Limit wiadomości telemetrii urządzenia", - "transport-device-telemetry-data-points-rate-limit":"Limit punktów danych telemetrii urządzenia", - "tenant-entity-export-rate-limit":"Limit eksportu wersji encji", - "tenant-entity-import-rate-limit":"Limit ładowania wersji encji", - "tenant-notification-request-rate-limit":"Limit żądań powiadomień", - "tenant-notification-requests-per-rule-rate-limit":"Limit żądań powiadomień na regułę powiadomień", - "max-transport-messages":"Maksymalna liczba wiadomości transportowych", - "max-transport-messages-required":"Maksymalna liczba wiadomości transportowych jest wymagana.", - "max-transport-messages-range":"Maksymalna liczba wiadomości transportowych nie może być ujemna", - "max-transport-data-points":"Maksymalna liczba punktów danych transportowych", - "max-transport-data-points-required":"Maksymalna liczba punktów danych transportowych jest wymagana.", - "max-transport-data-points-range":"Maksymalna liczba punktów danych transportowych nie może być ujemna", - "max-r-e-executions":"Maksymalna liczba wykonanych operacji Silnika Reguł", - "max-r-e-executions-required":"Maksymalna liczba wykonanych operacji Silnika Reguł jest wymagana.", - "max-r-e-executions-range":"Maksymalna liczba wykonanych operacji Silnika Reguł nie może być ujemna", - "max-j-s-executions":"Maksymalna liczba wykonanych operacji JavaScript", - "max-j-s-executions-required":"Maksymalna liczba wykonanych operacji JavaScript jest wymagana.", - "max-j-s-executions-range":"Maksymalna liczba wykonanych operacji JavaScript nie może być ujemna", - "max-tbel-executions":"Maksymalna liczba wykonanych operacji TBEL", - "max-tbel-executions-required":"Maksymalna liczba wykonanych operacji TBEL jest wymagana.", - "max-tbel-executions-range":"Maksymalna liczba wykonanych operacji TBEL nie może być ujemna", - "max-d-p-storage-days":"Maksymalna liczba dni przechowywania punktów danych", - "max-d-p-storage-days-required":"Maksymalna liczba dni przechowywania punktów danych jest wymagana.", - "max-d-p-storage-days-range":"Maksymalna liczba dni przechowywania punktów danych nie może być ujemna", - "default-storage-ttl-days":"Domyślny czas życia pamięci masowej w dniach", - "default-storage-ttl-days-required":"Domyślny czas życia pamięci masowej w dniach jest wymagany.", - "default-storage-ttl-days-range":"Domyślny czas życia pamięci masowej w dniach nie może być ujemny", - "alarms-ttl-days":"Czas życia alarmów w dniach", - "alarms-ttl-days-required":"Czas życia alarmów jest wymagany", - "alarms-ttl-days-days-range":"Okres przechowywania alarmów (TTL) nie może być ujemny", - "rpc-ttl-days":"RPC Okres przechowywania (TTL) dni", - "rpc-ttl-days-required":"Wymagany okres przechowywania (TTL) dni dla RPC", - "rpc-ttl-days-days-range":"Okres przechowywania (TTL) dni dla RPC nie może być ujemny", - "queue-stats-ttl-days":"Okres przechowywania (TTL) dni statystyk kolejki", - "queue-stats-ttl-days-required":"Wymagany okres przechowywania (TTL) dni dla statystyk kolejki", - "queue-stats-ttl-days-range":"Okres przechowywania (TTL) dni dla statystyk kolejki nie może być ujemny", - "rule-engine-exceptions-ttl-days":"Okres przechowywania (TTL) dni wyjątków silnika reguł", - "rule-engine-exceptions-ttl-days-required":"Wymagany okres przechowywania (TTL) dni dla wyjątków silnika reguł", - "rule-engine-exceptions-ttl-days-range":"Okres przechowywania (TTL) dni dla wyjątków silnika reguł nie może być ujemny", - "max-rule-node-executions-per-message":"Maksymalna liczba wykonanych węzłów reguł na wiadomość", - "max-rule-node-executions-per-message-required":"Wymagana maksymalna liczba wykonanych węzłów reguł na wiadomość", - "max-rule-node-executions-per-message-range":"Maksymalna liczba wykonanych węzłów reguł na wiadomość nie może być ujemna", - "max-emails":"Maksymalna liczba wysłanych wiadomości e-mail", - "max-emails-required":"Wymagana maksymalna liczba wysłanych wiadomości e-mail", - "max-emails-range":"Maksymalna liczba wysłanych wiadomości e-mail nie może być ujemna", - "sms-enabled":"SMS włączony", - "max-sms":"Maksymalna liczba wysłanych wiadomości SMS", - "max-sms-required":"Wymagana maksymalna liczba wysłanych wiadomości SMS", - "max-sms-range":"Maksymalna liczba wysłanych wiadomości SMS nie może być ujemna", - "max-created-alarms":"Maksymalna liczba utworzonych alarmów", - "max-created-alarms-required":"Wymagana maksymalna liczba utworzonych alarmów", - "max-created-alarms-range":"Maksymalna liczba utworzonych alarmów nie może być ujemna", - "no-queue":"Brak skonfigurowanej kolejki", - "add-queue":"Dodaj kolejkę", - "queues-with-count":"Kolejki ({{count}})", - "tenant-rest-limits":"Żądania REST dla najemcy", - "customer-rest-limits":"Żądania REST dla klienta", - "incorrect-pattern-for-rate-limits":"Nieprawidłowy format dla limitów szybkości. Pary pojemność:okres (w sekundach) oddzielone przecinkiem, np. 100:1,2000:60", - "too-small-value-zero":"Wartość musi być większa niż 0", - "too-small-value-one":"Wartość musi być większa niż 1", - "queue-size-is-limited-by-system-configuration":"Rozmiar kolejki jest również ograniczony konfiguracją systemu.", - "cassandra-tenant-limits-configuration":"Zapytanie do Cassandry dla najemcy", - "ws-limit-max-sessions-per-tenant":"Maksymalna liczba sesji na najemcę", - "ws-limit-max-sessions-per-customer":"Maksymalna liczba sesji na klienta", - "ws-limit-max-sessions-per-regular-user":"Maksymalna liczba sesji na zwykłego użytkownika", - "ws-limit-max-sessions-per-public-user":"Maksymalna liczba sesji na publicznego użytkownika", - "ws-limit-queue-per-session":"Maksymalny rozmiar kolejki wiadomości na sesję", - "ws-limit-max-subscriptions-per-tenant":"Maksymalna liczba subskrypcji na najemcę", - "ws-limit-max-subscriptions-per-customer":"Maksymalna liczba subskrypcji na klienta", - "ws-limit-max-subscriptions-per-regular-user":"Maksymalna liczba subskrypcji na zwykłego użytkownika", - "ws-limit-max-subscriptions-per-public-user":"Maksymalna liczba subskrypcji na publicznego użytkownika", - "ws-limit-updates-per-session":"Aktualizacje WS na sesję", - "rate-limits":{ - "add-limit":"Dodaj limit", - "advanced-settings":"Zaawansowane ustawienia", - "edit-limit":"Edytuj limit", - "but-less-than":"ale mniejsze niż", - "edit-transport-tenant-msg-title":"Edytuj limity szybkości przesyłania komunikatów najemcy", - "edit-transport-tenant-telemetry-msg-title":"Edytuj limity szybkości przesyłania telemetrii komunikatów najemcy", - "edit-transport-tenant-telemetry-data-points-title":"Edytuj limity szybkości przesyłania punktów danych telemetrii najemcy", - "edit-transport-device-msg-title":"Edytuj limity szybkości przesyłania komunikatów urządzenia", - "edit-transport-device-telemetry-msg-title":"Edytuj limity szybkości przesyłania telemetrii komunikatów urządzenia", - "edit-transport-device-telemetry-data-points-title":"Edytuj limity szybkości przesyłania punktów danych telemetrii urządzenia", - "edit-tenant-rest-limits-title":"Edytuj limity szybkości żądań REST dla najemcy", - "edit-customer-rest-limits-title":"Edytuj limity szybkości żądań REST dla klienta", - "edit-ws-limit-updates-per-session-title":"Edytuj limity szybkości aktualizacji WS na sesję", - "edit-cassandra-tenant-limits-configuration-title":"Edytuj limity szybkości zapytań do Cassandry dla najemcy", - "edit-tenant-entity-export-rate-limit-title":"Edytuj limity szybkości tworzenia wersji jednostki dla najemcy", - "edit-tenant-entity-import-rate-limit-title":"Edytuj limity szybkości wczytywania wersji jednostki dla najemcy", - "edit-tenant-notification-request-rate-limit-title":"Edytuj limity szybkości żądań powiadomień dla najemcy", - "edit-tenant-notification-requests-per-rule-rate-limit-title":"Edytuj limity szybkości żądań powiadomień na regułę powiadomień dla najemcy", - "messages-per":"komunikatów na", - "not-set":"Nie ustawiono", - "number-of-messages":"Liczba komunikatów", - "number-of-messages-required":"Wymagana liczba komunikatów.", - "number-of-messages-min":"Minimalna wartość to 1.", - "preview":"Podgląd", - "per-seconds":"Na sekundę", - "per-seconds-required":"Wymagana jest szybkość czasowa.", - "per-seconds-min":"Minimalna wartość to 1.", - "rate-limits":"Limity szybkości", - "remove-limit":"Usuń limit", - "transport-tenant-msg":"Przesyłanie komunikatów najemcy", - "transport-tenant-telemetry-msg":"Przesyłanie telemetrii komunikatów najemcy", - "transport-tenant-telemetry-data-points":"Przesyłanie punktów danych telemetrii najemcy", - "transport-device-msg":"Przesyłanie komunikatów urządzenia", - "transport-device-telemetry-msg":"Przesyłanie telemetrii komunikatów urządzenia", - "transport-device-telemetry-data-points":"Przesyłanie punktów danych telemetrii urządzenia", - "sec":"sek" - } - }, - "timeinterval":{ - "seconds-interval":"{ seconds, plural, =1 {1 sekunda} other {# sekundy} }", - "minutes-interval":"{ minutes, plural, =1 {1 minuta} other {# minuty} }", - "hours-interval":"{ hours, plural, =1 {1 godzina} other {# godziny} }", - "days-interval":"{ days, plural, =1 {1 dzień} other {# dni} }", - "days":"Dni", - "hours":"Godziny", - "minutes":"Minuty", - "seconds":"Sekundy", - "advanced":"Zaawansowane", - "predefined":{ - "yesterday":"Wczoraj", - "day-before-yesterday":"Przedwczoraj", - "this-day-last-week":"Ten dzień w zeszłym tygodniu", - "previous-week":"Poprzedni tydzień (Ndz - Sob)", - "previous-week-iso":"Poprzedni tydzień (Pon - Ndz)", - "previous-month":"Poprzedni miesiąc", - "previous-quarter":"Poprzedni kwartał", - "previous-half-year":"Poprzednie półrocze", - "previous-year":"Poprzedni rok", - "current-hour":"Bieżąca godzina", - "current-day":"Bieżący dzień", - "current-day-so-far":"Bieżący dzień do tej pory", - "current-week":"Bieżący tydzień (Ndz - Sob)", - "current-week-iso":"Bieżący tydzień (Pon - Ndz)", - "current-week-so-far":"Bieżący tydzień do tej pory (Ndz - Sob)", - "current-week-iso-so-far":"Bieżący tydzień do tej pory (Pon - Ndz)", - "current-month":"Bieżący miesiąc", - "current-month-so-far":"Bieżący miesiąc do tej pory", - "current-quarter":"Bieżący kwartał", - "current-quarter-so-far":"Bieżący kwartał do tej pory", - "current-half-year":"Bieżące półrocze", - "current-half-year-so-far":"Bieżące półrocze do tej pory", - "current-year":"Bieżący rok", - "current-year-so-far":"Bieżący rok do tej pory" + "permission": { + "permissions-required": "Należy określić co najmniej jeden wpis uprawnień.", + "remove-permission": "Usuń wpis uprawnień", + "add-permission": "Dodaj wpis uprawnień", + "other": "Inny", + "resource": { + "resource": "Biblioteka", + "select-resource": "Wybierz bibliotekę", + "resource-required": "Biblioteka jest wymagana", + "no-resources-matching": "Nie znaleziono biblioteki '{{resource}}'.", + "display-type": { + "ALL": "Wszystko", + "PROFILE": "Profil", + "ADMIN_SETTINGS": "Ustawienia administratora", + "ALARM": "Alarm", + "DEVICE": "Urządzenie", + "DEVICE_PROFILE": "Profil urządzenia", + "ASSET": "Zasób", + "CUSTOMER": "Klient", + "DASHBOARD": "Panel", + "ENTITY_VIEW": "Widok obiektów", + "EDGE": "Edge", + "TENANT": "Tenant", + "TENANT_PROFILE": "Profil tenanta", + "RULE_CHAIN": "Łańcuch reguł", + "USER": "Użytkownik", + "WIDGETS_BUNDLE": "Pakiet widżetów", + "WIDGET_TYPE": "Typ widżetu", + "CONVERTER": "Przetwornik", + "INTEGRATION": "Integracja", + "SCHEDULER_EVENT": "Zdarzenie planisty", + "BLOB_ENTITY": "Obiekt typu Blob", + "CUSTOMER_GROUP": "Grupa klientów", + "DEVICE_GROUP": "Grupa urządzeń", + "ASSET_GROUP": "Grupa zasobów", + "USER_GROUP": "Grupa użytkowników", + "ENTITY_VIEW_GROUP": "Grupa widoku obiektów", + "DASHBOARD_GROUP": "Grupa Panelu", + "ROLE": "Rola", + "GROUP_PERMISSION": "Zezwolenie grupowe", + "WHITE_LABELING": "White Labeling", + "AUDIT_LOG": "Dziennik kontroli", + "API_USAGE_STATE": "Stan użycia interfejsu API", + "TB_RESOURCE": "Biblioteka", + "EDGE_GROUP": "Grupa Edge", + "OTA_PACKAGE": "Pakiet Ota", + "QUEUE": "Kolejka", + "VERSION_CONTROL": "Kontrola wersji", + "ASSET_PROFILE": "Profil zasobu", + "NOTIFICATION": "Powiadomienie" + } }, - "type":{ - "week":"Tydzień (Ndz - Sob)", - "week-iso":"Tydzień (Pon - Ndz)", - "month":"Miesiąc", - "quarter":"Kwartał" + "operation": { + "operation": "Operacja", + "operations": "Operacje", + "operations-required": "Należy określić co najmniej jedną operację.", + "enter-operation": "Wprowadź operację", + "no-operations-matching": "Nie znaleziono operacji '{{operation}}'.", + "display-type": { + "ALL": "Wszystko", + "CREATE": "Stwórz", + "READ": "Czytaj", + "WRITE": "Zapisz", + "DELETE": "Usuń", + "ASSIGN_TO_CUSTOMER": "Przypisz do Klienta", + "UNASSIGN_FROM_CUSTOMER": "Usuń przypisanie od klienta", + "RPC_CALL": "Zadzwoń do RPC", + "READ_CREDENTIALS": "Przeczytaj dane uwierzytelniające", + "WRITE_CREDENTIALS": "Zapisz dane uwierzytelniające", + "READ_ATTRIBUTES": "Przeczytaj Atrybuty", + "WRITE_ATTRIBUTES": "Zapisz atrybuty", + "READ_TELEMETRY": "Przeczytaj telemetrię", + "WRITE_TELEMETRY": "Zapisz telemetrię", + "CLAIM_DEVICES": "Zgłoś urządzenia", + "IMPERSONATE": "Podszywać się", + "CHANGE_OWNER": "Zmiana właściciela", + "ADD_TO_GROUP": "Dodaj do grupy", + "REMOVE_FROM_GROUP": "Usuń z grupy", + "SHARE_GROUP": "Udostępnij grupę", + "ASSIGN_TO_TENANT": "Przypisz do tenanta" + } } }, - "timeunit":{ - "milliseconds":"Milisekundy", - "seconds":"Sekundy", - "minutes":"Minuty", - "hours":"Godziny", - "days":"Dni" + "scheduler": { + "scheduler": "Planista", + "scheduler-event": "zdarzenie planisty", + "select-scheduler-event": "Wybierz zdarzenie planisty", + "no-scheduler-events-matching": "Nie znaleziono zdarzeń planisty pasujących do '{{entity}}'.", + "scheduler-event-required": "Zdarzenie planisty jest wymagane", + "management": "Zarządzanie harmonogramem", + "scheduler-events": "Harmonogram wydarzeń", + "add-scheduler-event": "Dodaj zdarzenie planisty", + "search-scheduler-events": "Wyszukaj zdarzenia planisty", + "created-time": "Stworzony czas", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana.", + "name-max-length": "Nazwa powinna być mniejsza niż 256", + "type": "Typ", + "created_customer": "Stworzony przez Klienta", + "edit-scheduler-event": "Edytuj zdarzenie planisty", + "view-scheduler-event": "Wyświetl zdarzenie planisty", + "delete-scheduler-event": "Usuń zdarzenie planisty", + "no-scheduler-events": "Nie znaleziono żadnych wydarzeń planisty", + "selected-scheduler-events": "Wybrano { count, plural, =1 {1 zdarzenie planisty} other {# zdarzeń(ia) planisty} }", + "delete-scheduler-event-title": "Czy na pewno chcesz usunąć zdarzenie planisty '{{schedulerEventName}}'?", + "delete-scheduler-event-text": "Bądź ostrożny, po zdarzeniu planisty potwierdzenia i wszystkich powiązanych danych stanie się niemożliwy do odzyskania.", + "delete-scheduler-events-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 zdarzenie planisty} other {# zdarzeń(ia) planisty} }?", + "delete-scheduler-events-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane zdarzenia planisty zostaną usunięte, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "create": "Utwórz zdarzenie planisty", + "edit": "Edytuj zdarzenie planisty", + "view": "Wyświetl zdarzenie planisty", + "configuration": "Konfiguracja", + "schedule": "Harmonogram", + "start-time": "Czas rozpoczęcia", + "repeat": "Powtarzaj", + "repeats": "Powtórzenia", + "daily": "Codziennie", + "every-n-days": "Co N dni", + "every-n-days-text": "Co { days, plural, =1 {dzień} other {# dni} }", + "weekly": "Co tydzień", + "every-n-weeks": "Co N tygodni", + "every-n-weeks-text": "Co { weeks, plural, =1 {tydzień} other {# tygodni(e)} }", + "monthly": "Miesięczny", + "yearly": "Rocznie", + "timer": "Oparte na timerze", + "repeats-required": "Powtórzenia są wymagane.", + "repeat-on": "Powtórz w", + "repeat-every": "Powtarzaj każde", + "repeat-every-n-days": "Powtarzaj co N dni", + "repeat-days-required": "Liczba dni do powtórzenia jest wymagana.", + "invalid-repeat-days-value": "Liczba dni powtarzania musi być dodatnią liczbą całkowitą.", + "repeat-every-n-weeks": "Powtarzaj co N tygodni", + "repeat-weeks-required": "Liczba tygodni do powtórzenia jest wymagana.", + "invalid-repeat-weeks-value": "Liczba tygodni do powtórzenia musi być dodatnią liczbą całkowitą.", + "ends-on": "Kończy się", + "sunday-label": "N", + "monday-label": "P", + "tuesday-label": "W", + "wednesday-label": "Ś", + "thursday-label": "C", + "friday-label": "Pt", + "saturday-label": "S", + "repeat-on-sunday": "Powtórz w niedzielę", + "repeat-on-monday": "Powtórz w poniedziałek", + "repeat-on-tuesday": "Powtórz we wtorek", + "repeat-on-wednesday": "Powtórz w środę", + "repeat-on-thursday": "Powtórz w czwartek", + "repeat-on-friday": "Powtórz w piątek", + "repeat-on-saturday": "Powtórz w sobotę", + "event-type": "Typ wydarzenia", + "select-event-type": "Wybierz typ wydarzenia", + "event-type-required": "Typ wydarzenia jest wymagany.", + "event-type-max-length": "Typ wydarzenia powinien być mniejszy niż 256.", + "list-mode": "Widok listy", + "calendar-mode": "Widok kalendarza", + "calendar-view-type": "Typ widoku kalendarza", + "month": "Miesiąc", + "week": "Tydzień", + "day": "Dzień", + "agenda-week": "Tydzień porządku dziennego", + "agenda-day": "Dzień Agendy", + "list-year": "Wypisz rok", + "list-month": "Wypisz miesiąc", + "list-week": "Wypisz Tydzień", + "list-day": "Wypisz Dzień", + "today": "Dzisiaj", + "navigate-before": "Nawiguj przed", + "navigate-next": "Przejdź dalej", + "starting-from": "Zaczynając od", + "until": "dopóki", + "on": "w", + "sunday": "Niedziela", + "monday": "Poniedziałek", + "tuesday": "Wtorek", + "wednesday": "Środa", + "thursday": "Czwartek", + "friday": "Piątek", + "saturday": "Sobota", + "originator": "Inicjator", + "single-entity": "Pojedyńczy obiekt", + "group-of-entities": "Grupa obiektów", + "entities-group-owner": "Właściciel grupy obiektów", + "single-device": "Pojedyncze urządzenie", + "group-of-devices": "Grupa urządzeń", + "devices-group-owner": "Właściciel grupy urządzeń", + "message-body": "Treść wiadomości", + "target": "Cel", + "rpc-method": "metoda", + "rpc-method-required": "Metoda jest wymagana", + "rpc-method-white-space": "Znak biały jest niedozwolony.", + "rpc-params": "Parametry", + "select-dashboard-state": "Wybierz stan panelu", + "hours": "Godziny", + "minutes": "Minuty", + "seconds": "Sekundy", + "time-interval-required": "Odstęp czasu jest wymagany", + "time-unit-required": "Jednostka czasu jest wymagana", + "every-hour": "co { count, plural, =1 {godzinę} other {# godzin(y)} }", + "every-minute": "co { count, plural, =1 {minutę} other {# minut(y)} }", + "every-second": "co { count, plural, =1 {sekundę} other {# sekund(y)} }", + "invalid-time": "Nieprawidłowy czas" }, - "timewindow":{ - "timewindow":"Okno czasowe", - "years":"{ years, plural, =1 { rok } other {# lata } }", - "years-short":"{{ years }}r", - "months":"{ months, plural, =1 { miesiąc } other {# miesiące } }", - "months-short":"{{ months }}m", - "weeks":"{ weeks, plural, =1 { tydzień } other {# tygodnie } }", - "weeks-short":"{{ weeks }}t", - "days":"{ days, plural, =1 { dzień } other {# dni } }", - "days-short":"{{ days }}d", - "hours":"{ hours, plural, =0 { godzina } =1 {1 godzina } other {# godziny } }", - "hr":"{{ hr }} godz", - "hr-short":"{{ hr }}h", - "minutes":"{ minutes, plural, =0 { minuta } =1 {1 minuta } other {# minuty } }", - "min":"{{ min }} min", - "min-short":"{{ min }}m", - "seconds":"{ seconds, plural, =0 { sekunda } =1 {1 sekunda } other {# sekundy } }", - "sec":"{{ sec }} sek", - "sec-short":"{{ sec }}s", - "short":{ - "days":"{ days, plural, =1 {1 dzień } other {# dni } }", - "hours":"{ hours, plural, =1 {1 godzina } other {# godziny } }", - "minutes":"{{minutes}} min ", - "seconds":"{{seconds}} sek " + "report": { + "report-config": "Konfiguracja raportu", + "email-config": "Konfiguracja poczty", + "dashboard-state-param": "Wartość parametru stanu panelu", + "base-url": "Bazowy adres URL", + "base-url-required": "Podstawowy adres URL jest wymagany.", + "use-dashboard-timewindow": "Użyj okna czasowego panelu", + "timewindow": "Okno czasowe", + "name-pattern": "Wzór nazwy raportu", + "name-pattern-required": "Wzorzec nazwy raportu jest wymagany", + "type": "Typ raportu", + "use-current-user-credentials": "Użyj aktualnych poświadczeń użytkownika", + "customer-user-credentials": "Poświadczenia użytkownika klienta", + "customer-user-credentials-required": "Poświadczenia użytkownika klienta są wymagane", + "generate-test-report": "Wygeneruj raport z testu", + "send-email": "Wysłać email", + "from": "Od", + "from-required": "Nadawca jest wymagany.", + "to": "Do", + "to-required": "Odbiorca jest wymagany.", + "cc": "Dw", + "bcc": "UDW", + "subject": "Temat", + "subject-required": "Temat jest wymagany.", + "body": "Treść", + "body-required": "Treść jest wymagana." + }, + "blob-entity": { + "blob-entity": "obiekt typu blob", + "select-blob-entity": "Wybierz obiekt BLOB", + "no-blob-entities-matching": "Nie znaleziono obiektów BLOB pasujących do '{{entity}}'", + "blob-entity-required": "Obiekt typu BLOB jest wymagany", + "files": "Pliki", + "search": "Wyszukaj pliki", + "clear-search": "Wyczyść wyszukiwanie", + "no-blob-entities-prompt": "Nie znaleziono plików", + "report": "Raport", + "created-time": "Stworzony czas", + "name": "Nazwa", + "type": "Typ", + "created_customer": "Stworzony przez Klienta", + "selected-blob-entities": "{ count, plural, =1 {1 file} other {# files} } wybrane", + "download-blob-entity": "Pobierz plik", + "delete-blob-entity": "Usuń plik", + "delete-blob-entity-title": "Czy na pewno chcesz usunąć plik '{{blobEntityName}}'?", + "delete-blob-entity-text": "Bądź ostrożny, po przesłaniu pliku potwierdzenia dane staną się nie do odzyskania.", + "delete-blob-entities-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 plik} other {# plików} }", + "delete-blob-entities-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane pliki zostaną usunięte, a wszystkie powiązane dane staną się niemożliwe do odzyskania." + }, + "timezone": { + "timezone": "Strefa czasowa", + "select-timezone": "Wybierz strefę czasową", + "no-timezones-matching": "Nie znaleziono stref czasowych pasujących do '{{timezone}}'.", + "timezone-required": "Strefa czasowa jest wymagana.", + "browser-time": "Czas przeglądarki" + }, + "queue": { + "queue-name": "Kolejka", + "no-queues-found": "Nie znaleziono kolejek.", + "no-queues-matching": "Brak kolejek pasujących do '{{queue}}'", + "select-name": "Wybierz nazwę kolejki", + "name": "Nazwa", + "name-required": "Nazwa kolejki jest wymagana!", + "name-unique": "Nazwa kolejki nie jest unikalna!", + "name-pattern": "Nazwa kolejki zawiera znak inny niż alfanumeryczny ASCII, „.”, „_” i „-”!", + "queue-required": "Kolejka jest wymagana!", + "topic-required": "Temat kolejki jest wymagany!", + "poll-interval-required": "Interwał odpytywania jest wymagany!", + "poll-interval-min-value": "Wartość interwału odpytywania nie może być mniejsza niż 1", + "partitions-required": "Partycje są wymagane!", + "partitions-min-value": "Wartość partycji nie może być mniejsza niż 1", + "pack-processing-timeout-required": "Limit czasu przetwarzania jest wymagany", + "pack-processing-timeout-min-value": "Wartość limitu czasu przetwarzania nie może być mniejsza niż 1", + "batch-size-required": "Wielkość partii jest wymagana!", + "batch-size-min-value": "Wartość wielkości partii nie może być mniejsza niż 1", + "retries-required": "Ilość ponownych prób jest wymagana!", + "retries-min-value": "Wartość ponownych prób nie może być ujemna", + "failure-percentage-required": "Procent niepowodzeń jest wymagany!", + "failure-percentage-min-value": "Wartość procentowa niepowodzeń nie może być mniejsza niż 0", + "failure-percentage-max-value": "Wartość procentowa niepowodzeń nie może być większa niż 100", + "pause-between-retries-required": "Przerwa między ponownymi próbami jest wymagana!", + "pause-between-retries-min-value": "Wartość przerwy między ponownymi próbami nie może być mniejsza niż 1", + "max-pause-between-retries-required": "Maksymalna przerwa między ponownymi próbami jest wymagana!", + "max-pause-between-retries-min-value": "Maksymalna wartość przerwy między ponownymi próbami nie może być mniejsza niż 1", + "submit-strategy-type-required": "Prześlij typ strategii jest wymagany!", + "processing-strategy-type-required": "Typ strategii przetwarzania jest wymagany!", + "queues": "Kolejki", + "selected-queues": "Wybrano { count, plural, =1 {1 kolejkę} other {# kolejek} }", + "delete-queue-title": "Czy na pewno chcesz usunąć kolejkę {{queueName}}'?", + "delete-queues-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 kolejkę} other {# kolejek} }?", + "delete-queue-text": "Bądź ostrożny, po potwierdzeniu kolejki i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-queues-text": "Po potwierdzeniu wszystkie wybrane kolejki zostaną usunięte i nie będą dostępne.", + "search": "Kolejka wyszukiwania", + "add": "Dodaj kolejkę", + "details": "Szczegóły kolejki", + "topic": "Temat", + "submit-settings": "Prześlij ustawienia", + "submit-strategy": "Typ strategii *", + "grouping-parameter": "Parametr grupowania", + "processing-settings": "Ponawia próbę przetwarzania ustawień", + "processing-strategy": "Rodzaj przetwarzania *", + "retries-settings": "Ponawia ustawienia", + "polling-settings": "Ustawienia odpytywania", + "batch-processing": "Przetwarzanie wsadowe", + "poll-interval": "Interwał odpytywania", + "partitions": "Partycje", + "immediate-processing": "Natychmiastowe przetwarzanie", + "consumer-per-partition": "Wyślij ankietę do każdego konsumenta", + "consumer-per-partition-hint": "Włącz osobnych konsumentów dla każdej partycji", + "processing-timeout": "Przetwarzanie w ciągu, ms", + "batch-size": "Rozmiar partii", + "retries": "Liczba ponownych prób (0 – nieograniczona)", + "failure-percentage": "Procent komunikatów o błędach związanych z pominięciem ponownych prób", + "pause-between-retries": "Spróbuj ponownie w ciągu, sek", + "max-pause-between-retries": "Dodatkowa ponowna próba w ciągu, sek", + "delete": "Usuń kolejkę", + "copyId": "Skopiuj identyfikator kolejki", + "idCopiedMessage": "Identyfikator kolejki został skopiowany do schowka", + "description": "Opis", + "description-hint": "Tekst ten będzie wyświetlany w opisie kolejki zamiast wybranej strategii", + "alt-description": "Prześlij strategię: {{submitStrategy}}, Strategia przetwarzania: {{processingStrategy}}", + "custom-properties": "Custom properties", + "custom-properties-hint": "Custom queue (topic) creation properties, e.g. 'retention.ms:604800000;retention.bytes:1048576000'", + "strategies": { + "sequential-by-originator-label": "Sekwencja według inicjatora", + "sequential-by-originator-hint": "Nowa wiadomość dla m.in. ", + "sequential-by-tenant-label": "Kolejność według tenanta", + "sequential-by-tenant-hint": "Nowa wiadomość dla np. tenanta A nie zostanie wysłana do czasu potwierdzenia poprzedniej wiadomości dla tenanta A", + "sequential-label": "Sekwencyjny", + "sequential-hint": "Nowa wiadomość nie zostanie przesłana, dopóki poprzednia wiadomość nie zostanie potwierdzona", + "burst-label": "Wybuch", + "burst-hint": "Wszystkie wiadomości są przesyłane do łańcuchów reguł w kolejności ich nadejścia", + "batch-label": "Seria", + "batch-hint": "Nowa partia nie zostanie przesłana do czasu potwierdzenia poprzedniej partii", + "skip-all-failures-label": "Pomiń wszystkie niepowodzenia", + "skip-all-failures-hint": "Ignoruj ​​wszystkie niepowodzenia", + "skip-all-failures-and-timeouts-label": "Pomiń wszystkie awarie i przekroczenia limitu czasu", + "skip-all-failures-and-timeouts-hint": "Ignoruj ​​wszystkie awarie i przekroczenia limitu czasu", + "retry-all-label": "Spróbuj ponownie", + "retry-all-hint": "Ponów próbę wszystkich wiadomości z pakietu przetwarzania", + "retry-failed-label": "Ponowna próba nie powiodła się", + "retry-failed-hint": "Ponów próbę dla wszystkich nieudanych wiadomości z pakietu przetwarzania", + "retry-timeout-label": "Przekroczono limit czasu ponownej próby", + "retry-timeout-hint": "Ponów próbę dla wszystkich wiadomości, których przekroczono limit czasu, z pakietu przetwarzania", + "retry-failed-and-timeout-label": "Ponowna próba nie powiodła się i przekroczono limit czasu", + "retry-failed-and-timeout-hint": "Ponów próbę dla wszystkich wiadomości z pakietu przetwarzania, które nie powiodły się i przekroczyły limit czasu" + } + }, + "server-error": { + "general": "Ogólny błąd serwera", + "authentication": "Błąd autoryzacji", + "jwt-token-expired": "Token JWT wygasł", + "tenant-trial-expired": "Okres próbny tenanta dobiegł końca", + "credentials-expired": "Poświadczenia wygasły", + "permission-denied": "Odmowa pozwolenia", + "invalid-arguments": "Nieprawidłowe argumenty", + "bad-request-params": "Złe parametry żądania", + "item-not-found": "Nie znaleziono obiektów", + "too-many-requests": "zbyt dużo próśb", + "too-many-updates": "Za dużo aktualizacji (⊙ _ ⊙ )" + }, + "tenant": { + "tenant": "Tenant", + "tenants": "Tenanci", + "management": "Zarządzanie Tenantami", + "add": "Dodaj tenanta", + "admins": "Administratorzy", + "manage-tenant-admins": "Zarządzaj administratorami tenantów", + "delete": "Usuń tenanta", + "add-tenant-text": "Dodaj nowego tenanta", + "no-tenants-text": "Nie znaleziono tenantów", + "tenant-details": "Dane tenanta", + "title-max-length": "Tytuł powinien być mniejszy niż 256", + "delete-tenant-title": "Czy na pewno chcesz usunąć tenanta '{{tenantTitle}}'?", + "delete-tenant-text": "Bądź ostrożny, po potwierdzeniu tenanta i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-tenants-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 tenanta} other {# tenantów} }?", + "delete-tenants-action-title": "Usuń { count, plural, =1 {1 tenanta} other {# tenantów} }", + "delete-tenants-text": "Bądź ostrożny, po potwierdzeniu wszyscy wybrani tenanci zostaną usunięci, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "title": "Tytuł", + "title-required": "Tytuł jest wymagany.", + "description": "Opis", + "details": "Szczegóły", + "events": "Wydarzenia", + "copyId": "Skopiuj identyfikator tenanta", + "idCopiedMessage": "Identyfikator został skopiowany do schowka", + "select-tenant": "Wybierz tenanta", + "no-tenants-matching": "Nie znaleziono tenanta '{{entity}}'.", + "tenant-required": "Tenant jest wymagany", + "allow-white-labeling": "Zezwalaj na White Labeling", + "allow-customer-white-labeling": "Zezwalaj na White Labeling klienta", + "search": "Wyszukaj tenantów", + "selected-tenants": "Wybrano { count, plural, =1 {1 tenanta} other {# tenantów} }", + "isolated-tb-rule-engine": "Przetwarzanie w izolowanym kontenerze mechanizmu reguł ThingsBoard", + "isolated-tb-rule-engine-details": "Wymaga oddzielnych mikrousług dla każdego izolowanego Tenanta" + }, + "tenant-profile": { + "tenant-profile": "Profil tenanta", + "tenant-profiles": "Profile Tenantów", + "add": "Dodaj profil tenanta", + "add-profile": "Dodaj profil", + "edit": "Edytuj profil tenanta", + "tenant-profile-details": "Dane profilu tenanta", + "no-tenant-profiles-text": "Nie znaleziono profili Tenantów", + "name-max-length": "Nazwa powinna być mniejsza niż 256", + "search": "Przeszukaj profile Tenantów", + "selected-tenant-profiles": "Wybrano { count, plural, =1 {1 profil tenanta} other {# profili tenantów} }", + "no-tenant-profiles-matching": "Nie znaleziono profilu tenanta '{{entity}}'.", + "tenant-profile-required": "Profil tenanta jest wymagany", + "idCopiedMessage": "Identyfikator profilu tenanta został skopiowany do schowka", + "set-default": "Ustaw profil tenanta jako domyślny", + "delete": "Usuń profil tenanta", + "copyId": "Skopiuj identyfikator profilu tenanta", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana.", + "data": "Dane profilu", + "profile-configuration": "Konfiguracja profilu", + "description": "Opis", + "default": "Domyślny", + "delete-tenant-profile-title": "Czy na pewno chcesz usunąć profil tenanta '{{tenantProfileName}}'?", + "delete-tenant-profile-text": "Bądź ostrożny, po potwierdzeniu profilu tenanta i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-tenant-profiles-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 profil tenanta} other {# profili tenantów} }", + "delete-tenant-profiles-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane profile Tenantów zostaną usunięte, a wszystkich powiązanych danych nie będzie można odzyskać.", + "set-default-tenant-profile-title": "Czy na pewno chcesz utworzyć profil tenanta '{{tenantProfileName}}' domyślny?", + "set-default-tenant-profile-text": "Po potwierdzeniu profil tenanta zostanie oznaczony jako domyślny i będzie używany dla nowych Tenantów bez określonego profilu.", + "no-tenant-profiles-found": "Nie znaleziono profili Tenantów.", + "create-new-tenant-profile": "Utwórz nowy!", + "create-tenant-profile": "Utwórz nowy profil tenanta", + "import": "Importuj profil tenanta", + "export": "Eksportuj profil tenanta", + "export-failed-error": "Nie można wyeksportować profilu tenanta: {{error}}", + "tenant-profile-file": "Plik profilu tenanta", + "invalid-tenant-profile-file-error": "Nie można zaimportować profilu tenanta: nieprawidłowa struktura danych profilu tenanta.", + "advanced-settings": "Zaawansowane ustawienia", + "entities": "obiekty", + "rule-engine": "Silnik reguł", + "time-to-live": "Czas żyć", + "alarms-and-notifications": "Alarmy i powiadomienia", + "ota-files-in-bytes": "Pliki OTA w bajtach", + "ws-title": "WS", + "unlimited": "(0 - nieograniczony)", + "maximum-devices": "Maksymalna liczba urządzeń", + "maximum-devices-required": "Maksymalna liczba urządzeń jest wymagana.", + "maximum-devices-range": "Maksymalna liczba urządzeń nie może być ujemna", + "maximum-assets": "Maksymalna liczba zasobów", + "maximum-assets-required": "Maksymalna liczba zasobów jest wymagana.", + "maximum-assets-range": "Maksymalna liczba zasobów nie może być ujemna", + "maximum-customers": "Maksymalna liczba klientów", + "maximum-customers-required": "Maksymalna liczba klientów jest wymagana.", + "maximum-customers-range": "Maksymalna liczba klientów nie może być ujemna", + "maximum-users": "Maksymalna liczba użytkowników", + "maximum-users-required": "Maksymalna liczba użytkowników jest wymagana.", + "maximum-users-range": "Maksymalna liczba użytkowników nie może być ujemna", + "maximum-dashboards": "Maksymalna liczba paneli", + "maximum-dashboards-required": "Maksymalna liczba paneli jest wymagana.", + "maximum-dashboards-range": "Maksymalna liczba paneli nie może być ujemna", + "maximum-rule-chains": "Maksymalna liczba łańcuchów reguł", + "maximum-rule-chains-required": "Maksymalna liczba łańcuchów reguł jest wymagana.", + "maximum-rule-chains-range": "Maksymalna liczba łańcuchów reguł nie może być ujemna", + "maximum-integrations": "Maksymalna liczba integracji", + "maximum-integrations-required": "Maksymalna liczba integracji jest wymagana.", + "maximum-integrations-range": "Maksymalna liczba integracji nie może być ujemna", + "maximum-converters": "Maksymalna liczba konwerterów", + "maximum-converters-required": "Maksymalna liczba konwerterów jest wymagana.", + "maximum-converters-range": "Maksymalna liczba konwerterów nie może być ujemna", + "maximum-scheduler-events": "Maksymalna liczba zdarzeń planisty", + "maximum-scheduler-events-required": "Maksymalna liczba zdarzeń planisty jest wymagana.", + "maximum-scheduler-events-range": "Maksymalna liczba zdarzeń planisty nie może być ujemna", + "maximum-resources-sum-data-size": "Sumaryczny rozmiar plików bibliotek", + "maximum-resources-sum-data-size-required": "Sumaryczny rozmiar plików bibliotek jest wymagany.", + "maximum-resources-sum-data-size-range": "Suma rozmiarów plików bibliotek nie może być ujemna", + "maximum-ota-packages-sum-data-size": "Sumaryczny rozmiar plików pakietu OTA", + "maximum-ota-package-sum-data-size-required": "Sumaryczny rozmiar plików pakietu OTA jest wymagany.", + "maximum-ota-package-sum-data-size-range": "Suma plików pakietu OTA nie może być ujemna", + "rest-requests-for-tenant": "Żądania REST dla Tenanta", + "transport-tenant-telemetry-msg-rate-limit": "Komunikaty telemetryczne Tenanta transportu", + "transport-tenant-telemetry-data-points-rate-limit": "Punkty danych telemetrycznych tenanta transportu", + "transport-device-msg-rate-limit": "Wiadomości z urządzenia transportowego", + "transport-device-telemetry-msg-rate-limit": "Komunikaty telemetryczne urządzenia transportowego", + "transport-device-telemetry-data-points-rate-limit": "Punkty danych telemetrycznych urządzenia transportowego", + "tenant-entity-export-rate-limit": "Tworzenie wersji obiektów", + "tenant-entity-import-rate-limit": "Ładowanie wersji obiektów", + "tenant-notification-request-rate-limit": "Żądania powiadomień", + "tenant-notification-requests-per-rule-rate-limit": "Żądania powiadomień według reguły powiadomień", + "integration-msgs-per-tenant-rate-limit": "Tenant integration messages", + "integration-msgs-per-device-rate-limit": "Device integration messages", + "max-transport-messages": "Maksymalna liczba komunikatów transportowych", + "max-transport-messages-required": "Maksymalna liczba komunikatów transportowych jest wymagana.", + "max-transport-messages-range": "Maksymalna liczba komunikatów transportowych nie może być ujemna", + "max-transport-data-points": "Maksymalna liczba punktów danych dotyczących transportu ", + "max-transport-data-points-required": "Maksymalna liczba punktów danych dotyczących transportu jest wymagana.", + "max-transport-data-points-range": "Maksymalna liczba punktów danych dotyczących transportu nie może być ujemna", + "max-r-e-executions": "Maksymalna liczba wykonań silnika reguły", + "max-r-e-executions-required": "Maksymalna liczba wykonań mechanizmu reguły jest wymagana.", + "max-r-e-executions-range": "Maksymalna liczba wykonań mechanizmu reguł nie może być ujemna", + "max-j-s-executions": "Maksymalna liczba wykonań JavaScript ", + "max-j-s-executions-required": "Maksymalna liczba wykonań JavaScript jest wymagana.", + "max-j-s-executions-range": "Maksymalna liczba wykonań JavaScript nie może być ujemna", + "max-d-p-storage-days": "Maksymalna liczba dni przechowywania punktów danych", + "max-d-p-storage-days-required": "Maksymalna liczba dni przechowywania punktów danych jest wymagana.", + "max-d-p-storage-days-range": "Maksymalna liczba dni przechowywania punktów danych nie może być ujemna", + "default-storage-ttl-days": "Domyślnie dni TTL przechowywania", + "default-storage-ttl-days-required": "Domyślnie wymagane są dni TTL przechowywania.", + "default-storage-ttl-days-range": "Domyślnie dni TTL magazynu nie mogą być ujemne", + "alarms-ttl-days": "Alarmy TTL dni", + "alarms-ttl-days-required": "Wymagane dni TTL alarmów", + "alarms-ttl-days-days-range": "Dni alarmów TTL nie mogą być ujemne", + "rpc-ttl-days": "Dni RPC TTL", + "rpc-ttl-days-required": "Wymagane dni RPC TTL", + "rpc-ttl-days-days-range": "Dni RPC TTL nie mogą być ujemne", + "max-rule-node-executions-per-message": "Maksymalna liczba wykonań węzła reguły na wiadomość", + "max-rule-node-executions-per-message-required": "Maksymalna liczba wykonań węzła MRule na komunikat jest wymagana.", + "max-rule-node-executions-per-message-range": "Maksymalna liczba wykonań węzła reguły na komunikat nie może być ujemna", + "max-emails": "Maksymalna liczba wysłanych e-maili", + "max-emails-required": "Maksymalna liczba wysłanych e-maili jest wymagana.", + "max-emails-range": "Maksymalna liczba wysłanych e-maili nie może być ujemna", + "sms-enabled": "SMS enabled", + "max-sms": "Maksymalna liczba wysłanych SMS-ów", + "max-sms-required": "Maksymalna liczba wysłanych SMS-ów jest wymagana.", + "max-sms-range": "Maksymalna liczba wysłanych SMS-ów nie może być ujemna", + "max-created-alarms": "Alarmy utworzyły maksymalną liczbę", + "max-created-alarms-required": "Maksymalna liczba utworzonych alarmów jest wymagana.", + "max-created-alarms-range": "Maksymalna liczba utworzonych alarmów będzie ujemna", + "no-queue": "Nie skonfigurowano kolejki", + "add-queue": "Dodaj kolejkę", + "queues-with-count": "Kolejki ({{count}})", + "tenant-rest-limits": "Żądania REST dla Tenanta", + "customer-rest-limits": "Żądania REST dla klienta", + "incorrect-pattern-for-rate-limits": "Format to oddzielane przecinkami pary pojemności i kropki (w sekundach) z dwukropkiem pomiędzy np. ", + "too-small-value-zero": "Wartość musi być większa niż 0", + "too-small-value-one": "Wartość musi być większa niż 1", + "queue-size-is-limited-by-system-configuration": "Rozmiar kolejki jest również ograniczony konfiguracją systemu.", + "cassandra-tenant-limits-configuration": "Zapytanie Cassandry o Tenanta", + "ws-limit-max-sessions-per-tenant": "Maksymalna liczba sesji na Tenanta", + "ws-limit-max-sessions-per-customer": "Maksymalna liczba sesji na klienta", + "ws-limit-max-sessions-per-regular-user": "Maksymalna liczba sesji na zwykłego użytkownika", + "ws-limit-max-sessions-per-public-user": "Maksymalna liczba sesji na użytkownika publicznego", + "ws-limit-queue-per-session": "Maksymalny rozmiar kolejki komunikatów na sesję", + "ws-limit-max-subscriptions-per-tenant": "Maksymalna liczba subskrypcji na Tenanta", + "ws-limit-max-subscriptions-per-customer": "Maksymalna liczba subskrypcji na klienta", + "ws-limit-max-subscriptions-per-regular-user": "Maksymalna liczba subskrypcji na zwykłego użytkownika", + "ws-limit-max-subscriptions-per-public-user": "Maksymalna liczba subskrypcji na użytkownika publicznego", + "ws-limit-updates-per-session": "Aktualizacje WS na sesję", + "rate-limits": { + "add-limit": "Dodaj limit", + "advanced-settings": "Zaawansowane ustawienia", + "edit-limit": "Edytuj limit", + "but-less-than": "ale mniej niż", + "edit-transport-tenant-msg-title": "Edytuj limity szybkości wiadomości tenanta transportu", + "edit-transport-tenant-telemetry-msg-title": "Edytuj limity szybkości komunikatów telemetrycznych Tenanta transportu", + "edit-transport-tenant-telemetry-data-points-title": "Edytuj limity szybkości punktów danych telemetrycznych Tenanta transportu", + "edit-transport-device-msg-title": "Edytuj limity szybkości komunikatów urządzeń transportowych", + "edit-transport-device-telemetry-msg-title": "Edytuj limity szybkości komunikatów telemetrycznych urządzeń transportowych", + "edit-transport-device-telemetry-data-points-title": "Edytuj limity szybkości punktów danych telemetrycznych urządzeń transportowych", + "edit-tenant-rest-limits-title": "Edytuj żądania REST dotyczące limitów stawek Tenanta", + "edit-customer-rest-limits-title": "Edytuj żądania REST dotyczące limitów stawek klienta", + "edit-ws-limit-updates-per-session-title": "Edytuj limity szybkości aktualizacji WS na sesję", + "edit-cassandra-tenant-limits-configuration-title": "Edytuj zapytanie Cassandry dotyczące limitów stawek tenanta", + "edit-tenant-entity-export-rate-limit-title": "Edytuj limity szybkości tworzenia wersji obiektu", + "edit-tenant-entity-import-rate-limit-title": "Edytuj limity szybkości ładowania wersji obiektu", + "edit-tenant-notification-request-rate-limit-title": "Edytuj limity żądań powiadomień", + "edit-tenant-notification-requests-per-rule-rate-limit-title": "Edytuj żądania powiadomień według limitów częstotliwości reguł powiadomień", + "edit-integration-msgs-per-tenant-rate-limit-title": "Edit integration messages per tenant rate limits", + "edit-integration-msgs-per-device-rate-limit-title": "Edit integration messages per device rate limits", + "messages-per": "wiadomości na", + "not-set": "Nie ustawiony", + "number-of-messages": "Liczba wiadomości", + "number-of-messages-required": "Liczba wiadomości jest wymagana.", + "number-of-messages-min": "Minimalna wartość to 1.", + "preview": "Zapowiedź", + "per-seconds": "Na sekundę", + "per-seconds-required": "Tempo jest wymagane.", + "per-seconds-min": "Minimalna wartość to 1.", + "rate-limits": "Limity", + "remove-limit": "Usuń limit", + "transport-tenant-msg": "Wiadomości tenanta transportu", + "transport-tenant-telemetry-msg": "Komunikaty telemetryczne Tenanta transportu", + "transport-tenant-telemetry-data-points": "Punkty danych telemetrycznych tenanta transportu", + "transport-device-msg": "Wiadomości z urządzenia transportowego", + "transport-device-telemetry-msg": "Komunikaty telemetryczne urządzenia transportowego", + "transport-device-telemetry-data-points": "Punkty danych telemetrycznych urządzenia transportowego", + "sec": "sek" + } + }, + "timeinterval": { + "seconds-interval": "{ seconds, plural, =1 {1 sekunda} other {# sekund(y)} }", + "minutes-interval": "{ minutes, plural, =1 {1 minuta} other {# minut(y)} }", + "hours-interval": "{ hours, plural, =1 {1 godzina} other {# godzin(y)} }", + "days-interval": "{ days, plural, =1 {1 dzień} other {# dni} }", + "days": "Dni", + "hours": "Godziny", + "minutes": "Minuty", + "seconds": "Sekundy", + "advanced": "Zaawansowane", + "predefined": { + "yesterday": "Wczoraj", + "day-before-yesterday": "Przedwczoraj", + "this-day-last-week": "Ten dzień w zeszłym tygodniu", + "previous-week": "Poprzedni tydzień (niedziela - sobota)", + "previous-week-iso": "Poprzedni tydzień (poniedziałek - niedziela)", + "previous-month": "Poprzedni miesiac", + "previous-quarter": "Poprzedni kwartał", + "previous-half-year": "Poprzednie półrocze", + "previous-year": "Poprzedni rok", + "current-hour": "Aktualna godzina", + "current-day": "Bieżący dzień", + "current-day-so-far": "Do tej pory bieżący dzień", + "current-week": "Bieżący tydzień (niedziela - sobota)", + "current-week-iso": "Bieżący tydzień (poniedziałek - niedziela)", + "current-week-so-far": "Dotychczasowy tydzień (niedziela - sobota)", + "current-week-iso-so-far": "Dotychczasowy tydzień (poniedziałek - niedziela)", + "current-month": "Obecny miesiąc", + "current-month-so-far": "Do tej pory bieżący miesiąc", + "current-quarter": "Bieżący kwartał", + "current-quarter-so-far": "Do tej pory bieżący kwartał", + "current-half-year": "Bieżące półrocze", + "current-half-year-so-far": "Dotychczasowe półrocze", + "current-year": "Rok bieżący", + "current-year-so-far": "Do tej pory bieżący rok" + } + }, + "timeunit": { + "milliseconds": "Milisekundy", + "seconds": "Sekundy", + "minutes": "Minuty", + "hours": "Godziny", + "days": "Dni" + }, + "timewindow": { + "timewindow": "Timewindow", + "years": "{ years, plural, =1 { rok } other {# lat(a) } }", + "years-short": "{{ years }}y", + "months": "{ months, plural, =1 { miesiąc } other {# miesięcy } }", + "months-short": "{{ months }}M", + "weeks": "{ weeks, plural, =1 { tydzień } other {# tygodni(e) } }", + "weeks-short": "{{ weeks }}w", + "days": "{ days, plural, =1 { dzień } other {# dni } }", + "days-short": "{{ days }}d", + "hours": "{ hours, plural, =0 { 0 godzin } =1 {1 godzina } other {# godzin(y) } }", + "hr": "{{ hr }} godz", + "hr-short": "{{ hr }}h", + "minutes": "{ minutes, plural, =0 { 0 minut } =1 {1 minuta } other {# minut(y) } }", + "min": "{{ min }} min", + "min-short": "{{ min }}m", + "seconds": "{ seconds, plural, =0 { 0 sekund } =1 {1 sekunda } other {# sekund(y) } }", + "sec": "{{ sec }} sek", + "sec-short": "{{ sec }}s", + "short": { + "days": "{ days, plural, =1 { dzień } other {# dni } }", + "hours": "{ hours, plural, =1 {1 godzina } other {# godzin(y) } }", + "minutes": "{{minutes}} min ", + "seconds": "{{seconds}} sek " }, - "realtime":"Na żywo", - "history":"Historia", - "last-prefix":"ostatni", - "period":"od {{ startTime }} do {{ endTime }}", - "edit":"Edytuj okno czasowe", - "date-range":"Zakres dat", - "for-all-time":"Dla wszystkich dostępnych danych", - "last":"Ostatnie", - "time-period":"Okres czasu", - "hide":"Ukryj", - "interval":"Interwał", - "just-now":"Teraz", - "just-now-lower":"teraz", - "ago":"temu", - "style":"Styl okna czasowego", - "icon":"Ikona", - "icon-position":"Pozycja ikony", - "icon-position-left":"Lewo", - "icon-position-right":"Prawo", - "font":"Czcionka", - "color":"Kolor", - "displayTypePrefix":"Wyświetlaj przedrostek Na żywo/Historia", - "preview":"Podgląd" + "realtime": "Czas rzeczywisty", + "history": "Historia", + "last-prefix": "ostatni", + "period": "Od {{ startTime }} Do {{ endTime }}", + "edit": "Edytuj okno czasowe", + "date-range": "Zakres dat", + "for-all-time": "Cały dotychczasowy okres", + "last": "Ostatni(e)", + "time-period": "Okres czasu", + "hide": "Ukrywać", + "interval": "Interwał", + "just-now": "W tej chwili", + "just-now-lower": "just now", + "ago": "temu", + "style": "Timewindow style", + "icon": "Icon", + "icon-position": "Icon position", + "icon-position-left": "Left", + "icon-position-right": "Right", + "font": "Font", + "color": "Color", + "displayTypePrefix": "Display Realtime/History prefix", + "preview": "Preview" }, - "tooltip":{ - "value":"Wartość", - "date":"Data", - "background-color":"Kolor tła", - "background-blur":"Rozmycie tła" + "unit": { + "millimeter": "Millimeter", + "centimeter": "Centimeter", + "angstrom": "Angstrom", + "nanometer": "Nanometer", + "micrometer": "Micrometer", + "meter": "Meter", + "kilometer": "Kilometer", + "inch": "Inch", + "foot": "Foot", + "yard": "Yard", + "mile": "Mile", + "nautical-mile": "Nautical Mile", + "astronomical-unit": "Astronomical Unit", + "reciprocal-metre": "Reciprocal Metre", + "meter-per-meter": "Meter per meter", + "steradian": "Steradian", + "thou": "Thou", + "barleycorn": "Barleycorn", + "hand": "Hand", + "chain": "Chain", + "furlong": "Furlong", + "league": "League", + "fathom": "Fathom", + "cable": "Cable", + "link": "Link", + "rod": "Rod", + "nanogram": "Nanogram", + "microgram": "Microgram", + "milligram": "Milligram", + "gram": "Gram", + "kilogram": "Kilogram", + "tonne": "Tonne", + "ounce": "Ounce", + "pound": "Pound", + "stone": "Stone", + "hundredweight-count": "Hundredweight count", + "short-tons": "Short tons", + "dalton": "Dalton", + "grain": "Grain", + "drachm": "Drachm", + "quarter": "Quarter", + "slug": "Slug", + "carat": "Carat", + "cubic-millimeter": "Cubic Millimeter", + "cubic-centimeter": "Cubic Centimeter", + "cubic-meter": "Cubic Meter/s", + "cubic-kilometer": "Cubic Kilometers", + "microliter": "Microliter", + "milliliter": "Milliliter", + "liter": "Liter", + "hectoliter": "Hectolitre", + "cubic-inch": "Cubic Inch", + "cubic-foot": "Cubic Foot", + "cubic-yard": "Cubic Yards", + "fluid-ounce": "Fluid Ounce", + "pint": "Pint", + "quart": "Quart", + "gallon": "Gallon", + "oil-barrels": "Oil Barrels", + "cubic-meter-per-kilogram": "Cubic Meter per Kilogram", + "gill": "Gill", + "hogshead": "Hogshead", + "teaspoon": "Teaspoon", + "tablespoon": "Tablespoon", + "cup": "Cup", + "celsius": "Celsius", + "kelvin": "Kelvin", + "rankine": "Rankine", + "fahrenheit": "Fahrenheit", + "percent": "Percent", + "meter-per-second": "Meter per Second", + "kilometer-per-hour": "Kilometer per Hour", + "foot-per-second": "Foot per Second", + "mile-per-hour": "Mile per Hour", + "knot": "Knot", + "millimeters-per-minute": "Millimeters per minute", + "kilometer-per-hour-squared": "Kilometer per hour squared", + "foot-per-second-squared": "Foot per second squared", + "pascal": "Pascal", + "kilopascal": "Kilopascal", + "megapascal": "Megapascal", + "gigapascal": "Gigapascal", + "millibar": "Millibar", + "bar": "Bar", + "kilobar": "Kilobar", + "newton": "Newton", + "newton-meter": "Newton meter", + "foot-pounds": "Foot-pounds", + "inch-pounds": "Inch-pounds", + "newton-per-meter": "Newton per meter", + "atmospheres": "Atmospheres", + "pounds-per-square-inch": "Pounds per Square Inch", + "torr": "Torr", + "inches-of-mercury": "Inches of Mercury", + "pascal-per-square-meter": "Pascal per Square Meter", + "pound-per-square-inch": "Pound per Square Inch", + "newton-per-square-meter": "Newton per Square Meter", + "kilogram-force-per-square-meter": "Kilogram-force per Square Meter", + "pascal-per-square-centimeter": "Pascal per Square Centimeter", + "ton-force-per-square-inch": "Ton-force per Square Inch", + "kilonewton-per-square-meter": "Kilonewton per Square Meter", + "newton-per-square-millimeter": "Newton per Square Millimeter", + "microjoule": "Microjoule", + "millijoule": "Millijoule", + "joule": "Joule", + "kilojoule": "Kilojoule", + "megajoule": "Megajoule", + "gigajoule": "Gigajoule", + "watt-hour": "Watt-hour", + "kilowatt-hour": "Kilowatt-hour", + "electron-volts": "Electron volts", + "joules-per-coulomb": "Joules per Coulomb", + "british-thermal-unit": "British Thermal Units", + "foot-pound": "Foot-pound", + "calorie": "Calorie", + "small-calorie": "Small Calorie", + "kilocalorie": "Kilocalorie", + "joule-per-kelvin": "Joule per Kelvin", + "joule-per-kilogram-kelvin": "Joule per Kilogram-Kelvin", + "joule-per-kilogram": "Joule per Kilogram", + "watt-per-meter-kelvin": "Watt per Meter-Kelvin", + "joule-per-cubic-meter": "Joule per Cubic Meter", + "therm": "Therm", + "electric-dipole-moment": "Electric Dipole Moment", + "magnetic-dipole-moment": "Magnetic Dipole Moment", + "debye": "Debye", + "coulomb-per-square-meter-per-volt": "Coulomb per Square Meter per Volt", + "milliwatt": "Milliwatt", + "microwatt": "Microwatt", + "watt": "Watt", + "kilowatt": "Kilowatt", + "megawatt": "Megawatt", + "gigawatt": "Gigawatt", + "metric-horsepower": "Metric Horsepower", + "milliwatt-per-square-centimeter": "Milliwatts per square centimeter", + "watt-per-square-centimeter": "Watts per square centimeter", + "kilowatt-per-square-centimeter": "Kilowatts per square centimeter", + "milliwatt-per-square-meter": "Milliwatts per square meter", + "watt-per-square-meter": "Watts per square meter", + "kilowatt-per-square-meter": "Kilowatts per square meter", + "watt-per-square-inch": "Watts per square inch", + "kilowatt-per-square-inch": "Kilowatts per square inch", + "horsepower": "Horsepower", + "btu-per-hour": "British thermal units/hour", + "coulomb": "Coulomb", + "millicoulomb": "Millicoulombs", + "microcoulomb": "Microcoulomb", + "picocoulomb": "Picocoulomb", + "coulomb-per-meter": "Coulomb per meter", + "coulomb-per-cubic-meter": "Coulomb per Cubic Meter", + "coulomb-per-square-meter": "Coulomb per Square Meter", + "square-millimeter": "Square Millimeter", + "square-centimeter": "Square Centimeter", + "square-meter": "Square Meter", + "hectare": "Hectare", + "square-kilometer": "Square Kilometer", + "square-inch": "Square Inch", + "square-foot": "Square Foot", + "square-yard": "Square Yard", + "acre": "Acre", + "square-mile": "Square Mile", + "are": "Are", + "barn": "Barn", + "circular-inch": "Circular Inch", + "milliampere-hour": "Milliampere-hour", + "milliampere-hour-tags": "electric current, current flow, electric charge, current capacity, flow of electricity, electrical flow, milliampere-hour, milliampere-hours, mAh", + "ampere-hours": "Ampere-hours", + "ampere-hours-tags": "electric current, current flow, electric charge, current capacity, flow of electricity, electrical flow, ampere, ampere-hours, Ah", + "kiloampere-hours": "Kiloampere-hours", + "kiloampere-hours-tags": "electric current, current flow, electric charge, current capacity, flow of electricity, electrical flow, kiloampere-hours, kiloampere-hour, kAh", + "nanoampere": "Nanoampere", + "nanoampere-tags": "current, amperes, nanoampere, nA", + "picoampere": "Picoampere", + "picoampere-tags": "current, amperes, picoampere, pA", + "microampere": "Microampere", + "microampere-tags": "electric current, microampere, microamperes, μA", + "milliampere": "Milliampere", + "milliampere-tags": "electric current, milliampere, milliamperes, mA", + "ampere": "Ampere", + "ampere-tags": "electric current, current flow, flow of electricity, electrical flow, ampere, amperes, amperage, A", + "kiloamperes": "Kiloamperes", + "kiloamperes-tags": "electric current, current flow, kiloamperes, kA", + "microampere-per-square-centimeter": "Microampere per square centimeter", + "microampere-per-square-centimeter-tags": "Current density, microampere per square centimeter, µA/cm²", + "ampere-per-square-meter": "Ampere per Square Meter", + "ampere-per-square-meter-tags": "current density, current per unit area, ampere per square meter, A/m²", + "ampere-per-meter": "Ampere per Meter", + "ampere-per-meter-tags": "magnetic field strength, magnetic field intensity, ampere per meter, A/m", + "oersted": "Oersted", + "oersted-tags": "magnetic field, oersted, Oe", + "bohr-magneton": "Bohr Magneton", + "bohr-magneton-tags": "atomic physics, magnetic moment, bohr magneton, μB", + "ampere-meter-squared": "Ampere-Meter Squared", + "ampere-meter-squared-tags": "magnetic moment, dipole moment, ampere-meter squared, A·m²", + "ampere-meter": "Ampere-Meter", + "ampere-meter-tags": "magnetic field, current loop, ampere-meter, A·m", + "nanovolt": "Nanovolt", + "picovolt": "Picovolt", + "millivolts": "Millivolts", + "microvolts": "Microvolts", + "volt": "Volt", + "kilovolts": "Kilovolts", + "dbmV": "dBmV", + "volt-meter": "Volt-Meter", + "kilovolt-meter": "Kilovolt-Meter", + "megavolt-meter": "Megavolt-Meter", + "microvolt-meter": "Microvolt-Meter", + "millivolt-meter": "Millivolt-Meter", + "nanovolt-meter": "Nanovolt-Meter", + "ohm": "Ohm", + "microohm": "Microohm", + "milliohm": "Milliohm", + "kilohm": "Kilohm", + "megohm": "Megohm", + "gigohm": "Gigohm", + "hertz": "Hertz", + "kilohertz": "Kilohertz", + "megahertz": "Megahertz", + "gigahertz": "Gigahertz", + "rpm": "Revolutions Per Minute", + "candela-per-square-meter": "Candela per square meter", + "candela": "Candela", + "lumen": "Lumen", + "lux": "Lux", + "foot-candle": "Foot-candle", + "lumen-per-square-meter": "Lumen per square meter", + "lux-second": "Lux second", + "lumen-second": "Lumen second", + "lumens-per-watt": "Lumens per watt", + "absorbance": "Absorbance", + "mole": "Mole", + "nanomole": "Nanomole", + "micromole": "MicroMole", + "millimole": "Millimole", + "kilomole": "Kilomole", + "mole-per-cubic-meter": "Mole per Cubic Meter", + "rssi": "RSSI", + "ppm": "Parts Per Million", + "ppb": "Parts Per Billion", + "micrograms-per-cubic-meter": "Micrograms per Cubic Meter", + "aqi": "AQI", + "gram-per-cubic-meter": "Gram per cubic meter", + "gram-per-kilogram": "Specific Humidity", + "millimeters-per-second": "Millimeters per second", + "neper": "Neper", + "bel": "Bel", + "decibel": "Decibel", + "meters-per-second-squared": "Meters per second squared", + "becquerel": "Becquerel", + "curie": "Curie", + "gray": "Gray", + "sievert": "Sievert", + "roentgen": "Roentgen", + "cps": "Counts per Second", + "rad": "Rad", + "rem": "Rem", + "dps": "Disintegrations per second", + "rutherford": "Rutherford", + "coulombs-per-kilogram": "Coulombs per kilogram", + "becquerels-per-cubic-meter": "Becquerels per cubic meter", + "curies-per-liter": "Curies per liter", + "becquerels-per-second": "Becquerels per second", + "curies-per-second": "Curies per second", + "gy-per-second": "Gray per Second", + "watt-per-steradian": "Watt per Steradian", + "watt-per-square-metre-steradian": "Watt per Square Metre-Steradian", + "ph-level": "pH Level", + "turbidity": "Turbidity", + "mg-per-liter": "Milligrams per liter", + "microsiemens-per-centimeter": "Microsiemens per centimeter", + "millisiemens-per-meter": "Millisiemens per meter", + "siemens-per-meter": "Siemens per meter", + "kilogram-per-cubic-meter": "Kilogram per cubic meter", + "gram-per-cubic-centimeter": "Gram per cubic centimeter", + "kilogram-per-square-meter": "Kilogram per square metre", + "milligram-per-milliliter": "Milligram per milliliter", + "pound-per-cubic-foot": "Pound per cubic foot", + "ounces-per-cubic-inch": "Ounces per cubic inch", + "tons-per-cubic-yard": "Tons per cubic yard", + "particle-density": "Particle density", + "kilometers-per-liter": "Kilometers per liter", + "miles-per-gallon": "Miles per gallon", + "liters-per-100-km": "Liters per 100 km", + "gallons-per-mile": "Gallons per mile", + "liters-per-hour": "Liters per hour", + "gallons-per-hour": "Gallons per hour", + "beats-per-minute": "Beats per minute", + "millimeters-of-mercury": "Millimeters of mercury", + "milligrams-per-deciliter": "Milligrams per deciliter", + "g-force": "G-force", + "kilonewton": "Kilonewton", + "kilogram-force": "Kilogram-Force", + "pound-force": "Pound-Force", + "kilopound-force": "Kilopound-Force", + "dyne": "Dyne", + "poundal": "Poundal", + "kip": "Kip", + "gal": "Gal", + "gravity": "Gravity", + "hectopascal": "Hectopascal", + "atmosphere": "Atmosphere", + "millibars": "Millibars", + "inch-of-mercury": "One inch of mercury", + "richter-scale": "Richter Scale", + "second": "Second", + "minute": "Minute", + "hour": "Hour", + "day": "Day", + "week": "Week", + "month": "Month", + "year": "Year", + "cubic-foot-per-minute": "Cubic Foot Per Minute", + "cubic-meters-per-hour": "Cubic Meters Per Hour", + "cubic-meters-per-second": "Cubic Meters Per Second", + "liter-per-second": "Liter Per Second", + "liter-per-minute": "Liter Per Minute", + "gallons-per-minute": "Gallons Per Minute", + "cubic-foot-per-second": "Cubic foot per second", + "milliliters-per-minute": "Milliliters per minute", + "bit": "Bit", + "byte": "Byte", + "kilobyte": "Kilobyte", + "megabyte": "Megabyte", + "gigabyte": "Gigabyte", + "terabyte": "Terabyte", + "petabyte": "Petabyte", + "exabyte": "Exabyte", + "zettabyte": "Zettabyte", + "yottabyte": "Yottabyte", + "bit-per-second": "Bit per second", + "kilobit-per-second": "Kilobit per second", + "megabit-per-second": "Megabit per second", + "gigabit-per-second": "Gigabit per second", + "terabit-per-second": "Terabit per second", + "byte-per-second": "Byte per second", + "kilobyte-per-second": "Kilobyte per second", + "megabyte-per-second": "Megabyte per second", + "gigabyte-per-second": "Gigabyte per second", + "degree": "Degree", + "radian": "Radian", + "gradian": "Gradian", + "mil": "Mil", + "revolution": "Revolution", + "siemens": "Siemens", + "millisiemens": "Millisiemens", + "microsiemens": "Microsiemens", + "kilosiemens": "Kilosiemens", + "megasiemens": "Megasiemens", + "gigasiemens": "Gigasiemens", + "farad": "Farad", + "millifarad": "Millifarad", + "microfarad": "Microfarad", + "nanofarad": "Nanofarad", + "picofarad": "Picofarad", + "kilofarad": "Kilofarad", + "megafarad": "Megafarad", + "gigafarad": "Gigafarad", + "terfarad": "Terfarad", + "farad-per-meter": "Farad per Meter", + "tesla": "Tesla", + "gauss": "Gauss", + "kilogauss": "Kilogauss", + "millitesla": "Millitesla", + "microtesla": "Microtesla", + "nanotesla": "Nanotesla", + "kilotesla": "Kilotesla", + "megatesla": "Megatesla", + "millitesla-square-meters": "millitesla square meters", + "gamma": "Gamma", + "lambda": "Lambda", + "square-meter-per-second": "Square meter per second", + "square-centimeter-per-second": "Square centimeter per second", + "stoke": "Stoke", + "centistokes": "Centistokes", + "square-foot-per-second": "Square foot per second", + "square-inch-per-second": "Square inch per second", + "pascal-second": "Pascal-second", + "centipoise": "Centipoise", + "poise": "Poise", + "reynolds": "Reynolds", + "pound-per-foot-hour": "Pound per foot-hour", + "newton-second-per-square-meter": "Newton second per square meter", + "dyne-second-per-square-centimeter": "Dyne second per square centimeter", + "kilogram-per-meter-second": "Kilogram per meter-second", + "tesla-square-meters": "Tesla square meters", + "maxwell": "Maxwell", + "tesla-per-meter": "Tesla per Meter", + "gauss-per-centimeter": "Gauss per Centimeter", + "weber": "Weber", + "microweber": "Microweber", + "milliweber": "Milliweber", + "gauss-square-centimeter": "Gauss-Square Centimeter", + "kilogauss-square-centimeter": "Kilogauss-Square Centimeter", + "henry": "Henry", + "millihenry": "Millihenry", + "microhenry": "Microhenry", + "nanohenry": "Nanohenry", + "henry-per-meter": "Henry per Meter", + "tesla-meter-per-ampere": "Tesla Meter per Ampere", + "gauss-per-oersted": "Gauss per Oersted", + "kilogram-per-mole": "Kilogram per mole", + "gram-per-mole": "Gram per mole", + "milligram-per-mole": "Milligram per mole", + "joule-per-mole": "Joule per Mole", + "joule-per-mole-kelvin": "Joule per Mole-Kelvin", + "millivolts-per-meter": "Millivolts per meter", + "volts-per-meter": "Volts per meter", + "kilovolts-per-meter": "Kilovolts per meter", + "radian-per-second": "Radian per second", + "radian-per-second-squared": "Radian per second squared", + "revolutions-per-minute-per-second": "Angular acceleration", + "revolutions-per-minute-per-second-squared": "Angular Acceleration", + "deg-per-second": "deg/s", + "degrees-brix": "Degrees Brix", + "katal": "Katal", + "katal-per-cubic-metre": "Katal per Cubic Metre" }, - "unit":{ - "millimeter":"Milimetr", - "centimeter":"Centymetr", - "angstrom":"Angstrom", - "nanometer":"Nanometr", - "micrometer":"Mikrometr", - "meter":"Metr", - "kilometer":"Kilometr", - "inch":"Cal", - "foot":"Stopa", - "yard":"Jard", - "mile":"Mila", - "nautical-mile":"Mila morska", - "astronomical-unit":"Jednostka astronomiczna", - "reciprocal-metre":"Odwrócony metr", - "meter-per-meter":"Metr na metr", - "steradian":"Steradian", - "thou":"Thou", - "barleycorn":"Jęczmień", - "hand":"Dłoń", - "chain":"Ciąg", - "furlong":"Furlong", - "league":"Liga", - "fathom":"Fathom", - "cable":"Kabel", - "link":"Link", - "rod":"Ród", - "nanogram":"Nanogram", - "microgram":"Mikrogram", - "milligram":"Miligram", - "gram":"Gram", - "kilogram":"Kilogram", - "tonne":"Tonna", - "ounce":"Uncja", - "pound":"Funt", - "stone":"Stoun", - "hundredweight-count":"Cental", - "short-tons":"Krótka tona", - "dalton":"Dalton", - "grain":"Gran", - "drachm":"Drachma", - "quarter":"Quarter", - "slug":"Slug", - "carat":"Karad", - "cubic-millimeter":"Milimetr sześcienny", - "cubic-centimeter":"Centymetr sześcienny", - "cubic-meter":"Metr sześcienny", - "cubic-kilometer":"Kilometr sześcienny", - "microliter":"Mikrolitr", - "milliliter":"Mililitr", - "liter":"Litr", - "hectoliter":"Hektolitr", - "cubic-inch":"Cal sześcienny", - "cubic-foot":"Stopa sześcienna", - "cubic-yard":"Jard sześcienny", - "fluid-ounce":"Uncja płynu", - "pint":"Pinta", - "quart":"Kwarta", - "gallon":"Galona", - "oil-barrels":"Baryłki naftowe", - "cubic-meter-per-kilogram":"Metr sześcienny na kilogram", - "gill":"Gill", - "hogshead":"Hogshead", - "teaspoon":"Łyżeczka", - "tablespoon":"Łyżka stołowa", - "cup":"Kubek", - "celsius":"Stopnie Celsiusza", - "kelvin":"Kelwin", - "rankine":"Rankine", - "fahrenheit":"Stopnie Fahrenheita", - "percent":"Procent", - "meter-per-second":"Metr na sekundę", - "kilometer-per-hour":"Kilometr na godzinę", - "foot-per-second":"Stopa na sekundę", - "mile-per-hour":"Mila na godzinę", - "knot":"Węzeł", - "millimeters-per-minute":"Milimetrów na minutę", - "kilometer-per-hour-squared":"Kilometr na godzinę do kwadratu", - "foot-per-second-squared":"Stopa na sekundę do kwadratu", - "pascal":"Pascal", - "kilopascal":"Kilopascal", - "megapascal":"Megapascal", - "gigapascal":"Gigapascal", - "millibar":"Milibar", - "bar":"Bar", - "kilobar":"Kilobar", - "newton":"Newton", - "newton-meter":"Newton-metr", - "foot-pounds":"Stopy funtów", - "inch-pounds":"Calowe funty", - "newton-per-meter":"Newton na metr", - "atmospheres":"Atmosfery", - "pounds-per-square-inch":"Funtów na cal kwadratowy", - "torr":"Torr", - "inches-of-mercury":"Cale rtęci", - "pascal-per-square-meter":"Pascal na metr kwadratowy", - "pound-per-square-inch":"Funt na cal kwadratowy", - "newton-per-square-meter":"Newton na metr kwadratowy", - "kilogram-force-per-square-meter":"Kilogram-siła na metr kwadratowy", - "pascal-per-square-centimeter":"Pascal na centymetr kwadratowy", - "ton-force-per-square-inch":"Ton-siła na cal kwadratowy", - "kilonewton-per-square-meter":"Kilonewton na metr kwadratowy", - "newton-per-square-millimeter":"Newton na milimetr kwadratowy", - "microjoule":"Mikrodżul", - "millijoule":"Milidżul", - "joule":"Dżul", - "kilojoule":"Kilodżul", - "megajoule":"Megadżul", - "gigajoule":"Gigadżul", - "watt-hour":"Watogodzina", - "kilowatt-hour":"Kilowatogodzina", - "electron-volts":"Elektronowolt", - "joules-per-coulomb":"Dżule na kulomb", - "british-thermal-unit":"Brytyjska jednostka ciepła", - "foot-pound":"Stopa-funt", - "calorie":"Kaloria", - "small-calorie":"Mała kaloria", - "kilocalorie":"Kilokaloria", - "joule-per-kelvin":"Dżul na kelwin", - "joule-per-kilogram-kelvin":"Dżul na kilogram-kelwin", - "joule-per-kilogram":"Dżul na kilogram", - "watt-per-meter-kelvin":"Wat na metr-kelwin", - "joule-per-cubic-meter":"Dżul na metr sześcienny", - "therm":"Term", - "electric-dipole-moment":"Moment dipolowy elektryczny", - "magnetic-dipole-moment":"Moment dipolowy magnetyczny", - "debye":"Debye", - "coulomb-per-square-meter-per-volt":"Kulomb na metr kwadratowy na wolt", - "milliwatt":"Miliwat", - "microwatt":"Mikrowat", - "watt":"Wat", - "kilowatt":"Kilowat", - "megawatt":"Megawat", - "gigawatt":"Gigawat", - "metric-horsepower":"Koń mechaniczny metryczny", - "milliwatt-per-square-centimeter":"Miliwaty na centymetr kwadratowy", - "watt-per-square-centimeter":"Waty na centymetr kwadratowy", - "kilowatt-per-square-centimeter":"Kilowat na centymetr kwadratowy", - "milliwatt-per-square-meter":"Miliwaty na metr kwadratowy", - "watt-per-square-meter":"Waty na metr kwadratowy", - "kilowatt-per-square-meter":"Kilowaty na metr kwadratowy", - "watt-per-square-inch":"Waty na cal kwadratowy", - "kilowatt-per-square-inch":"Kilowaty na cal kwadratowy", - "horsepower":"Koń mechaniczny", - "btu-per-hour":"Brytyjskie jednostki ciepła na godzinę", - "coulomb":"Kulomb", - "millicoulomb":"Milikulomb", - "microcoulomb":"Mikrokulomb", - "picocoulomb":"Pikokulomb", - "coulomb-per-meter":"Kulomb na metr", - "coulomb-per-cubic-meter":"Kulomb na metr sześcienny", - "coulomb-per-square-meter":"Kulomb na metr kwadratowy", - "square-millimeter":"Metr kwadratowy", - "square-centimeter":"Centymetr kwadratowy", - "square-meter":"Metr kwadratowy", - "hectare":"Hektar", - "square-kilometer":"Kilometr kwadratowy", - "square-inch":"Cal kwadratowy", - "square-foot":"Stopa kwadratowa", - "square-yard":"Jard kwadratowy", - "acre":"Akr", - "square-mile":"Mila kwadratowa", - "are":"Ar", - "barn":"Barn", - "circular-inch":"Cal okrągły", - "milliampere-hour":"Miliamperogodzina", - "milliampere-hour-tags":"prąd elektryczny, przepływ prądu, ładunek elektryczny, pojemność prądu, przepływ elektryczności, przepływ elektryczny, godzina miliamperowa, miliamperogodziny, mAh", - "ampere-hours":"Amperogodziny", - "ampere-hours-tags":"prąd elektryczny, przepływ prądu, ładunek elektryczny, pojemność prądu, przepływ elektryczności, przepływ elektryczny, amper, amperogodziny, Ah", - "kiloampere-hours":"Kiloamperogodziny", - "kiloampere-hours-tags":"prąd elektryczny, przepływ prądu, ładunek elektryczny, pojemność prądu, przepływ elektryczności, przepływ elektryczny, kiloamperogodziny, kiloamperogodzina, kAh", - "nanoampere":"Nanoamper", - "nanoampere-tags":"prąd, ampery, nanoamper, nA", - "picoampere":"Pikoamper", - "picoampere-tags":"prąd, ampery, pikoamper, pA", - "microampere":"Mikroamper", - "microampere-tags":"prąd elektryczny, mikroamper, mikroampery, μA", - "milliampere":"Miliamper", - "milliampere-tags":"prąd elektryczny, miliamper, miliampery, mA", - "ampere":"Amper", - "ampere-tags":"prąd elektryczny, przepływ prądu, przepływ elektryczności, przepływ elektryczny, amper, ampery, amperaż, A", - "kiloamperes":"Kiloampery", - "kiloamperes-tags":"prąd elektryczny, przepływ prądu, kiloampery, kA", - "microampere-per-square-centimeter":"Mikroamper na centymetr kwadratowy", - "microampere-per-square-centimeter-tags":"Gęstość prądu, mikroamper na centymetr kwadratowy, µA/cm²", - "ampere-per-square-meter":"Amper na metr kwadratowy", - "ampere-per-square-meter-tags":"gęstość prądu, prąd na jednostkę powierzchni, amper na metr kwadratowy, A/m²", - "ampere-per-meter":"Amper na metr", - "ampere-per-meter-tags":"siła pola magnetycznego, intensywność pola magnetycznego, amper na metr, A/m", - "oersted":"Oersted", - "oersted-tags":"pole magnetyczne, oersted, Oe", - "bohr-magneton":"Magnetony Bohra", - "bohr-magneton-tags":"fizyka atomowa, moment magnetyczny, magneton Bohra, μB", - "ampere-meter-squared":"Amper-Metr Kwadratowy", - "ampere-meter-squared-tags":"moment magnetyczny, moment dipolowy, amper-metr kwadratowy, A·m²", - "ampere-meter":"Amper-Metr", - "ampere-meter-tags":"pole magnetyczne, pętla prądowa, amper-metr, A·m", - "nanovolt":"Nanowolt", - "picovolt":"Pikowolt", - "millivolts":"Milivolty", - "microvolts":"Mikrowolty", - "volt":"Wolt", - "kilovolts":"Kilowolty", - "dbmV":"dBmV", - "dbm":"dBm", - "volt-meter":"Woltomierz", - "kilovolt-meter":"Kilowoltomierz", - "megavolt-meter":"Megawoltomierz", - "microvolt-meter":"Mikrowoltomierz", - "millivolt-meter":"Milivoltomierz", - "nanovolt-meter":"Nanowoltomierz", - "ohm":"Om", - "microohm":"Mikroom", - "milliohm":"Miloom", - "kilohm":"Kiloom", - "megohm":"Megaom", - "gigohm":"Gigaom", - "hertz":"Herz", - "kilohertz":"Kilohertz", - "megahertz":"Megahertz", - "gigahertz":"Gigahertz", - "rpm":"Obroty na minutę", - "candela-per-square-meter":"Kandela na metr kwadratowy", - "candela":"Kandela", - "lumen":"Lumen", - "lux":"Luks", - "foot-candle":"Stopa-świeca", - "lumen-per-square-meter":"Lumen na metr kwadratowy", - "lux-second":"Luks-sekunda", - "lumen-second":"Lumen-sekunda", - "lumens-per-watt":"Lumeny na wat", - "absorbance":"Absorpcja", - "mole":"Mol", - "nanomole":"Nanomol", - "micromole":"Mikromol", - "millimole":"Milimol", - "kilomole":"Kilomol", - "mole-per-cubic-meter":"Mol na metr sześcienny", - "rssi":"RSSI", - "ppm":"Części na milion", - "ppb":"Części na miliard", - "micrograms-per-cubic-meter":"Mikrogramy na metr sześcienny", - "aqi":"AQI", - "gram-per-cubic-meter":"Gram na metr sześcienny", - "gram-per-kilogram":"Wilgotność właściwa", - "millimeters-per-second":"Milimetry na sekundę", - "neper":"Neper", - "bel":"Bel", - "decibel":"Decybel", - "meters-per-second-squared":"Metry na sekundę kwadratową", - "becquerel":"Bekerel", - "curie":"Kiri", - "gray":"Graj", - "sievert":"Sivert", - "roentgen":"Rentgen", - "cps":"Zliczenia na sekundę", - "rad":"Rad", - "rem":"Rem", - "dps":"Rozpady na sekundę", - "rutherford":"Rutherford", - "coulombs-per-kilogram":"Kulomby na kilogram", - "becquerels-per-cubic-meter":"Bekerel na metr sześcienny", - "curies-per-liter":"Kiri na litr", - "becquerels-per-second":"Bekerel na sekundę", - "curies-per-second":"Kiri na sekundę", - "gy-per-second":"Graj na sekundę", - "watt-per-steradian":"Wat na steradian", - "watt-per-square-metre-steradian":"Wat na metr kwadratowy-steradian", - "ph-level":"Poziom pH", - "turbidity":"Mętność", - "mg-per-liter":"Miligramy na litr", - "microsiemens-per-centimeter":"Mikrosiemeny na centymetr", - "millisiemens-per-meter":"Milisiemeny na metr", - "siemens-per-meter":"Siemeny na metr", - "kilogram-per-cubic-meter":"Kilogram na metr sześcienny", - "gram-per-cubic-centimeter":"Gram na centymetr sześcienny", - "kilogram-per-square-meter":"Kilogram na metr kwadratowy", - "milligram-per-milliliter":"Miligram na mililitr", - "milligram-per-cubic-meter":"Miligram na metr sześcienny", - "pound-per-cubic-foot":"Funt na stopę sześcienną", - "ounces-per-cubic-inch":"Uncje na cal sześcienny", - "tons-per-cubic-yard":"Tony na jard sześcienny", - "particle-density":"Gęstość cząstek", - "kilometers-per-liter":"Kilometry na litr", - "miles-per-gallon":"Mile na galon", - "liters-per-100-km":"Litrów na 100 kilometrów", - "gallons-per-mile":"Galony na milę", - "liters-per-hour":"Litrów na godzinę", - "gallons-per-hour":"Galony na godzinę", - "beats-per-minute":"Uderzenia na minutę", - "millimeters-of-mercury":"Milimetry słupa rtęci", - "milligrams-per-deciliter":"Miligramy na decylitr", - "g-force":"Siła G", - "kilonewton":"Kiloniuton", - "kilogram-force":"Kilogram-siła", - "pound-force":"Funt-siła", - "kilopound-force":"Kilofunt-siła", - "dyne":"Dyn", - "poundal":"Poundal", - "kip":"Kip", - "gal":"Gal", - "gravity":"Przyspieszenie grawitacyjne", - "hectopascal":"Hektopaskal", - "atmosphere":"Atmosfera", - "millibars":"Milibary", - "inch-of-mercury":"Cal słupa rtęci", - "richter-scale":"Skala Richtera", - "second":"Sekunda", - "minute":"Minuta", - "hour":"Godzina", - "day":"Dzień", - "week":"Tydzień", - "month":"Miesiąc", - "year":"Rok", - "cubic-foot-per-minute":"Stopy sześcienne na minutę", - "cubic-meters-per-hour":"Metry sześcienne na godzinę", - "cubic-meters-per-second":"Metry sześcienne na sekundę", - "liter-per-second":"Litr na sekundę", - "liter-per-minute":"Litr na minutę", - "gallons-per-minute":"Galony na minutę", - "cubic-foot-per-second":"Stopa sześcienna na sekundę", - "milliliters-per-minute":"Mililitrów na minutę", - "bit":"Bit", - "byte":"Bajt", - "kilobyte":"Kilobajt", - "megabyte":"Megabajt", - "gigabyte":"Gigabajt", - "terabyte":"Terabajt", - "petabyte":"Petabajt", - "exabyte":"Eksabajt", - "zettabyte":"Zettabajt", - "yottabyte":"Jottabajt", - "bit-per-second":"Bit na sekundę", - "kilobit-per-second":"Kilobit na sekundę", - "megabit-per-second":"Megabit na sekundę", - "gigabit-per-second":"Gigabit na sekundę", - "terabit-per-second":"Terabit na sekundę", - "byte-per-second":"Bajt na sekundę", - "kilobyte-per-second":"Kilobajt na sekundę", - "megabyte-per-second":"Megabajt na sekundę", - "gigabyte-per-second":"Gigabajt na sekundę", - "degree":"Stopień", - "radian":"Radian", - "gradian":"Grad", - "mil":"Mil", - "revolution":"Obrotów", - "siemens":"Siemens", - "millisiemens":"Milisiemens", - "microsiemens":"Mikrosiemens", - "kilosiemens":"Kilosiemens", - "megasiemens":"Megasiemens", - "gigasiemens":"Gigasiemens", - "farad":"Farad", - "millifarad":"Milifarad", - "microfarad":"Mikrofarad", - "nanofarad":"Nanofarad", - "picofarad":"Pikofarad", - "kilofarad":"Kilofarad", - "megafarad":"Megafarad", - "gigafarad":"Gigafarad", - "terfarad":"Terfarad", - "farad-per-meter":"Farad na metr", - "tesla":"Tesla", - "gauss":"Gaus", - "kilogauss":"Kilogaus", - "millitesla":"Millitesla", - "microtesla":"Mikrotesla", - "nanotesla":"Nanotesla", - "kilotesla":"Kilotesla", - "megatesla":"Megatesla", - "millitesla-square-meters":"Millitesla na metry kwadratowe", - "gamma":"Gamma", - "lambda":"Lambda", - "square-meter-per-second":"Metr kwadratowy na sekundę", - "square-centimeter-per-second":"Centymetr kwadratowy na sekundę", - "stoke":"Stoke", - "centistokes":"Centistoke", - "square-foot-per-second":"Stopa kwadratowa na sekundę", - "square-inch-per-second":"Cal kwadratowy na sekundę", - "pascal-second":"Paskal-sekunda", - "centipoise":"Centipoise", - "poise":"Poise", - "reynolds":"Reynolds", - "pound-per-foot-hour":"Funt na stopę kwadratową na godzinę", - "newton-second-per-square-meter":"Newton-sekunda na metr kwadratowy", - "dyne-second-per-square-centimeter":"Dyn-sekunda na centymetr kwadratowy", - "kilogram-per-meter-second":"Kilogram na metr-sekundę", - "tesla-square-meters":"Tesla na metry kwadratowe", - "maxwell":"Maxwell", - "tesla-per-meter":"Tesla na metr", - "gauss-per-centimeter":"Gaus na centymetr", - "weber":"Weber", - "microweber":"Mikroweber", - "milliweber":"Milliweber", - "gauss-square-centimeter":"Gaus na centymetr kwadratowy", - "kilogauss-square-centimeter":"Kilogaus na centymetr kwadratowy", - "henry":"Henry", - "millihenry":"Millihenry", - "microhenry":"Mikrohenry", - "nanohenry":"Nanohenry", - "henry-per-meter":"Henry na metr", - "tesla-meter-per-ampere":"Tesla na metr na amper", - "gauss-per-oersted":"Gaus na Oersted", - "kilogram-per-mole":"Kilogram na mol", - "gram-per-mole":"Gram na mol", - "milligram-per-mole":"Miligram na mol", - "joule-per-mole":"Dżul na mol", - "joule-per-mole-kelvin":"Dżul na mol-kelwin", - "millivolts-per-meter":"Milivolty na metr", - "volts-per-meter":"Volty na metr", - "kilovolts-per-meter":"Kilovolty na metr", - "radian-per-second":"Radian na sekundę", - "radian-per-second-squared":"Radian na sekundę kwadratową", - "revolutions-per-minute-per-second":"Przyspieszenie kątowe", - "revolutions-per-minute-per-second-squared":"Przyspieszenie kątowe", - "deg-per-second":"Stopnie na sekundę", - "degrees-brix":"Stopnie Brix", - "katal":"Katal", - "katal-per-cubic-metre":"Katal na metr sześcienny" + "user": { + "all": "Wszystko", + "all-users": "Wszyscy użytkownicy", + "groups": "Grupy", + "user": "Użytkownik", + "users": "Użytkownicy", + "management": "Zarządzanie użytkownikami", + "customer-users": "Użytkownicy Klienta", + "tenant-admins": "Administratorzy Tenantów", + "sys-admin": "Administrator systemu", + "tenant-admin": "Administrator Tenantów", + "customer": "Klient", + "anonymous": "Anonimowy", + "add": "Dodaj użytkownika", + "delete": "Usuń użytkownika", + "add-user-text": "Dodaj nowego użytkownika", + "no-users-text": "Nie znaleziono użytkowników", + "user-details": "Dane użytkownika", + "delete-users": "Usuń użytkowników", + "delete-user-title": "Czy na pewno chcesz usunąć użytkownika '{{userEmail}}'?", + "delete-user-text": "Bądź ostrożny, po potwierdzeniu użytkownika i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-users-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 użytkownika} other {# użytkowników} }?", + "delete-users-action-title": "Usuń { count, plural, =1 {1 użytkownika} other {# użytkowników} }?", + "delete-users-text": "Bądź ostrożny, po potwierdzeniu wszyscy wybrani użytkownicy zostaną usunięci, a wszystkie powiązane dane staną się niemożliwe do odzyskania.", + "activation-email-sent-message": "E-mail aktywacyjny został pomyślnie wysłany!", + "resend-activation": "Wyślij ponownie aktywację", + "email": "E-mail", + "email-required": "Email jest wymagany.", + "invalid-email-format": "Niewłaściwy format wiadomości email.", + "first-name": "Imię", + "last-name": "Nazwisko", + "description": "Opis", + "default-dashboard": "Domyślny panel", + "always-fullscreen": "Zawsze na pełnym ekranie", + "select-user": "Wybierz użytkownika", + "no-users-matching": "Brak użytkowników pasujących do '{{entity}}' zostały znalezione.", + "user-required": "Użytkownik jest wymagany", + "activation-method": "Metoda aktywacji", + "display-activation-link": "Wyświetl link aktywacyjny", + "send-activation-mail": "Wyślij e-mail aktywacyjny", + "activation-link": "Link aktywacyjny użytkownika", + "activation-link-text": "Aby aktywować użytkownika, użyj poniższych opcji link aktywacyjny :", + "copy-activation-link": "Skopiuj link aktywacyjny", + "activation-link-copied-message": "Link aktywacyjny użytkownika został skopiowany do schowka", + "details": "Szczegóły", + "login-as-tenant-admin": "Zaloguj się jako administrator tenanta", + "login-as-customer-user": "Zaloguj się jako użytkownik-klient", + "select-group-to-add": "Wybierz grupę docelową, aby dodać wybranych użytkowników", + "select-group-to-move": "Wybierz grupę docelową, aby przenieść wybranych użytkowników", + "remove-users-from-group": "Czy na pewno chcesz usunąć { count, plural, =1 {1 użytkownika} other {# użytkowników} } z grupy {{entityGroup}}'?", + "group": "Grupa użytkowników", + "list-of-groups": "{ count, plural, =1 {Lista zawierająca jednego użytkownika} other {Lista # użytkowników} }", + "group-name-starts-with": "Grupy użytkowników, których nazwy zaczynają się od '{{prefix}}'", + "search": "Wyszukaj użytkowników", + "selected-users": "Wybrano { count, plural, =1 {1 użytkownika} other {# użytkowników} }", + "disable-account": "Wyłącz konto użytkownika", + "enable-account": "Włącz konto użytkownika", + "enable-account-message": "Konto użytkownika zostało pomyślnie włączone!", + "disable-account-message": "Konto użytkownika zostało pomyślnie wyłączone!", + "copyId": "Skopiuj identyfikator użytkownika", + "idCopiedMessage": "Identyfikator użytkownika został skopiowany do schowka", + "user-list": "Lista użytkowników", + "user-list-required": "Lista użytkowników jest wymagana" }, - "user":{ - "user":"Użytkownik", - "users":"Użytkownicy", - "customer-users":"Użytkownicy klienta", - "tenant-admins":"Administratorzy najemcy", - "sys-admin":"Administrator systemu", - "tenant-admin":"Administrator najemcy", - "customer":"Klient", - "anonymous":"Anonimowy", - "add":"Dodaj użytkownika", - "delete":"Usuń użytkownika", - "add-user-text":"Dodaj nowego użytkownika", - "no-users-text":"Nie znaleziono użytkowników", - "user-details":"Szczegóły użytkownika", - "delete-user-title":"Czy na pewno chcesz usunąć użytkownika '{{userEmail}}'?", - "delete-user-text":"Uważaj, po potwierdzeniu użytkownik i wszystkie powiązane dane staną się nieodwracalne.", - "delete-users-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 użytkownika} other {# użytkowników} }?", - "delete-users-action-title":"Usuń { count, plural, =1 {1 użytkownika} other {# użytkowników} }", - "delete-users-text":"Uważaj, po potwierdzeniu wszyscy wybrani użytkownicy zostaną usunięci, a wszystkie powiązane dane staną się nieodwracalne.", - "activation-email-sent-message":"E-mail aktywacyjny został wysłany pomyślnie!", - "resend-activation":"Wyślij ponownie aktywację", - "email":"Email", - "email-required":"Email jest wymagany.", - "invalid-email-format":"Nieprawidłowy format email.", - "first-name":"Imię", - "last-name":"Nazwisko", - "description":"Opis", - "default-dashboard":"Domyślny pulpit", - "always-fullscreen":"Zawsze na pełnym ekranie", - "select-user":"Wybierz użytkownika", - "no-users-matching":"Nie znaleziono użytkowników pasujących do '{{entity}}'.", - "user-required":"Użytkownik jest wymagany", - "activation-method":"Metoda aktywacji", - "display-activation-link":"Wyświetl link aktywacyjny", - "send-activation-mail":"Wyślij mail aktywacyjny", - "activation-link":"Link aktywacyjny użytkownika", - "activation-link-text":"Aby aktywować użytkownika, użyj następującego linku aktywacyjnego:", - "copy-activation-link":"Kopiuj link aktywacyjny", - "activation-link-copied-message":"Link aktywacyjny użytkownika został skopiowany do schowka", - "details":"Szczegóły", - "login-as-tenant-admin":"Zaloguj jako Administrator Najemcy", - "login-as-customer-user":"Zaloguj jako Użytkownik Klienta", - "search":"Szukaj użytkowników", - "selected-users":"{ count, plural, =1 {1 użytkownik} other {# użytkowników} } wybrano", - "disable-account":"Wyłącz konto użytkownika", - "enable-account":"Włącz konto użytkownika", - "enable-account-message":"Konto użytkownika zostało pomyślnie włączone!", - "disable-account-message":"Konto użytkownika zostało pomyślnie wyłączone!", - "copyId":"Kopiuj Id użytkownika", - "idCopiedMessage":"Id użytkownika zostało skopiowane do schowka", - "user-list":"Lista użytkowników", - "user-list-required":"Lista użytkowników jest wymagana" + "value": { + "type": "Typ wartości", + "string": "Łańcuch znaków", + "string-value": "Łańcuch znaków", + "string-value-required": "Łańcuch znaków jest wymagany", + "integer": "Liczba całkowita", + "integer-value": "Wartość całkowita", + "integer-value-required": "Wartość całkowita jest wymagana", + "invalid-integer-value": "Nieprawidłowa wartość całkowita", + "double": "Liczba zmiennoprzecinkowa podwójnej precyzji", + "double-value": "Wartość zmiennoprzecinkowa podwójnej precyzji", + "double-value-required": "Wartość zmiennoprzecinkowa podwójnej precyzji jest wymagana", + "boolean": "Wartość logiczna", + "boolean-value": "Wartość logiczna", + "false": "Fałsz", + "true": "Prawda", + "long": "Duża liczba", + "json": "JSON", + "json-value": "Wartość JSON", + "json-value-invalid": "Wartość JSON ma nieprawidłowy format", + "json-value-required": "Wartość JSON jest wymagana." }, - "value":{ - "type":"Typ wartości", - "string":"Ciąg znaków", - "string-value":"Wartość ciągu znaków", - "string-value-required":"Wartość ciągu znaków jest wymagana", - "integer":"Liczba całkowita", - "integer-value":"Wartość liczby całkowitej", - "integer-value-required":"Wartość liczby całkowitej jest wymagana", - "invalid-integer-value":"Nieprawidłowa wartość liczby całkowitej", - "double":"Podwójna", - "double-value":"Wartość podwójna", - "double-value-required":"Wartość podwójna jest wymagana", - "boolean":"Boolean", - "boolean-value":"Wartość Boolean", - "false":"Fałsz", - "true":"Prawda", - "long":"Długa", - "json":"JSON", - "json-value":"Wartość JSON", - "json-value-invalid":"Wartość JSON ma nieprawidłowy format", - "json-value-required":"Wartość JSON jest wymagana." + "version-control": { + "version-control": "Kontrola wersji", + "management": "Zarządzanie kontrolą wersji", + "search": "Wyszukaj wersje", + "branch": "Gałąź", + "default": "Domyślny", + "select-branch": "Wybierz Gałąź", + "branch-required": "Gałąź jest wymagana", + "create-entity-version": "Utwórz wersję obiektu", + "version-name": "Nazwa wersji", + "version-name-required": "Nazwa wersji jest wymagana", + "author": "Autor", + "export-relations": "Relacje eksportowe", + "export-attributes": "Eksportuj atrybuty", + "export-credentials": "Eksportuj dane uwierzytelniające", + "export-group-entities": "Eksportuj obiekty grupy", + "export-roles": "Eksportuj role", + "entity-versions": "Wersje obiektu", + "versions": "Wersje", + "created-time": "Stworzony czas", + "version-id": "Identyfikator wersji", + "no-entity-versions-text": "Nie znaleziono wersji obiektu", + "no-versions-text": "Nie znaleziono wersji", + "copy-full-version-id": "Skopiuj identyfikator pełnej wersji", + "create-version": "Utwórz wersję", + "creating-version": "Tworzenie wersji... Proszę czekać", + "nothing-to-commit": "Brak zmian do zatwierdzenia", + "restore-version": "Przywróć wersję", + "restore-entity-from-version": "Przywróć obiekt z wersji '{{versionName}}'", + "restoring-entity-version": "Przywracanie wersji obiektu... Proszę czekać", + "load-relations": "Załaduj relacje", + "load-attributes": "Załaduj atrybuty", + "load-credentials": "Załaduj dane uwierzytelniające", + "load-group-entities": "Załaduj obiekty grupy", + "load-roles": "Załaduj role", + "compare-with-current": "Porównaj z aktualnym", + "diff-entity-with-version": "Porównaj z wersją obiektu '{{versionName}}'", + "previous-difference": "Poprzednia różnica", + "next-difference": "Następna różnica", + "current": "Aktualny", + "differences": "{ count, plural, =1 {1 różnica} other {# różnic} }", + "create-entities-version": "Utwórz wersję obiektu", + "default-sync-strategy": "Domyślna strategia synchronizacji", + "sync-strategy-merge": "Połącz", + "sync-strategy-overwrite": "Nadpisz", + "entities-to-export": "Obiekty do eksportu", + "entities-to-restore": "Obiekty do przywrócenia", + "sync-strategy": "Strategia synchronizacji", + "all-entities": "Wszystkie obiekty", + "no-entities-to-export-prompt": "Proszę określić obiekty do wyeksportowania", + "no-entities-to-restore-prompt": "Proszę określić obiekty do przywrócenia", + "add-entity-type": "Dodaj typ obiektu", + "remove-all": "Usuń wszystko", + "version-create-result": "Dodano { added, plural, =0 {0 obiektów} =1 {1 obiekt} other {# obiektów} }.
Zmodyfikowano { modified, plural, =0 {0 obiektów} =1 {1 obiekt} other {# obiektów} }.
Usunięto{ removed, plural, =0 {0 obiektów} =1 {1 obiekt} other {# obiektów} }.", + "remove-other-entities": "Usuń inne obiekty", + "find-existing-entity-by-name": "Znajdź istniejący obiekt według nazwy", + "restore-entities-from-version": "Przywróć obiekty z wersji '{{versionName}}'", + "restoring-entities-from-version": "Przywracanie obiektów... Proszę czekać", + "no-entities-restored": "Nie przywrócono żadnych obiektów", + "created": "{{created}} utworzone", + "updated": "{{updated}} zaktualizowane", + "deleted": "{{deleted}} usunięte", + "groups-created": "Stworzono { created, plural, =1 {1 grupę} other {# grup(y)} }", + "groups-updated": "Zaktualizowano { updated, plural, =1 {1 grupę} other {# grup(y)} }", + "groups-deleted": "Usunięto { deleted, plural, =1 {1 grupę} other {# grup(y)} }", + "remove-other-entities-confirm-text": "Bądź ostrożny! To permanentnie usunie wszystkie obecne obiekty
nie występujące w wersji, którą chcesz przywrócić.

Proszę wpisać remove other entities aby potwierdzić.", + "auto-commit-to-branch": "automatyczne zatwierdzenie do gałęzi {{ branch }}", + "default-create-entity-version-name": "{{entityName}} aktualizacja", + "sync-strategy-merge-hint": "Tworzy lub aktualizuje wybrane obiekty w repozytorium. niezmodyfikowany.", + "sync-strategy-overwrite-hint": "Tworzy lub aktualizuje wybrane obiekty w repozytorium. usunięte.", + "device-credentials-conflict": "Nie udało się załadować urządzenia z zewnętrznym identyfikatorem {{entityId}}
ze względu na te same dane uwierzytelniające, które znajdują się już w bazie danych dla innego urządzenia.
Proszę rozważyć wyłączenie załaduj dane uwierzytelniające ustawienie w formularzu przywracania.", + "missing-referenced-entity": "Nie udało się załadować {{sourceEntityTypeName}} z identyfikatorem zewnętrznym {{sourceEntityId}}
ponieważ brakuje odniesień {{targetEntityTypeName}} z identyfikatorem {{targetEntityId}}.", + "add-entity-groups": "Dodaj grupy obiektów", + "entity-groups": "Grupy obiektów", + "integration-routing-key-conflict": "Nie udało się załadować integracji z zewnętrznym identyfikatorem {{entityId}}
ponieważ ten sam klucz integracji jest już obecny w bazie danych dla innej integracji.
Proszę rozważyć włączenie opcji automatycznie wygeneruj klucz integracyjny w formularzu przywracania.", + "auto-generate-integration-key": "Automatycznie generuj klucz integracyjny", + "runtime-failed": "Nieudana: {{message}}", + "auto-commit-settings-read-only-hint": "Funkcja automatycznego zatwierdzania nie działa z włączoną opcją tylko do odczytu w ustawieniach repozytorium." }, - "version-control":{ - "version-control":"Kontrola wersji", - "management":"Zarządzanie kontrolą wersji", - "search":"Szukaj wersji", - "branch":"Gałąź", - "default":"Domyślna", - "select-branch":"Wybierz gałąź", - "branch-required":"Gałąź jest wymagana", - "create-entity-version":"Utwórz wersję encji", - "version-name":"Nazwa wersji", - "version-name-required":"Nazwa wersji jest wymagana", - "author":"Autor", - "export-relations":"Eksportuj relacje", - "export-attributes":"Eksportuj atrybuty", - "export-credentials":"Eksportuj poświadczenia", - "entity-versions":"Wersje encji", - "versions":"Wersje", - "created-time":"Czas utworzenia", - "version-id":"ID wersji", - "no-entity-versions-text":"Nie znaleziono wersji encji", - "no-versions-text":"Nie znaleziono wersji", - "copy-full-version-id":"Kopiuj pełne ID wersji", - "create-version":"Utwórz wersję", - "creating-version":"Tworzenie wersji... Proszę czekać", - "nothing-to-commit":"Brak zmian do zatwierdzenia", - "restore-version":"Przywróć wersję", - "restore-entity-from-version":"Przywróć encję z wersji '{{versionName}}'", - "restoring-entity-version":"Przywracanie wersji encji... Proszę czekać", - "load-relations":"Załaduj relacje", - "load-attributes":"Załaduj atrybuty", - "load-credentials":"Załaduj poświadczenia", - "compare-with-current":"Porównaj z obecną", - "diff-entity-with-version":"Różnice z wersją encji '{{versionName}}'", - "previous-difference":"Poprzednia różnica", - "next-difference":"Następna różnica", - "current":"Obecna", - "differences":"{ count, plural, =1 {1 różnica} other {# różnice} }", - "create-entities-version":"Utwórz wersję encji", - "default-sync-strategy":"Domyślna strategia synchronizacji", - "sync-strategy-merge":"Scal", - "sync-strategy-overwrite":"Nadpisz", - "entities-to-export":"Encje do eksportu", - "entities-to-restore":"Encje do przywrócenia", - "sync-strategy":"Strategia synchronizacji", - "all-entities":"Wszystkie encje", - "no-entities-to-export-prompt":"Proszę określić encje do eksportu", - "no-entities-to-restore-prompt":"Proszę określić encje do przywrócenia", - "add-entity-type":"Dodaj typ encji", - "remove-all":"Usuń wszystko", - "version-create-result":"{ added, plural, =0 {Nie dodano encji} =1 {Dodano 1 encję} other {Dodano # encji} }.
{ modified, plural, =0 {Nie zmodyfikowano encji} =1 {Zmodyfikowano 1 encję} other {Zmodyfikowano # encji} }.
{ removed, plural, =0 {Nie usunięto encji} =1 {Usunięto 1 encję} other {Usunięto # encji} }.", - "remove-other-entities":"Usuń inne encje", - "find-existing-entity-by-name":"Znajdź istniejącą encję po nazwie", - "restore-entities-from-version":"Przywróć encje z wersji '{{versionName}}'", - "restoring-entities-from-version":"Przywracanie encji... Proszę czekać", - "no-entities-restored":"Nie przywrócono żadnych encji", - "created":"{{created}} utworzonych", - "updated":"{{updated}} zaktualizowanych", - "deleted":"{{deleted}} usuniętych", - "remove-other-entities-confirm-text":"Uważaj! To trwale usunie wszystkie bieżące encje
nieobecne w wersji, którą chcesz przywrócić.

Proszę wpisać \"usuń inne encje\", aby potwierdzić.", - "auto-commit-to-branch":"automatyczne zatwierdzenie do gałęzi {{ branch }}", - "default-create-entity-version-name":"Aktualizacja {{entityName}}", - "sync-strategy-merge-hint":"Tworzy lub aktualizuje wybrane encje w repozytorium. Wszystkie inne encje w repozytorium są niezmodyfikowane.", - "sync-strategy-overwrite-hint":"Tworzy lub aktualizuje wybrane encje w repozytorium. Wszystkie inne encje w repozytorium są usunięte.", - "device-credentials-conflict":"Nie udało się załadować urządzenia z zewnętrznym id {{entityId}}
ponieważ te same poświadczenia są już obecne w bazie danych dla innego urządzenia.
Rozważ wyłączenie opcji załaduj poświadczenia w formularzu przywracania.", - "missing-referenced-entity":"Nie udało się załadować {{sourceEntityTypeName}} z zewnętrznym id {{sourceEntityId}}
ponieważ odnosi się do brakującej {{targetEntityTypeName}} z id {{targetEntityId}}.", - "runtime-failed":"Failed: {{message}}", - "auto-commit-settings-read-only-hint":"Funkcja automatycznego zatwierdzania nie działa z włączoną opcją tylko do odczytu w ustawieniach repozytorium." + "widget": { + "widget-library": "Biblioteka widżetów", + "widget-bundle": "Pakiet widżetów", + "all-bundles": "Wszystkie pakiety", + "select-widgets-bundle": "Wybierz pakiet widżetów", + "widgets": "Widgets", + "all-widgets": "All widgets", + "widget": "Widget", + "select-widget": "Select widget", + "no-widgets-matching": "No widgets matching '{{entity}}' were found.", + "no-widgets": "No widgets yet", + "no-widgets-text": "No widgets found", + "management": "Zarządzanie widgetami", + "editor": "Edytor widżetów", + "widget-type-not-found": "Problem z ładowaniem konfiguracji widgetu.
Prawdopodobnie powiązany\n typ widżetu został usunięty.", + "widget-type-load-error": "Widżet nie został załadowany z powodu następujących błędów:", + "remove": "Usuń widżet", + "delete": "Delete widget", + "edit": "Edytuj widżet", + "edit-widget-type": "Edit widget type", + "remove-widget-title": "Czy na pewno chcesz usunąć widżet '{{widgetTitle}}'?", + "remove-widget-text": "Po potwierdzeniu widżetu i wszystkich powiązanych danych nie będzie można odzyskać.", + "timeseries": "Szereg czasowy", + "search-data": "Wyszukaj dane", + "no-data-found": "Nie znaleziono danych", + "latest": "Najnowsze wartości", + "rpc": "Widżet sterujący", + "alarm": "Widżet alarmowy", + "static": "Widget statyczny", + "select-widget-type": "Wybierz typ widżetu", + "missing-widget-title-error": "Tytuł widgetu musi zostać określony!", + "widget-saved": "Widżet został zapisany", + "unable-to-save-widget-error": "Nie można zapisać widżetu! ", + "save": "Zapisz widżet", + "saveAs": "Zapisz widżet jako", + "move": "Move widget", + "save-widget-type-as": "Zapisz typ widżetu jako", + "save-widget-type-as-text": "Proszę podać nowy tytuł widżetu i/lub wybrać docelowy pakiet widżetów", + "toggle-fullscreen": "Przełącz tryb pełnoekranowy", + "run": "Uruchom widget", + "widget-title": "Widget title", + "title": "Tytul widzeta", + "title-required": "Tytuł widgetu jest wymagany.", + "title-max-length": "Title should be less than 256", + "system": "System", + "type": "Typ widgetu", + "resources": "Biblioteki", + "resource-url": "Adres URL JavaScript/CSS", + "resource-is-module": "Jest modułem", + "remove-resource": "Usuń zasób", + "add-resource": "Dodaj zasób", + "html": "HTML", + "tidy": "Tidy", + "css": "CSS", + "settings-schema": "Schemat ustawień", + "datakey-settings-schema": "Schemat ustawień klucza danych", + "latest-datakey-settings-schema": "Najnowszy schemat ustawień klucza danych", + "widget-settings": "Ustawienia widgetu", + "description": "Opis", + "image-preview": "Podgląd obrazu", + "settings-form-selector": "Ustawienia selektora formularza", + "data-key-settings-form-selector": "Selektor formularza ustawień klucza danych", + "latest-data-key-settings-form-selector": "Selektor formularza najnowszych ustawień klucza danych", + "all": "All", + "actual": "Actual", + "deprecated": "Deprecated", + "has-basic-mode": "Has basic mode", + "basic-mode-form-selector": "Basic mode form selector", + "basic-mode": "Basic", + "advanced-mode": "Advanced", + "javascript": "JavaScript", + "js": "JS", + "remove-widget-type-title": "Czy na pewno chcesz usunąć typ widżetu '{{widgetName}}'?", + "remove-widget-type-text": "Po potwierdzeniu typu widżetu i wszystkich powiązanych danych nie będzie można odzyskać.", + "remove-widget-type": "Usuń typ widżetu", + "widget-types": "Widget Types", + "delete-widget-type-title": "Are you sure you want to delete the widget type '{{widgetTypeName}}'?", + "delete-widget-type-text": "After the confirmation the widget and all related data will become unrecoverable.", + "delete-widget-types-title": "Are you sure you want to delete { count, plural, =1 {1 widget type} other {# widget types} }?", + "delete-widget-types-text": "Be careful, after the confirmation all selected widget types will be removed and all related data will become unrecoverable.", + "delete-widget-type": "Delete widget type", + "add-widget-type": "Dodaj nowy typ widżetu", + "widget-type-load-failed-error": "Nie udało się załadować typu widżetu!", + "widget-template-load-failed-error": "Nie udało się załadować szablonu widżetu!", + "details": "Details", + "widget-type-details": "Widget type details", + "add": "Dodaj widżet", + "no-widget-types-text": "No widget types found", + "search-widget-types": "Search widget types", + "selected-widget-types": "{ count, plural, =1 {1 widget type} other {# widget types} } selected", + "undo": "Cofnij zmiany w widżecie", + "export": "Eksportuj widżet", + "export-data": "Eksportuj dane widżetu", + "export-to-csv": "Eksportuj dane do pliku CSV...", + "export-to-excel": "Eksportuj dane do formatu XLS...", + "export-to-excel-xlsx": "Eksportuj dane do XLSX...", + "no-data": "Brak danych do wyświetlenia w widżecie", + "data-overflow": "Widżet wyświetla {{count}} z {{total}} obiektów", + "alarm-data-overflow": "Widżet wyświetla alarmy dla {{allowedEntities}} (maksymalnie dozwolonych) obiektów z {{totalEntities}} obiektów", + "search": "Wyszukaj widżet", + "filter": "Typ filtra widgetu", + "loading-widgets": "Ładowanie widżetów...", + "widget-template-error": "Nieprawidłowy szablon HTML widgetu." }, - "widget":{ - "widget-library":"Biblioteka widgetów", - "widget-bundle":"Pakiet widgetów", - "all-bundles":"Wszystkie pakiety", - "select-widgets-bundle":"Wybierz pakiet widgetów", - "widgets":"Widgety", - "all-widgets":"Wszystkie widgety", - "widget":"Widget", - "select-widget":"Wybierz widget", - "no-widgets-matching":"Nie znaleziono widgetów pasujących do '{{entity}}'.", - "no-widgets":"Brak widgetów", - "no-widgets-text":"Nie znaleziono widgetów", - "management":"Zarządzanie widgetami", - "editor":"Edytor widgetów", - "confirm-to-exit-editor-html":"Masz niezapisane ustawienia widgetu.
Czy na pewno chcesz opuścić tę stronę?", - "widget-type-not-found":"Problem z ładowaniem konfiguracji widgetu.
Prawdopodobnie powiązany typ widgetu został usunięty.", - "widget-type-load-error":"Widget nie został załadowany z powodu następujących błędów:", - "remove":"Usuń widget", - "delete":"Usuń widget", - "edit":"Edytuj widget", - "remove-widget-title":"Czy na pewno chcesz usunąć widget '{{widgetTitle}}'?", - "remove-widget-text":"Po potwierdzeniu widget i wszystkie powiązane dane staną się nieodwracalne.", - "timeseries":"Serie czasowe", - "search-data":"Szukaj danych", - "no-data-found":"Nie znaleziono danych", - "latest":"Najnowsze wartości", - "rpc":"Widget sterowania", - "alarm":"Widget alarmów", - "static":"Widget statyczny", - "timeseries-short":"serie", - "latest-short":"najnowsze", - "rpc-short":"sterowanie", - "alarm-short":"alarm", - "static-short":"statyczny", - "select-widget-type":"Wybierz typ widgetu", - "missing-widget-title-error":"Tytuł widgetu musi być określony!", - "widget-saved":"Widget zapisany", - "unable-to-save-widget-error":"Nie można zapisać widgetu! Widget zawiera błędy!", - "save":"Zapisz widget", - "saveAs":"Zapisz widget jako", - "move":"Przenieś widget", - "save-widget-as":"Zapisz widget jako", - "save-widget-as-text":"Proszę wprowadzić nowy tytuł widgetu", - "toggle-fullscreen":"Przełącz pełny ekran", - "run":"Uruchom widget", - "widget-title":"Tytuł widgetu", - "title":"Tytuł", - "title-required":"Tytuł widgetu jest wymagany.", - "title-max-length":"Tytuł powinien mieć mniej niż 256 znaków", - "system":"System", - "type":"Typ widgetu", - "resources":"Zasoby", - "resource-url":"URL JavaScript/CSS", - "resource-is-module":"Jest modułem", - "remove-resource":"Usuń zasób", - "add-resource":"Dodaj zasób", - "html":"HTML", - "tidy":"Uporządkuj", - "css":"CSS", - "settings-schema":"Schemat ustawień", - "datakey-settings-schema":"Schemat ustawień klucza danych", - "latest-datakey-settings-schema":"Schemat ustawień najnowszego klucza danych", - "widget-settings":"Ustawienia widgetu", - "description":"Opis", - "tags":"Tagi", - "image-preview":"Podgląd obrazu", - "settings-form-selector":"Selektor formularza ustawień", - "data-key-settings-form-selector":"Selektor formularza ustawień klucza danych", - "latest-data-key-settings-form-selector":"Selektor formularza ustawień najnowszego klucza danych", - "all":"Wszystkie", - "actual":"Aktualne", - "deprecated":"Przestarzałe", - "has-basic-mode":"Ma tryb podstawowy", - "basic-mode-form-selector":"Selektor formularza trybu podstawowego", - "basic-mode":"Podstawowy", - "advanced-mode":"Zaawansowany", - "javascript":"Javascript", - "js":"JS", - "delete-widget-title":"Czy na pewno chcesz usunąć widget '{{widgetName}}'?", - "delete-widget-text":"Po potwierdzeniu widget i wszystkie powiązane dane staną się nieodwracalne.", - "delete-widgets-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 widget} other {# widgetów} }?", - "delete-widgets-text":"Uważaj, po potwierdzeniu wszystkie wybrane widgety zostaną usunięte, a wszystkie powiązane dane staną się nieodwracalne.", - "delete-widget":"Usuń widget", - "widget-template-load-failed-error":"Nie udało się załadować szablonu widgetu!", - "details":"Szczegóły", - "widget-details":"Szczegóły widgetu", - "add":"Dodaj widget", - "add-existing-widget":"Dodaj istniejący widget", - "add-new-widget":"Dodaj nowy widget", - "search-widgets":"Szukaj widgetów", - "selected-widgets":"{ count, plural, =1 {1 widget} other {# widgetów} } wybrano", - "undo":"Cofnij zmiany widgetu", - "export":"Eksportuj widget", - "export-widgets":"Eksportuj widgety", - "import":"Importuj widget", - "no-data":"Brak danych do wyświetlenia na widżecie", - "data-overflow":"Widget wyświetla {{count}} z {{total}} encji", - "alarm-data-overflow":"Widget wyświetla alarmy dla {{allowedEntities}} (maksymalna dozwolona) encji z {{totalEntities}} encji", - "search":"Szukaj widgetu", - "filter":"Typ filtru widgetu", - "loading-widgets":"Ładowanie widgetów...", - "widget-template-error":"Nieprawidłowy szablon HTML widgetu." - }, - "widget-action":{ - "header-button":"Przycisk nagłówka widgetu", - "open-dashboard-state":"Przejdź do nowego stanu pulpitów", - "update-dashboard-state":"Zaktualizuj bieżący stan pulpitów", - "open-dashboard":"Przejdź do innego pulpitu", - "custom":"Akcja niestandardowa", - "custom-pretty":"Akcja niestandardowa (z szablonem HTML)", - "custom-pretty-error-title":"Błąd niestandardowego okna dialogowego", - "custom-pretty-template-error":"Nieprawidłowy szablon niestandardowego okna dialogowego.", - "custom-pretty-controller-error":"Wystąpił błąd podczas oceny funkcji niestandardowego okna dialogowego.", - "mobile-action":"Akcja mobilna", - "target-dashboard-state":"Docelowy stan pulpitu", - "target-dashboard-state-required":"Docelowy stan pulpitu jest wymagany", - "set-entity-from-widget":"Ustaw encję z widgetu", - "target-dashboard":"Docelowy pulpit", - "open-right-layout":"Otwórz prawy układ pulpitu (widok mobilny)", - "state-display-type":"Opcja wyświetlania stanu pulpitu", - "open-normal":"Normalnie", - "open-in-separate-dialog":"Otwórz w osobnym oknie dialogowym", - "open-in-popover":"Otwórz w dymku", - "dialog-title":"Tytuł okna dialogowego", - "dialog-hide-dashboard-toolbar":"Ukryj pasek narzędzi pulpitu w oknie dialogowym", - "dialog-width":"Szerokość okna dialogowego w procentach względem szerokości viewportu", - "dialog-height":"Wysokość okna dialogowego w procentach względem wysokości viewportu", - "dialog-size-range-error":"Wartość procentowa rozmiaru okna dialogowego powinna być w zakresie od 1 do 100.", - "popover-preferred-placement":"Preferowane umiejscowienie dymka", - "popover-placement-top":"Góra", - "popover-placement-topLeft":"Góra lewo", - "popover-placement-topRight":"Góra prawo", - "popover-placement-right":"Prawo", - "popover-placement-rightTop":"Prawo góra", - "popover-placement-rightBottom":"Prawo dół", - "popover-placement-bottom":"Dół", - "popover-placement-bottomLeft":"Dół lewo", - "popover-placement-bottomRight":"Dół prawo", - "popover-placement-left":"Lewo", - "popover-placement-leftTop":"Lewo góra", - "popover-placement-leftBottom":"Lewo dół", - "popover-hide-on-click-outside":"Ukryj dymek po kliknięciu na zewnątrz", - "popover-hide-dashboard-toolbar":"Ukryj pasek narzędzi pulpitu w dymku", - "popover-width":"Szerokość dymka w jednostkach przeglądarki (np. 100px, 25vw)", - "popover-height":"Wysokość dymka w jednostkach przeglądarki (np. 100px, 25vh)", - "popover-style":"Styl dymka", - "open-new-browser-tab":"Otwórz w nowej karcie przeglądarki", - "mobile":{ - "action-type":"Typ akcji mobilnej", - "action-type-required":"Typ akcji mobilnej jest wymagany", - "take-picture-from-gallery":"Wybierz zdjęcie z galerii", - "take-photo":"Zrób zdjęcie", - "map-direction":"Otwórz wskazówki dojazdu na mapie", - "map-location":"Otwórz lokalizację na mapie", - "scan-qr-code":"Skanuj kod QR", - "make-phone-call":"Wykonaj połączenie telefoniczne", - "get-location":"Pobierz lokalizację telefonu", - "take-screenshot":"Zrób zrzut ekranu" + "widget-action": { + "header-button": "Przycisk nagłówka widgetu", + "open-dashboard-state": "Przejdź do nowego stanu panelu", + "update-dashboard-state": "Zaktualizuj bieżący stan panelu", + "open-dashboard": "Przejdź do innego panelu", + "custom": "Akcja niestandardowa", + "custom-pretty": "Akcja niestandardowa (z szablonem HTML)", + "custom-pretty-error-title": "Niestandardowy błąd okna dialogowego", + "custom-pretty-template-error": "Nieprawidłowy niestandardowy szablon okna dialogowego.", + "custom-pretty-controller-error": "Wystąpił błąd podczas oceniania niestandardowej funkcji okna dialogowego.", + "mobile-action": "Akcja mobilna", + "target-dashboard-state": "Docelowy stan panelu", + "target-dashboard-state-required": "Docelowy stan panelu jest wymagany", + "set-entity-from-widget": "Ustaw obiekt z widżetu", + "target-dashboard": "Docelowy panel", + "open-right-layout": "Otwórz prawy układ panelu (widok mobilny)", + "state-display-type": "Opcja wyświetlania stanu panelu", + "open-normal": "Normalna", + "open-in-separate-dialog": "Otwórz w osobnym oknie dialogowym", + "open-in-popover": "Otwórz w wyskakującym okienku", + "dialog-title": "Tytuł okna dialogowego", + "dialog-hide-dashboard-toolbar": "Ukryj pasek narzędzi panelu w oknie dialogowym", + "dialog-width": "Szerokość okna dialogowego w procentach w stosunku do szerokości rzutni", + "dialog-height": "Wysokość okna dialogowego w procentach w stosunku do wysokości rzutni", + "dialog-size-range-error": "Wartość procentowa rozmiaru okna dialogowego powinna mieścić się w przedziale od 1 do 100.", + "popover-preferred-placement": "Preferowane miejsce wyskakujące", + "popover-placement-top": "Na górze", + "popover-placement-topLeft": "Na górze po lewej", + "popover-placement-topRight": "Na górze po lewej", + "popover-placement-right": "Po prawej", + "popover-placement-rightTop": "Po prawej na górze", + "popover-placement-rightBottom": "Po prawej na dole", + "popover-placement-bottom": "Na dole", + "popover-placement-bottomLeft": "Na dole po lewej", + "popover-placement-bottomRight": "Na dole po prawej", + "popover-placement-left": "Po lewej", + "popover-placement-leftTop": "Po lewej na górze", + "popover-placement-leftBottom": "Po lewej na dole", + "popover-hide-on-click-outside": "Ukryj wyskakujące okienko po kliknięciu zewnętrznym", + "popover-hide-dashboard-toolbar": "Ukryj pasek narzędzi panelu w wyskakującym okienku", + "popover-width": "Szerokość wyskakującego okienka w jednostkach przeglądarki (np. 100px, 25vw)", + "popover-height": "Wysokość wyskakującego okienka w jednostkach przeglądarki (np. 100px, 25vh)", + "popover-style": "Styl wyskakującego okienka", + "open-new-browser-tab": "Otwórz w nowej karcie przeglądarki", + "mobile": { + "action-type": "Typ akcji mobilnej", + "action-type-required": "Typ akcji mobilnej jest wymagany", + "take-picture-from-gallery": "Zrób zdjęcie z galerii", + "take-photo": "Zrób zdjęcie", + "map-direction": "Otwórz wskazówki na mapie", + "map-location": "Otwórz lokalizację na mapie", + "scan-qr-code": "Skanuj kod QR", + "make-phone-call": "Wykonaj telefon", + "get-location": "Uzyskaj lokalizację telefonu", + "take-screenshot": "Zrób zrzut ekranu" } }, - "widgets-bundle":{ - "current":"Aktualny zestaw", - "widgets-bundles":"Zestawy widżetów", - "widgets-bundle-widgets":"Widżety zestawu widżetów", - "add":"Dodaj zestaw widżetów", - "delete":"Usuń zestaw widżetów", - "title":"Tytuł", - "title-required":"Tytuł jest wymagany.", - "title-max-length":"Tytuł powinien być krótszy niż 256", - "description":"Opis", - "image-preview":"Podgląd obrazu", - "order":"Kolejność", - "add-widgets-bundle-text":"Dodaj nowy zestaw widżetów", - "no-widgets-bundles-text":"Nie znaleziono zestawów widżetów", - "empty":"Zestaw widżetów jest pusty", - "details":"Szczegóły", - "widgets-bundle-details":"Szczegóły zestawu widżetów", - "delete-widgets-bundle-title":"Czy na pewno chcesz usunąć zestaw widżetów '{{widgetsBundleTitle}}'?", - "delete-widgets-bundle-text":"Uważaj, po potwierdzeniu zestaw widżetów oraz wszystkie powiązane dane staną się nieodwracalne.", - "delete-widgets-bundles-title":"Czy na pewno chcesz usunąć { count, plural, =1 {1 zestaw widżetów} other {# zestawy widżetów} }?", - "delete-widgets-bundles-action-title":"Usuń { count, plural, =1 {1 zestaw widżetów} other {# zestawy widżetów} }", - "delete-widgets-bundles-text":"Uważaj, po potwierdzeniu wszystkie wybrane zestawy widżetów zostaną usunięte, a wszystkie powiązane dane staną się nieodwracalne.", - "no-widgets-bundles-matching":"Nie znaleziono zestawów widżetów pasujących do '{{widgetsBundle}}'.", - "widgets-bundle-required":"Zestaw widżetów jest wymagany.", - "system":"System", - "import":"Importuj zestaw widżetów", - "export":"Eksportuj zestaw widżetów", - "export-widgets-bundle-widgets-prompt":"Dołącz widżety zestawu w eksportowanych danych (w przeciwnym razie zostaną wyeksportowane tylko odniesienia do pełnych kwalifikacji nazw widżetów)", - "export-failed-error":"Nie można wyeksportować zestawu widżetów: {{error}}", - "create-new-widgets-bundle":"Utwórz nowy zestaw widżetów", - "widgets-bundle-file":"Plik zestawu widżetów", - "invalid-widgets-bundle-file-error":"Nie można zaimportować zestawu widżetów: Nieprawidłowa struktura danych zestawu widżetów.", - "search":"Szukaj zestawów widżetów", - "selected-widgets-bundles":"{ count, plural, =1 {1 wybrany zestaw widżetów} other {# wybrane zestawy widżetów} }", - "open-widgets-bundle":"Otwórz zestaw widżetów", - "loading-widgets-bundles":"Ładowanie zestawów widżetów..." + "widgets-bundle": { + "current": "Aktualny pakiet", + "widgets-bundles": "Pakiety widżetów", + "widgets-bundle-widgets": "Widgets Bundle Widgets", + "add": "Dodaj pakiet widżetów", + "delete": "Usuń pakiet widżetów", + "title": "Tytuł", + "title-required": "Tytuł jest wymagany.", + "title-max-length": "Tytuł powinien być mniejszy niż 256", + "description": "Opis", + "image-preview": "Podgląd obrazu", + "add-widgets-bundle-text": "Dodaj nowy pakiet widżetów", + "no-widgets-bundles-text": "Nie znaleziono pakietów widżetów", + "empty": "Pakiet widżetów jest pusty", + "details": "Szczegóły", + "widgets-bundle-details": "Szczegóły pakietu widżetów", + "delete-widgets-bundle-title": "Czy na pewno chcesz usunąć pakiet widżetów '{{widgetsBundleTitle}}'?", + "delete-widgets-bundle-text": "Bądź ostrożny, po potwierdzeniu pakietu widżetów i wszystkich powiązanych danych nie będzie można odzyskać.", + "delete-widgets-bundles-title": "Czy na pewno chcesz usunąć { count, plural, =1 {1 pakiet} other {# pakietów} } widżetów?", + "delete-widgets-bundles-action-title": "Usuń { count, plural, =1 {1 pakiet} other {# pakietów} } widżetów", + "delete-widgets-bundles-text": "Bądź ostrożny, po potwierdzeniu wszystkie wybrane pakiety widżetów zostaną usunięte, a wszystkich powiązanych danych nie będzie można odzyskać.", + "no-widgets-bundles-matching": "Nie znaleziono pakietów widżetów pasujących do '{{widgetsBundle}}'.", + "widgets-bundle-required": "Pakiet widżetów jest wymagany.", + "system": "System", + "import": "Importuj pakiet widżetów", + "export": "Eksportuj pakiet widżetów", + "export-widgets-bundle-widgets-prompt": "Include bundle widget types in exported data (otherwise only referenced widget type FQNs will be exported)", + "export-failed-error": "Nie można wyeksportować pakietu widżetów: {{error}}", + "create-new-widgets-bundle": "Utwórz nowy pakiet widżetów", + "widgets-bundle-file": "Plik pakietu widżetów", + "invalid-widgets-bundle-file-error": "Nie można zaimportować pakietu widżetów: Nieprawidłowa struktura danych pakietu widżetów.", + "search": "Wyszukaj pakiety widżetów", + "selected-widgets-bundles": "Wybrano { count, plural, =1 {1 pakiet} other {# pakietów} } widżetów", + "open-widgets-bundle": "Otwórz pakiet widżetów", + "loading-widgets-bundles": "Ładowanie pakietów widżetów..." }, - "widget-config":{ - "data":"Dane", - "settings":"Ustawienia", - "advanced":"Zaawansowane", - "appearance":"Wygląd", - "widget-card":"Karta widżetu", - "mobile":"Mobilny", - "title":"Tytuł", - "title-tooltip":"Podpowiedź tytułu", - "general-settings":"Ustawienia ogólne", - "display-title":"Wyświetl tytuł widżetu", - "card-title":"Tytuł karty", - "drop-shadow":"Cień", - "enable-fullscreen":"Włącz pełny ekran", - "background-color":"Kolor tła", - "text-color":"Kolor tekstu", - "border-radius":"Promień obramowania", - "padding":"Odstęp", - "margin":"Margines", - "widget-style":"Styl widżetu", - "widget-css":"CSS widżetu", - "title-style":"Styl tytułu", - "mobile-mode-settings":"Ustawienia trybu mobilnego", - "order":"Kolejność", - "height":"Wysokość", - "mobile-hide":"Ukryj widżet w trybie mobilnym", - "desktop-hide":"Ukryj widżet w trybie desktopowym", - "units":"Specjalny symbol obok wartości", - "units-by-default":"Domyślne jednostki", - "decimals":"Liczba miejsc po przecinku", - "decimals-by-default":"Domyślna liczba miejsc po przecinku", - "default-data-key-parameter-hint":"Ten parametr dotyczy wszystkich wartości widżetu, chyba że zostanie nadpisany przez konfigurację klucza danych", - "units-short":"Jednostki", - "decimals-short":"Miejsca po przecinku", - "decimals-suffix":"miejsca po przecinku", - "timewindow":"Okno czasowe", - "use-dashboard-timewindow":"Użyj okna czasowego dashboardu", - "use-widget-timewindow":"Użyj okna czasowego widżetu", - "display-timewindow":"Wyświetl okno czasowe", - "legend":"Legenda", - "display-legend":"Wyświetl legendę", - "datasources":"Źródła danych", - "datasource":"Źródło danych", - "maximum-datasources":"Maksymalnie { count, plural, =1 {1 źródło danych jest dozwolone.} other {# źródeł danych jest dozwolonych} }", - "timeseries-key-error":"Należy określić co najmniej jeden klucz danych szeregów czasowych", - "datasource-type":"Typ", - "datasource-parameters":"Parametry", - "remove-datasource":"Usuń źródło danych", - "add-datasource":"Dodaj źródło danych", - "target-device":"Docelowe urządzenie", - "alarm-source":"Źródło alarmu", - "actions":"Akcje", - "action":"Akcja", - "add-action":"Dodaj akcję", - "search-actions":"Szukaj akcji", - "no-actions-text":"Nie znaleziono akcji", - "action-source":"Źródło akcji", - "action-source-required":"Źródło akcji jest wymagane.", - "action-name":"Nazwa", - "action-name-required":"Nazwa akcji jest wymagana.", - "action-name-not-unique":"Inna akcja o tej samej nazwie już istnieje.
Nazwa akcji powin.", - "action-icon":"Ikona", - "show-hide-action-using-function":"Pokaż/ukryj akcję za pomocą funkcji", - "action-type":"Typ", - "action-type-required":"Typ akcji jest wymagany.", - "edit-action":"Edytuj akcję", - "delete-action":"Usuń akcję", - "delete-action-title":"Usuń akcję widżetu", - "delete-action-text":"Czy na pewno chcesz usunąć akcję widżetu o nazwie '{{actionName}}'?", - "title-icon":"Ikona tytułu", - "display-icon":"Wyświetl ikonę tytułu", - "card-icon":"Ikona karty", - "icon":"Ikona", - "icon-color":"Kolor ikony", - "icon-size":"Rozmiar ikony", - "advanced-settings":"Zaawansowane ustawienia", - "data-settings":"Ustawienia danych", - "limits":"Limity", - "no-data-display-message":"Alternatywny komunikat \"Brak danych do wyświetlenia\"", - "data-page-size":"Maksymalna liczba encji na źródło danych", - "settings-component-not-found":"Nie znaleziono komponentu formularza ustawień dla selektora '{{selector}}'", - "preview":"Podgląd", - "set":"Ustaw", - "set-message":"Ustaw komunikat", - "advanced-title-style":"Zaawansowany styl tytułu", - "card-style":"Styl karty", - "text":"Tekst", - "background":"Tło", - "advanced-widget-style":"Zaawansowany styl widżetu", - "card-buttons":"Przyciski karty", - "show-card-buttons":"Pokaż przyciski karty", - "card-border-radius":"Promień obramowania karty", - "card-appearance":"Wygląd karty", - "color":"Kolor", - "tooltip":"Podpowiedź", - "units-required":"Jednostka jest wymagana." + "widget-config": { + "data": "Dane", + "settings": "Ustawienia", + "advanced": "Zaawansowane", + "appearance": "Wygląd", + "widget-card": "Widget card", + "mobile": "Mobile", + "title": "Tytuł", + "title-tooltip": "Podpowiedź tytułu", + "general-settings": "Ustawienia główne", + "display-title": "Wyświetl tytuł widżetu", + "card-title": "Card title", + "drop-shadow": "Rzuć cień", + "enable-fullscreen": "Włącz pełny ekran", + "enable-data-export": "Włącz eksport danych", + "data-export": "Data export", + "background-color": "Kolor tła", + "text-color": "Kolor tekstu", + "border-radius": "Border radius", + "padding": "Wyściółka", + "margin": "Margines", + "widget-style": "Styl widgetu", + "widget-css": "Widżet CSS", + "title-style": "Styl tytułu", + "mobile-mode-settings": "Tryb mobilny", + "order": "Kolejność", + "height": "Wysokość", + "mobile-hide": "Ukryj widżet w trybie mobilnym", + "desktop-hide": "Ukryj widżet w trybie panelu", + "units": "Specjalny symbol wyświetlany obok wartości", + "units-by-default": "Units by default", + "decimals": "Liczba cyfr po zmiennoprzecinkowym", + "decimals-by-default": "Decimals by default", + "default-data-key-parameter-hint": "This parameter applies to all widget values unless overridden by data key configuration", + "units-short": "Units", + "decimals-short": "Decimals", + "decimals-suffix": "decimals", + "timewindow": "Okno czasowe", + "use-dashboard-timewindow": "Użyj okna czasowego panelu", + "use-widget-timewindow": "Use widget timewindow", + "display-timewindow": "Wyświetl okno czasowe", + "legend": "Legenda", + "display-legend": "Wyświetl legendę", + "datasources": "Źródła danych", + "datasource": "Datasource", + "maximum-datasources": "Maksymalnie { count, plural, =1 {1 źródło danych jest dozwolone} other {# źródeł danych jest dozwolonych} }", + "timeseries-key-error": "Należy określić co najmniej jeden klucz danych szeregu czasowego", + "datasource-type": "Typ", + "datasource-parameters": "Parametry", + "remove-datasource": "Usuń źródło danych", + "add-datasource": "Dodaj źródło danych", + "target-device": "Urządzenie docelowe", + "alarm-source": "Źródło alarmu", + "actions": "Działania", + "action": "Działanie", + "add-action": "Dodaj akcję", + "search-actions": "Szukaj działań", + "no-actions-text": "Nie znaleziono żadnych działań", + "action-source": "Źródło akcji", + "action-source-required": "Źródło działania jest wymagane.", + "action-name": "Nazwa", + "action-name-required": "Nazwa działania jest wymagana.", + "action-name-not-unique": "Istnieje już inna akcja o tej samej nazwie.
Nazwa akcji powinna być unikalna w obrębie tego samego źródła akcji.", + "action-icon": "Ikona", + "show-hide-action-using-function": "Pokaż/ukryj akcję za pomocą funkcji", + "action-type": "Typ", + "action-type-required": "Typ działania jest wymagany.", + "edit-action": "Edytuj akcję", + "delete-action": "Usuń akcję", + "delete-action-title": "Usuń akcję widgetu", + "delete-action-text": "Czy na pewno chcesz usunąć akcję widgetu o nazwie '{{actionName}}'?", + "title-icon": "Ikona tytułu", + "display-icon": "Wyświetl ikonę tytułu", + "card-icon": "Card icon", + "icon-color": "Kolor ikony", + "icon-size": "Rozmiar ikony", + "advanced-settings": "Zaawansowane ustawienia", + "data-settings": "Ustawienia danych", + "limits": "Limits", + "no-data-display-message": "Alternatywny komunikat \"Brak danych do wyświetlenia\"", + "data-page-size": "Maksymalna liczba obiektów na źródło danych", + "settings-component-not-found": "Nie znaleziono komponentu formularza ustawień dla selektora '{{selector}}'", + "preview": "Preview", + "set": "Set", + "set-message": "Set message", + "advanced-title-style": "Advanced title style", + "card-style": "Card style", + "text": "Text", + "background": "Background", + "advanced-widget-style": "Advanced widget style", + "card-buttons": "Card buttons", + "show-card-buttons": "Show card buttons", + "card-border-radius": "Card border radius", + "card-appearance": "Card appearance", + "color": "Color" }, - "widget-type":{ - "import":"Importuj typ widżetu", - "export":"Eksportuj typ widżetu", - "export-failed-error":"Nie można wyeksportować widżetu: {{error}}", - "widget-file":"Plik widżetu", - "invalid-widget-file-error":"Nie można zaimportować widżetu: Nieprawidłowa struktura danych widżetu." + "widget-type": { + "import": "Importuj typ widżetu", + "export": "Eksportuj typ widżetu", + "export-widget-types": "Export widget types", + "export-failed-error": "Nie można wyeksportować typu widżetu: {{error}}", + "create-new-widget-type": "Utwórz nowy typ widżetu", + "widget-type-file": "Plik typu widżetu", + "invalid-widget-type-file-error": "Nie można zaimportować typu widżetu: Nieprawidłowa struktura danych typu widżetu." + }, + "self-registration": { + "self-registration": "Rejestracja własna", + "self-registration-url": "Adres URL samodzielnej rejestracji", + "captcha-version": "wersja reCAPTCHA", + "captcha-action": "nazwa akcji wpisu reCAPTCHA", + "captcha-site-key": "Klucz witryny reCAPTCHA", + "captcha-secret-key": "tajny klucz reCAPTCHA", + "notification-email": "E-mail z powiadomieniem", + "notification-email-invalid": "Invalid email format.", + "notification-email-required": "Notification email is required.", + "privacy-policy-text": "Tekst polityki prywatności", + "terms-of-use-text": "Tekst Regulaminu", + "text-message-page": "Wiadomość tekstowa do strony rejestracji", + "enable-mobile-self-registration": "Włącz samodzielną rejestrację z poziomu aplikacji mobilnej", + "mobile-self-registration-title": "Ustawienia samodzielnej rejestracji aplikacji mobilnej", + "mobile-package": "Pakiet aplikacji", + "mobile-package-placeholder": "Np.: moja.przykładowa.aplikacja", + "mobile-package-hint": "Dla Androida: Twój własny, unikalny identyfikator aplikacji. Dla iOS: Identyfikator pakietu produktów.", + "mobile-package-required": "Pakiet aplikacji jest wymagany", + "mobile-app-secret": "Sekret aplikacji", + "invalid-mobile-app-secret": "Klucz tajny aplikacji może zawierać wyłącznie znaki alfanumeryczne i mieć długość od 16 do 2048 znaków.", + "copy-mobile-app-secret": "Skopiuj sekret aplikacji", + "mobile-app-scheme": "Schemat adresu URL aplikacji", + "mobile-app-scheme-placeholder": "Np.: przykladowyschemat", + "mobile-app-scheme-required": "Schemat adresu URL aplikacji jest wymagany", + "mobile-app-host": "Nazwa hosta adresu URL aplikacji", + "mobile-app-host-placeholder": "Np.: moja.aplikacja.host", + "mobile-app-host-required": "Nazwa hosta adresu URL aplikacji jest wymagana", + "show-privacy-policy": "Pokaż Politykę Prywatności", + "show-terms-of-use": "Pokaż Warunki użytkowania", + "domain-settings": "Ustawienia domeny", + "general-settings": "Ustawienia główne" + }, + "solution-template": { + "solution-template": "Szablon rozwiązania", + "solution-templates": "Szablony rozwiązań", + "management": "Zarządzaj szablonami rozwiązań", + "details": "Szczegóły", + "install": "Instaluj", + "level": "Poziom", + "install-title": "Pomyślnie zainstalowano szablon rozwiązania", + "install-failed-title": "Instalacja szablonu rozwiązania nie powiodła się", + "instructions": "Instrukcje", + "goto-main-dashboard": "Przejdź do głównego panelu", + "delete": "Usuń", + "delete-solution-title": "Czy na pewno chcesz usunąć rozwiązanie '{{solutionTitle}}'?", + "delete-solution-text": "Bądź ostrożny, po potwierdzeniu rozwiązania i wszystkich powiązanych danych nie będzie można odzyskać.", + "installing": "Instaluję szablon rozwiązania..." + }, + "markdown": { + "edit": "Edytuj", + "preview": "Podgląd", + "copy-code": "Kliknij, aby skopiować", + "copied": "Skopiowano!" + }, + "white-labeling": { + "white-labeling": "Dostosuj wygląd", + "white-labeling-general": "Dostosuj ogólny wygląd", + "login-white-labeling": "Zaloguj się do dodtosowywania wyglądu", + "general": "Ogólny", + "login": "Zaloguj sie", + "preview": "Podgląd", + "app-title": "Tytuł aplikacji", + "favicon": "Ikona strony internetowej", + "favicon-description": "Obraz *.ico, *.gif lub *.png o maksymalnym rozmiarze {{kbSize}} KB.", + "favicon-size-error": "Obraz witryny jest za duży. {{kbSize}} KB.", + "favicon-type-error": "Nieprawidłowy format pliku obrazu witryny internetowej. ", + "drop-favicon-image": "Upuść obraz ikony witryny internetowej lub kliknij, aby wybrać plik do przesłania.", + "drop-favicon-image-or": "Przeciągnij i upuść obraz ikony witryny internetowej lub", + "no-favicon-image": "Nie wybrano żadnej ikony", + "logo": "Logo", + "logo-description": "Dowolny obraz o maksymalnym rozmiarze {{kbSize}} KB.", + "logo-size-error": "Obraz logo jest za duży. {{kbSize}} KB.", + "logo-type-error": "Nieprawidłowy format pliku logo. ", + "drop-logo-image": "Upuść obraz logo lub kliknij, aby wybrać plik do przesłania.", + "drop-logo-image-or": "Przeciągnij i upuść obraz logo lub", + "no-logo-image": "Nie wybrano logo", + "logo-height": "Wysokość logo, px", + "primary-palette": "Podstawowa paleta", + "accent-palette": "Paleta akcentów", + "customize-palette": "Dostosuj", + "advanced-css": "Zaawansowany CSS", + "edit-palette": "Edytuj paletę", + "save-palette": "Zapisz paletę", + "primary-background": "Podstawowe tło", + "secondary-background": "Drugie tło", + "hue1": "ODCIEŃ 1", + "hue2": "ODCIEŃ 2", + "hue3": "ODCIEŃ 3", + "page-background-color": "Kolor tła strony", + "dark-foreground": "Ciemny pierwszy plan", + "domain-name": "Nazwa domeny", + "base-url": "Bazowy adres URL", + "prohibit-different-url": "Zabroń używania nazwy hosta z nagłówków żądań klienta", + "prohibit-different-url-hint": "To ustawienie powinno być włączone w środowiskach produkcyjnych. Może powodować problemy bezpiczeństwa w przypadku wyłączenia", + "help-link-base-url": "Bazowy adres URL linków pomocy", + "ui-help-base-url": "Bazowy adres URL pomocy interfejsu użytkownika", + "enable-help-links": "Włącz linki pomocy", + "error-verification-url": "Nazwa domeny nie powinna zawierać symboli „/” i „:”. Przykład: thingsboard.io", + "show-platform-name-version": "Pokaż nazwę i wersję platformy", + "platform-name": "Nazwa platformy", + "platform-version": "Wersja platformowa", + "version-mask": "{{name}} v.{{version}}", + "position": { + "label": "Nazwa platformy i pozycja wersji", + "under-logo": "Pod logo", + "bottom": "Na dole formularza logowania" + }, + "base-url-required": "Podstawowy adres URL jest wymagany." }, "widgets":{ "background":{ @@ -5178,736 +6534,686 @@ "value-on-bar":"Wartość na słupku", "bar-chart-style":"Styl wykresu słupkowego" }, - "battery-level":{ - "layout":"Układ", - "layout-vertical-solid":"Pionowy. Stały", - "layout-horizontal-solid":"Poziomy. Stały", - "layout-vertical-divided":"Pionowy. Podzielony", - "layout-horizontal-divided":"Poziomy. Podzielony", - "icon":"Ikona", - "value":"Wartość", - "auto-scale":"Automatyczne skalowanie", - "battery-level-color":"Kolor poziomu baterii", - "battery-shape-color":"Kolor kształtu baterii", - "battery-level-card-style":"Styl karty poziomu baterii", - "sections-count":"Liczba sekcji" + "battery-level": { + "layout": "Layout", + "layout-vertical-solid": "Vertical. Solid", + "layout-horizontal-solid": "Horizontal. Solid", + "layout-vertical-divided": "Vertical. Divided", + "layout-horizontal-divided": "Horizontal. Divided", + "icon": "Icon", + "value": "Value", + "auto-scale": "Auto scale", + "battery-level-color": "Battery level color", + "battery-shape-color": "Battery shape color", + "battery-level-card-style": "Battery level card style" }, - "signal-strength":{ - "value":"Wartość", - "last-update":"Ostatnia aktualizacja", - "no-signal":"Brak sygnału", - "layout":"Układ", - "layout-wifi":"Wi-Fi", - "layout-cellular-bar":"Słupkowy komórkowy", - "icon":"Ikona", - "date":"Data", - "active-bars-color":"Kolor aktywnych pasków sygnału", - "inactive-bars-color":"Kolor nieaktywnych pasków sygnału", - "signal-strength-card-style":"Styl karty siły sygnału" + "chart": { + "common-settings": "Wspólne ustawienia", + "enable-stacking-mode": "Włącz tryb układania", + "selection": "Time range selection", + "enable-selection-mode": "Enable selection mode", + "line-shadow-size": "Rozmiar cienia linii", + "display-smooth-lines": "Wyświetl gładkie (zakrzywione) linie", + "default-bar-width": "Domyślna szerokość paska dla danych niezagregowanych (milisekundy)", + "bar-alignment": "Wyrównanie paska", + "bar-alignment-left": "Do lewej", + "bar-alignment-right": "Do prawej", + "bar-alignment-center": "Do środka", + "default-font": "Default font", + "default-font-size": "Domyślny rozmiar czcionki", + "default-font-color": "Domyślny kolor czcionki", + "thresholds-line-width": "Domyślna szerokość linii dla wszystkich progów", + "tooltip-settings": "Ustawienia podpowiedzi", + "tooltip": "Tooltip", + "show-tooltip": "Pokaż podpowiedź", + "hover-individual-points": "Najedź kursorem na poszczególne punkty", + "show-cumulative-values": "Pokaż wartości skumulowane w trybie układania", + "hide-zero-false-values": "Ukryj wartości zerowe/fałszywe w podpowiedzi", + "tooltip-value-format-function": "Funkcja formatu wartości podpowiedzi", + "grid-settings": "Ustawienia siatki", + "show-vertical-lines": "Pokaż pionowe linie", + "show-horizontal-lines": "Pokaż poziome linie", + "grid-outline-border-width": "Szerokość obrysu/obramowania siatki (px)", + "primary-color": "Kolor podstawowy", + "background-color": "Kolor tła", + "ticks-color": "Kolor znaczników", + "xaxis-settings": "Ustawienia osi X", + "axis-title": "Tytuł osi", + "xaxis-tick-labels-settings": "Ustawienia etykiet znaczników osi X", + "show-tick-labels": "Pokaż etykiety znaczników osi", + "yaxis-settings": "Ustawienia osi Y", + "min-scale-value": "Minimalna wartość na skali", + "max-scale-value": "Maksymalna wartość na skali", + "yaxis-tick-labels-settings": "Ustawienia etykiet znaczników osi Y", + "tick-step-size": "Rozmiar kroku między znacznikami", + "number-of-decimals": "Liczba miejsc dziesiętnych do wyświetlenia", + "ticks-formatter-function": "Funkcja formatowania znaczników", + "comparison-settings": "Ustawienia porównania", + "enable-comparison": "Włącz porównanie", + "time-for-comparison": "Okres porównawczy", + "time-for-comparison-previous-interval": "Poprzedni interwał (domyślny)", + "time-for-comparison-days": "Dzień temu", + "time-for-comparison-weeks": "Tydzień temu", + "time-for-comparison-months": "Miesiąc temu", + "time-for-comparison-years": "Rok temu", + "time-for-comparison-custom-interval": "Niestandardowy interwał", + "custom-interval-value": "Niestandardowa wartość interwału (ms)", + "comparison-x-axis-settings": "Porównanie ustawień osi X", + "axis-position": "Pozycja osi", + "axis-position-top": "Góra (domyślnie)", + "axis-position-bottom": "Spód", + "custom-legend-settings": "Niestandardowe ustawienia legendy", + "enable-custom-legend": "Włącz niestandardową legendę (pozwoli to na użycie wartości atrybutów/szeregów czasowych w kluczowych etykietach)", + "key-name": "Nazwa klucza", + "key-name-required": "Nazwa klucza jest wymagana", + "key-type": "Typ klucza", + "key-type-attribute": "Atrybut", + "key-type-timeseries": "Szereg czasowy", + "label-keys-list": "Lista kluczy do użycia w etykietach", + "no-label-keys": "Nie skonfigurowano żadnych kluczy", + "add-label-key": "Dodaj nowy klucz", + "line-width": "Szerokość linii", + "color": "Kolor", + "data-is-hidden-by-default": "Dane są domyślnie ukryte", + "disable-data-hiding": "Wyłącz ukrywanie danych", + "remove-from-legend": "Usuń klucz danych z legendy", + "exclude-from-stacking": "Wyklucz z układania (dostępne w trybie \"Układanie\")", + "line-settings": "Ustawienia linii", + "show-line": "Pokaż linię", + "fill-line": "Wypełnij linię", + "fill-line-opacity": "Wypełnij krycie", + "points-settings": "Ustawienia punktów", + "show-points": "Pokaż punkty", + "points-line-width": "Szerokość linii punktów", + "points-radius": "Promień punktów", + "point-shape": "Kształt punktowy", + "point-shape-circle": "Koło", + "point-shape-cross": "Krzyż", + "point-shape-diamond": "Diament", + "point-shape-square": "Kwadrat", + "point-shape-triangle": "Trójkąt", + "point-shape-custom": "Funkcja niestandardowa", + "point-shape-draw-function": "Funkcja rysowania kształtu punktu", + "show-separate-axis": "Pokaż osobną oś", + "axis-position-left": "Lewy", + "axis-position-right": "Prawy", + "thresholds": "Progi", + "no-thresholds": "Nie skonfigurowano żadnych progów", + "add-threshold": "Dodaj nowy próg", + "show-values-for-comparison": "Pokaż wartości historyczne dla porównania", + "comparison-values-label": "Etykieta wartości historycznych", + "comparison-line-color": "Comparison line color", + "threshold-settings": "Ustawienia progów", + "use-as-threshold": "Użyj wartości klucza jako progu", + "threshold-line-width": "Szerokość linii progu", + "threshold-color": "Kolor progu", + "common-pie-settings": "Typowe ustawienia ciast", + "radius": "Promień", + "inner-radius": "Promień wewnętrzny", + "tilt": "Nachylenie", + "common-pie-settings-range-error": "Value should be in range from 0 to 1", + "stroke-settings": "Ustawienia soku", + "width-pixels": "Szerokość (piksele)", + "show-labels": "Pokaż etykiety", + "animation-settings": "Ustawienia animacji", + "animated-pie": "Włącz animację kołową (eksperymentalnie)", + "border-settings": "Ustawienia obramowania", + "border-width": "Szerokość granicy", + "border-color": "Kolor ramki", + "legend-settings": "Ustawienia legendy", + "display-legend": "Wyświetl legendę", + "labels-font-color": "Kolor czcionki etykiet", + "series": "Series", + "add-series": "Add series", + "series-settings": "Series settings", + "remove-series": "Remove series", + "no-series": "No series configured", + "no-series-error": "At least one series should be specified", + "chart-appearance": "Chart appearance", + "vertical-grid-lines": "Vertical grid lines", + "horizontal-grid-lines": "Horizontal grid lines", + "chart-background": "Chart background", + "grid-lines-color": "Grid lines color", + "border": "Border", + "axis": "Axis", + "vertical-axis": "Vertical axis", + "ticks": "Ticks", + "horizontal-axis": "Horizontal axis" }, - "chart":{ - "common-settings":"Wspólne ustawienia", - "enable-stacking-mode":"Włącz tryb układania", - "selection":"Wybór zakresu czasowego", - "enable-selection-mode":"Włącz tryb wyboru", - "line-shadow-size":"Rozmiar cienia linii", - "display-smooth-lines":"Wyświetlaj gładkie (krzywe) linie", - "default-bar-width":"Domyślna szerokość słupka dla danych niezagregowanych (milisekundy)", - "bar-alignment":"Wyrównanie słupka", - "bar-alignment-left":"Lewo", - "bar-alignment-right":"Prawo", - "bar-alignment-center":"Środek", - "default-font":"Domyślna czcionka", - "default-font-size":"Domyślny rozmiar czcionki", - "default-font-color":"Domyślny kolor czcionki", - "thresholds-line-width":"Domyślna szerokość linii dla wszystkich progów", - "tooltip-settings":"Ustawienia podpowiedzi", - "tooltip":"Podpowiedź", - "show-tooltip":"Pokaż podpowiedź", - "hover-individual-points":"Najedź na pojedyncze punkty", - "show-cumulative-values":"Pokaż wartości kumulatywne w trybie układania", - "hide-zero-false-values":"Ukryj zera/fałszywe wartości z podpowiedzi", - "tooltip-value-format-function":"Funkcja formatująca wartość podpowiedzi", - "grid-settings":"Ustawienia siatki", - "show-vertical-lines":"Pokaż linie pionowe", - "show-horizontal-lines":"Pokaż linie poziome", - "grid-outline-border-width":"Szerokość krawędzi/ramki siatki (px)", - "primary-color":"Kolor podstawowy", - "background-color":"Kolor tła", - "ticks-color":"Kolor znaczników", - "xaxis-settings":"Ustawienia osi X", - "axis-title":"Tytuł osi", - "xaxis-tick-labels-settings":"Ustawienia etykiet osi X", - "show-tick-labels":"Pokaż etykiety osi", - "yaxis-settings":"Ustawienia osi Y", - "min-scale-value":"Minimalna wartość na skali", - "max-scale-value":"Maksymalna wartość na skali", - "yaxis-tick-labels-settings":"Ustawienia etykiet osi Y", - "tick-step-size":"Rozmiar kroku między znacznikami", - "number-of-decimals":"Liczba miejsc po przecinku do wyświetlenia", - "ticks-formatter-function":"Funkcja formatująca znaczniki", - "comparison-settings":"Ustawienia porównywania", - "enable-comparison":"Włącz porównywanie", - "time-for-comparison":"Okres porównywania", - "time-for-comparison-previous-interval":"Poprzedni interwał (domyślnie)", - "time-for-comparison-days":"Dzień temu", - "time-for-comparison-weeks":"Tydzień temu", - "time-for-comparison-months":"Miesiąc temu", - "time-for-comparison-years":"Rok temu", - "time-for-comparison-custom-interval":"Niestandardowy interwał", - "custom-interval-value":"Wartość niestandardowego interwału (ms)", - "comparison-x-axis-settings":"Ustawienia osi X porównywania", - "axis-position":"Pozycja osi", - "axis-position-top":"Góra (domyślnie)", - "axis-position-bottom":"Dół", - "custom-legend-settings":"Niestandardowe ustawienia legendy", - "enable-custom-legend":"Włącz niestandardową legendę (pozwoli to na korzystanie z atrybutów/czasu rzeczywistego w etykietach kluczy)", - "key-name":"Nazwa klucza", - "key-name-required":"Nazwa klucza jest wymagana", - "key-type":"Typ klucza", - "key-type-attribute":"Atrybut", - "key-type-timeseries":"Czas rzeczywisty", - "label-keys-list":"Lista kluczy do użycia w etykietach", - "no-label-keys":"Brak skonfigurowanych kluczy", - "add-label-key":"Dodaj nowy klucz", - "line-width":"Szerokość linii", - "color":"Kolor", - "data-is-hidden-by-default":"Dane są domyślnie ukryte", - "disable-data-hiding":"Wyłącz ukrywanie danych", - "remove-from-legend":"Usuń klucz danych z legendy", - "exclude-from-stacking":"Wyłącz z układania (dostępne w trybie „Układanie”)", - "line-settings":"Ustawienia linii", - "show-line":"Pokaż linię", - "fill-line":"Wypełnij linię", - "fill-line-opacity":"Przezroczystość wypełnienia linii", - "points-settings":"Ustawienia punktów", - "show-points":"Pokaż punkty", - "points-line-width":"Szerokość linii punktów", - "points-radius":"Promień punktów", - "point-shape":"Kształt punktu", - "point-shape-circle":"Okrąg", - "point-shape-cross":"Krzyż", - "point-shape-diamond":"Diament", - "point-shape-square":"Kwadrat", - "point-shape-triangle":"Trójkąt", - "point-shape-custom":"Niestandardowa funkcja", - "point-shape-draw-function":"Funkcja rysowania kształtu punktu", - "show-separate-axis":"Pokaż oddzielną oś", - "axis-position-left":"Lewo", - "axis-position-right":"Prawo", - "thresholds":"Progi", - "no-thresholds":"Brak skonfigurowanych progów", - "add-threshold":"Dodaj próg", - "show-values-for-comparison":"Pokaż historyczne wartości do porównania", - "comparison-values-label":"Etykieta historycznych wartości", - "comparison-line-color":"Kolor linii porównawczej", - "threshold-settings":"Ustawienia progu", - "use-as-threshold":"Użyj wartości klucza jako progu", - "threshold-line-width":"Szerokość linii progu", - "threshold-color":"Kolor progu", - "common-pie-settings":"Wspólne ustawienia wykresu kołowego", - "radius":"Promień", - "inner-radius":"Wewnętrzny promień", - "tilt":"Nachylenie", - "common-pie-settings-range-error":"Wartość powinna być w zakresie od 0 do 1", - "stroke-settings":"Ustawienia obrysu", - "width-pixels":"Szerokość (piksele)", - "show-labels":"Pokaż etykiety", - "animation-settings":"Ustawienia animacji", - "animated-pie":"Włącz animację kołową (eksperymentalne)", - "border-settings":"Ustawienia obramowania", - "border-width":"Szerokość obramowania", - "border-color":"Kolor obramowania", - "legend-settings":"Ustawienia legendy", - "display-legend":"Wyświetl legendę", - "labels-font-color":"Kolor czcionki etykiet", - "series":"Seria", - "add-series":"Dodaj serię", - "series-settings":"Ustawienia serii", - "remove-series":"Usuń serię", - "no-series":"Brak skonfigurowanych serii", - "no-series-error":"Należy określić co najmniej jedną serię", - "chart-appearance":"Wygląd wykresu", - "vertical-grid-lines":"Linie siatki pionowej", - "horizontal-grid-lines":"Linie siatki poziomej", - "chart-background":"Tło wykresu", - "grid-lines-color":"Kolor linii siatki", - "border":"Obramowanie", - "axis":"Oś", - "vertical-axis":"Oś pionowa", - "ticks":"Znaczniki", - "horizontal-axis":"Oś pozioma" + "color": { + "color-settings": "Color settings", + "color-type-constant": "Constant", + "color-type-range": "Range", + "color-type-function": "Function", + "color": "Color", + "value-range": "Value range", + "from": "From", + "to": "To", + "color-function": "Color function" }, - "color":{ - "color-settings":"Ustawienia koloru", - "color-type-constant":"Stały", - "color-type-range":"Zakres", - "color-type-function":"Funkcja", - "color":"Kolor", - "value-range":"Zakres wartości", - "from":"Od", - "to":"Do", - "color-function":"Funkcja koloru", - "copy-color-settings-from":"Skopiuj ustawienia koloru z" + "dashboard-state": { + "dashboard-state-settings": "Ustawienia stanu panelu", + "dashboard-state": "Identyfikator stanu panelu", + "autofill-state-layout": "Dopełnienie do wysokości strony - domyślnie", + "default-margin": "Domyślny margines widżetów", + "default-background-color": "Domyślny kolor tła", + "sync-parent-state-params": "Synchronizuj parametry stanu z nadrzędnym panelem" }, - "dashboard-state":{ - "dashboard-state-settings":"Ustawienia stanu pulpitu", - "dashboard-state":"Identyfikator stanu pulpitu", - "autofill-state-layout":"Domyślne wypełnianie wysokości układu stanu automatycznie", - "default-margin":"Domyślny margines widżetów", - "default-background-color":"Domyślny kolor tła", - "sync-parent-state-params":"Synchronizuj parametry stanu z nadrzędnym pulpitem" - }, - "date-range-picker-settings":{ - "date-range-picker-settings":"Ustawienia wybieraka zakresu dat", - "hide-date-range-picker":"Ukryj wybierak zakresu dat", - "picker-one-panel":"Wybierak zakresu dat jednopanelowy", - "picker-auto-confirm":"Automatyczne potwierdzanie wybieraka zakresu dat", - "picker-show-template":"Pokazuj szablon wybieraka zakresu dat", - "first-day-of-week":"Pierwszy dzień tygodnia", - "interval-settings":"Ustawienia interwału", - "hide-interval":"Ukryj interwał", - "initial-interval":"Początkowy interwał", - "interval-hour":"Godzina", - "interval-day":"Dzień", - "interval-week":"Tydzień", - "interval-two-weeks":"2 tygodnie", - "interval-month":"Miesiąc", - "interval-three-months":"3 miesiące", - "interval-six-months":"6 miesięcy", - "step-settings":"Ustawienia kroku", - "hide-step-size":"Ukryj rozmiar kroku", - "initial-step-size":"Początkowy rozmiar kroku", - "hide-labels":"Ukryj etykiety", - "use-session-storage":"Użyj przechowywania sesji", - "localizationMap":{ - "Sun":"Niedz.", - "Mon":"Pon.", - "Tue":"Wt.", - "Wed":"Śr.", - "Thu":"Czw.", - "Fri":"Piąt.", - "Sat":"Sob.", - "Jan":"Sty", - "Feb":"Lut", - "Mar":"Mar", - "Apr":"Kwi", - "May":"Maj", - "Jun":"Cze", - "Jul":"Lip", - "Aug":"Sie", - "Sep":"Wrz", - "Oct":"Paź", - "Nov":"Lis", - "Dec":"Gru", - "January":"Styczeń", - "February":"Luty", - "March":"Marzec", - "April":"Kwiecień", - "June":"Czerwiec", - "July":"Lipiec", - "August":"Sierpień", - "September":"Wrzesień", - "October":"Październik", - "November":"Listopad", - "December":"Grudzień", - "Custom Date Range":"Niestandardowy zakres dat", - "Date Range Template":"Szablon zakresu dat", - "Today":"Dziś", - "Yesterday":"Wczoraj", - "This Week":"Bieżący tydzień", - "Last Week":"Ostatni tydzień", - "This Month":"Bieżący miesiąc", - "Last Month":"Ostatni miesiąc", - "Year":"Rok", - "This Year":"Bieżący rok", - "Last Year":"Ostatni rok", - "Date picker":"Wybierak dat", - "Hour":"Godzina", - "Day":"Dzień", - "Week":"Tydzień", - "2 weeks":"2 Tygodnie", - "Month":"Miesiąc", - "3 months":"3 Miesiące", - "6 months":"6 Miesięcy", - "Custom interval":"Niestandardowy interwał", - "Interval":"Interwał", - "Step size":"Rozmiar kroku", - "Ok":"Ok" + "date-range-navigator": { + "date-range-picker-settings": "Ustawienia selektora zakresu dat", + "hide-date-range-picker": "Ukryj selektor zakresu dat", + "picker-one-panel": "Selektor zakresu dat w jednym panelu", + "picker-auto-confirm": "Automatyczne potwierdzenie wyboru zakresu dat", + "picker-show-template": "Szablon pokaż selektor zakresu dat", + "first-day-of-week": "Pierwszy dzień tygodnia", + "interval-settings": "Ustawienia interwałów", + "hide-interval": "Ukryj interwał", + "initial-interval": "Początkowy odstęp", + "interval-hour": "Godzina", + "interval-day": "Dzień", + "interval-week": "Tydzień", + "interval-two-weeks": "2 tygodnie", + "interval-month": "Miesiąc", + "interval-three-months": "3 miesiące", + "interval-six-months": "6 miesięcy", + "step-settings": "Ustawienia kroku", + "hide-step-size": "Ukryj rozmiar kroku", + "initial-step-size": "Początkowy rozmiar kroku", + "hide-labels": "Ukryj etykiety", + "use-session-storage": "Użyj magazynu sesji", + "localizationMap": { + "Sun": "Ndz", + "Mon": "Pon", + "Tue": "Wt", + "Wed": "Śr", + "Thu": "Czw", + "Fri": "Pt", + "Sat": "Sob", + "Jan": "Sty", + "Feb": "Lut", + "Mar": "Mar", + "Apr": "Kwi", + "May": "Maj", + "Jun": "Cze", + "Jul": "Lip", + "Aug": "Sie", + "Sep": "Wrz", + "Oct": "Paź", + "Nov": "Lis", + "Dec": "Gru", + "January": "Styczeń", + "February": "Luty", + "March": "Marzec", + "April": "Kwiecień", + "June": "Czerwiec", + "July": "Lipiec", + "August": "Sierpień", + "September": "Wrzesień", + "October": "Październik", + "November": "Listopad", + "December": "Grudzień", + "Custom Date Range": "Niestandardowy zakres dat", + "Date Range Template": "Szablon zakresu dat", + "Today": "Dzisiaj", + "Yesterday": "Wczoraj", + "This Week": "W tym tygodniu", + "Last Week": "Zeszły tydzień", + "This Month": "Ten miesiąc", + "Last Month": "W zeszłym miesiącu", + "Year": "Rok", + "This Year": "W tym roku", + "Last Year": "Ostatni rok", + "Date picker": "Selektor dat", + "Hour": "Godzina", + "Day": "Dzień", + "Week": "Tydzień", + "2 weeks": "2 tygodnie", + "Month": "Miesiąc", + "3 months": "3 miesiące", + "6 months": "6 miesięcy", + "Custom interval": "Niestandardowy interwał", + "Interval": "Interwał", + "Step size": "Rozmiar kroku", + "Ok": "OK" } }, - "doughnut":{ - "total":"Suma", - "layout":"Układ", - "layout-default":"Domyślny", - "layout-with-total":"Z sumą", - "auto-scale":"Automatyczne skalowanie", - "clockwise-layout":"Układ zgodny z ruchem wskazówek zegara", - "sort-series":"Sortuj serie według etykiety", - "central-total-value":"Centralna wartość sumy", - "tooltip-value-type-absolute":"Bezwzględna", - "tooltip-value-type-percentage":"Procentowa", - "doughnut-card-style":"Styl karty pączka" + "entities-hierarchy": { + "hierarchy-data-settings": "Ustawienia danych hierarchii", + "relations-query-function": "Funkcja zapytania o relacje węzłów", + "has-children-function": "Węzeł ma funkcję potomną", + "node-state-settings": "Ustawienia stanu węzła", + "node-opened-function": "Domyślna funkcja otwierania węzła", + "node-disabled-function": "Funkcja węzła wyłączona", + "display-settings": "Ustawienia wyświetlania", + "node-icon-function": "Funkcja ikony węzła", + "node-text-function": "Funkcja tekstowa węzła", + "sort-settings": "Ustawienia sortowania", + "nodes-sort-function": "Funkcja sortowania węzłów" }, - "entities-hierarchy":{ - "hierarchy-data-settings":"Ustawienia danych hierarchii", - "relations-query-function":"Funkcja zapytania o relacje węzła", - "has-children-function":"Funkcja sprawdzająca, czy węzeł ma dzieci", - "node-state-settings":"Ustawienia stanu węzła", - "node-opened-function":"Domyślna funkcja otwierania węzła", - "node-disabled-function":"Funkcja dezaktywacji węzła", - "display-settings":"Ustawienia wyświetlania", - "node-icon-function":"Funkcja ikony węzła", - "node-text-function":"Funkcja tekstu węzła", - "sort-settings":"Ustawienia sortowania", - "nodes-sort-function":"Funkcja sortowania węzłów" + "edge": { + "display-default-title": "Wyświetl tytuł domyślny" }, - "edge":{ - "display-default-title":"Wyświetl domyślny tytuł" + "gateway": { + "general-settings": "Ustawienia główne", + "widget-title": "Tytul widzeta", + "default-archive-file-name": "Domyślna nazwa pliku archiwum", + "device-type-for-new-gateway": "Typ urządzenia dla nowej bramy", + "messages-settings": "Ustawienia wiadomości", + "save-config-success-message": "Wiadomość SMS o pomyślnym zapisaniu konfiguracji bramy", + "device-name-exists-message": "Wiadomość SMS, gdy urządzenie o podanej nazwie już istnieje", + "gateway-title": "Formularz bramy", + "read-only": "Tylko do odczytu", + "events-title": "Tytuł formularza zdarzenia bramy", + "events-filter": "Filtr zdarzeń", + "event-key-contains": "Klucz zdarzenia zawiera...", + "show-connector": "Show for the connector", + "connector-state-param-key": "Connector state parameter key", + "status": "Status", + "message": "Message", + "created-time": "Created time" }, - "gateway":{ - "general-settings":"Ustawienia ogólne", - "widget-title":"Tytuł widżetu", - "default-archive-file-name":"Domyślna nazwa pliku archiwum", - "device-type-for-new-gateway":"Typ urządzenia dla nowej bramy", - "messages-settings":"Ustawienia komunikatów", - "save-config-success-message":"Komunikat tekstowy o pomyślnie zapisanej konfiguracji bramy", - "device-name-exists-message":"Komunikat tekstowy, gdy urządzenie o podanej nazwie już istnieje", - "gateway-title":"Formularz bramy", - "read-only":"Tylko do odczytu", - "events-title":"Tytuł formularza zdarzeń bramy", - "events-filter":"Filtr zdarzeń", - "event-key-contains":"Klucz zdarzenia zawiera...", - "show-connector":"Pokaż dla konektora", - "connector-state-param-key":"Klucz parametru stanu konektora", - "status":"Status", - "message":"Wiadomość", - "created-time":"Czas utworzenia" + "gauge": { + "default-color": "Domyślny kolor", + "radial-gauge-settings": "Ustawienia miernika promieniowego", + "ticks-settings": "Ustawienia znaczników", + "min-value": "Minimalna wartość", + "max-value": "Maksymalna wartość", + "start-ticks-angle": "Startowy kąt znaczników", + "ticks-angle": "Kąt znaczników", + "major-ticks-count": "Liczba głównych znaczników", + "major-ticks-color": "Kolor głównych znaczników", + "minor-ticks-count": "Liczba pobocznych znaczników", + "minor-ticks-color": "Kolor pobocznych znaczników", + "tick-numbers-font": "Czcionka liczb znaczników", + "unit-title-settings": "Ustawienia tytułu jednostki", + "show-unit-title": "Pokaż tytuł jednostki", + "unit-title": "Tytuł jednostki", + "title-font": "Czcionka tekstu tytułowego", + "units-settings": "Ustawienia jednostki", + "units-font": "Czcionka tekstu jednostki", + "value-box-settings": "Ustawienia pola wartości", + "show-value-box": "Pokaż pole wartości", + "value-int": "Liczba cyfr całkowitej części wartości", + "value-font": "Wartość czcionki tekstu", + "value-box-rect-stroke-color": "Kolor obrysu prostokąta pola wartości", + "value-box-rect-stroke-color-end": "Kolor obrysu prostokąta pola wartości — koniec gradientu", + "value-box-background-color": "Kolor tła pola wartości", + "value-box-shadow-color": "Kolor cienia pola wartości", + "plate-settings": "Ustawienia tarczy", + "show-plate-border": "Pokaż obramowanie tarczy", + "plate-color": "Kolor tarczy", + "needle-settings": "Ustawienia igły", + "needle-circle-size": "Rozmiar okręgu igły", + "needle-color": "Kolor igły", + "needle-color-end": "Kolor igły - gradient końcowy", + "needle-color-shadow-up": "Górna połowa koloru cienia igły", + "needle-color-shadow-down": "Kolor igły w cieniu", + "highlights-settings": "Ustawienia wyróżnień", + "highlights-width": "Szerokość wyróżnień", + "highlights": "Wyróżnienia", + "highlight-from": "Od", + "highlight-to": "Do", + "highlight-color": "Kolor", + "no-highlights": "Nie skonfigurowano żadnych wyróżnień", + "add-highlight": "Dodaj wyróżnienie", + "animation-settings": "Ustawienia animacji", + "enable-animation": "Włącz animację", + "animation-duration": "Czas trwania animacji", + "animation-rule": "Zasada animacji", + "animation-linear": "Liniowa", + "animation-quad": "Kwadrat", + "animation-quint": "Kwinta", + "animation-cycle": "Cykl", + "animation-bounce": "Odbicie", + "animation-elastic": "Elastyczny", + "animation-dequad": "Dekwadrat", + "animation-dequint": "Dekwinta", + "animation-decycle": "Decykl", + "animation-debounce": "Deodbicie", + "animation-delastic": "Delastyczny", + "linear-gauge-settings": "Ustawienia miernika liniowego", + "bar-stroke-width": "Szerokość obrysu paska", + "bar-stroke-color": "Kolor obrysu paska", + "bar-background-color": "Kolor tła paska wskaźników", + "bar-background-color-end": "Kolor tła paska - koniec gradientu", + "progress-bar-color": "Kolor paska postępu", + "progress-bar-color-end": "Kolor paska postępu - koniec gradientu", + "major-ticks-names": "Nazwy głównych znaczników", + "show-stroke-ticks": "Pokaż obrys znaczników", + "major-ticks-font": "Czcionka głównych znaczników", + "border-color": "Kolor ramki", + "border-width": "Szerokość ramki", + "needle-circle-color": "Kolor okręgu igły", + "animation-target": "Cel animacji", + "animation-target-needle": "Igła", + "animation-target-plate": "Tarcza", + "common-settings": "Zwykłe ustawienia miernika", + "gauge-type": "Typ miernika", + "gauge-type-arc": "Łuk", + "gauge-type-donut": "Pączek", + "gauge-type-horizontal-bar": "Poziomy pasek", + "gauge-type-vertical-bar": "Pionowy pasek", + "donut-start-angle": "Kąt rozpoczęcia", + "bar-settings": "Ustawienia paska miernika", + "relative-bar-width": "Względna szerokość paska", + "neon-glow-brightness": "Jasność efektu blasku neonu, (0-100), 0 - wyłączenie efektu", + "stripes-thickness": "Grubość pasków, 0 - brak pasków", + "rounded-line-cap": "Wyświetl zaokrąglony koniec linii", + "bar-color-settings": "Ustawienia koloru paska", + "use-precise-level-color-values": "Używaj precyzyjnych poziomów kolorów", + "bar-colors": "Kolory pasków, od dołu do góry", + "color": "Kolor", + "no-bar-colors": "Nie skonfigurowano kolorów pasków", + "add-bar-color": "Dodaj kolor paska", + "from": "Od", + "to": "Do", + "fixed-level-colors": "Kolory pasków przy użyciu wartości Edge", + "gauge-title-settings": "Ustawienia tytułu miernika", + "show-gauge-title": "Pokaż tytuł miernika", + "gauge-title": "Tytuł miernika", + "gauge-title-font": "Czcionka tytułu miernika", + "unit-title-and-timestamp-settings": "Ustawienia tytułu jednostki i znacznika czasu", + "show-timestamp": "Pokaż znacznik czasu wartości", + "timestamp-format": "Format znacznika czasu", + "label-font": "Czcionka etykiety wyświetlana pod wartością", + "value-settings": "Ustawienia wartości", + "show-value": "Pokaż tekst wartości", + "min-max-settings": "Minimalne/maksymalne ustawienia etykiet", + "show-min-max": "Pokaż wartości minimalne i maksymalne", + "min-max-font": "Czcionka etykiet minimalnych i maksymalnych", + "show-ticks": "Pokaż znaczniki", + "tick-width": "Szerokość znacznika", + "tick-color": "Kolor znacznika", + "tick-values": "Wartości znacznika", + "no-tick-values": "Nie skonfigurowano żadnych wartości znaczników", + "add-tick-value": "Dodaj wartość znacznika" }, - "gauge":{ - "default-color":"Domyślny kolor", - "radial-gauge-settings":"Ustawienia miernika radialnego", - "ticks-settings":"Ustawienia podziałek", - "min-value":"Wartość minimalna", - "max-value":"Wartość maksymalna", - "min-value-short":"min", - "max-value-short":"max", - "start-ticks-angle":"Kąt początkowy podziałek", - "ticks-angle":"Kąt podziałek", - "major-ticks":"Podziałki główne", - "major-ticks-count":"Liczba podziałek głównych", - "major-ticks-color":"Kolor podziałek głównych", - "minor-ticks":"Podziałki dodatkowe", - "minor-ticks-count":"Liczba podziałek dodatkowych", - "minor-ticks-color":"Kolor podziałek dodatkowych", - "tick-numbers-font":"Czcionka numerów podziałek", - "unit-title-settings":"Ustawienia jednostki", - "show-unit-title":"Pokaż nazwę jednostki", - "unit-title":"Nazwa jednostki", - "title-font":"Czcionka tytułu", - "units-settings":"Ustawienia jednostek", - "units-font":"Czcionka jednostek", - "value-box-settings":"Ustawienia pola wartości", - "show-value-box":"Pokaż pole wartości", - "value-box":"Pole wartości", - "value-int":"Liczba cyfr dla części całkowitej wartości", - "value-text":"Tekst wartości", - "value-text-shadow":"Cień tekstu wartości", - "value-font":"Czcionka tekstu wartości", - "rect-stroke-color-start":"Kolor obwódki prostokąta - początek gradientu", - "rect-stroke-color-end":"Kolor obwódki prostokąta - koniec gradientu", - "background-color":"Kolor tła", - "shadow-color":"Kolor cienia", - "value-box-rect-stroke-color":"Kolor obwódki prostokąta pola wartości", - "value-box-rect-stroke-color-end":"Kolor obwódki prostokąta pola wartości - koniec gradientu", - "value-box-background-color":"Kolor tła pola wartości", - "value-box-shadow-color":"Kolor cienia pola wartości", - "plate-settings":"Ustawienia tarczy", - "show-plate-border":"Pokaż krawędź tarczy", - "plate-color":"Kolor tarczy", - "needle-settings":"Ustawienia wskazówki", - "needle-circle-size":"Rozmiar koła wskazówki", - "needle-color":"Kolor wskazówki", - "needle-color-start":"Kolor wskazówki - początek gradientu", - "needle-color-end":"Kolor wskazówki - koniec gradientu", - "needle-color-shadow-up":"Kolor górnej części cienia wskazówki", - "needle-color-shadow-down":"Cień", - "highlights-settings":"Ustawienia punktów kulminacyjnych", - "highlights-width":"Szerokość punktów kulminacyjnych", - "highlights":"Punkty kulminacyjne", - "highlight-from":"Od", - "highlight-to":"Do", - "highlight-color":"Kolor", - "no-highlights":"Brak skonfigurowanych punktów kulminacyjnych", - "add-highlight":"Dodaj punkt kulminacyjny", - "animation-settings":"Ustawienia animacji", - "enable-animation":"Animacja", - "animation-duration-rule":"Czas trwania i reguła animacji", - "animation-duration":"Czas trwania animacji", - "animation-rule":"Reguła animacji", - "animation-linear":"Liniowa", - "animation-quad":"Kwadratowa", - "animation-quint":"Kwintowa", - "animation-cycle":"Cykliczna", - "animation-bounce":"Odbijająca się", - "animation-elastic":"Elastyczna", - "animation-dequad":"Odwrócona kwadratowa", - "animation-dequint":"Odwrócona kwintowa", - "animation-decycle":"Odwrócona cykliczna", - "animation-debounce":"Odwrócona odbijająca się", - "animation-delastic":"Odwrócona elastyczna", - "linear-gauge-settings":"Ustawienia miernika liniowego", - "bar-stroke":"Obwódka słupka", - "bar-stroke-width":"Szerokość obwódki słupka", - "bar-stroke-color":"Kolor obwódki słupka", - "bar-background-color":"Kolor tła słupka - początek gradientu", - "bar-background-color-end":"Kolor tła słupka - koniec gradientu", - "progress-bar-color":"Kolor paska postępu", - "progress-bar":"Pasek postępu", - "progress-bar-color-start":"Kolor paska postępu - początek gradientu", - "progress-bar-color-end":"Kolor paska postępu - koniec gradientu", - "major-ticks-names":"Nazwy podziałek głównych", - "show-stroke-ticks":"Pokaż obwódki podziałek", - "major-ticks-font":"Czcionka podziałek głównych", - "border-color":"Kolor obramowania", - "border-width":"Szerokość obramowania", - "needle-circle":"Koło wskazówki", - "needle-circle-color":"Kolor koła wskazówki", - "animation-target":"Cel animacji", - "animation-target-needle":"Wskazówka", - "animation-target-plate":"Tarcza", - "common-settings":"Wspólne ustawienia miernika", - "gauge-type":"Typ miernika", - "gauge-type-arc":"Łuk", - "gauge-type-donut":"Pączek", - "gauge-type-horizontal-bar":"Słupkowy poziomy", - "gauge-type-vertical-bar":"Słupkowy pionowy", - "donut-start-angle":"Kąt początkowy pączka", - "bar-settings":"Ustawienia słupka", - "relative-bar-width":"Względna szerokość słupka", - "neon-glow-brightness":"Jasność efektu świetlnego, (0-100), 0 - wyłączony efekt", - "stripes-thickness":"Grubość pasków, 0 - brak pasków", - "rounded-line-cap":"Użyj zaokrąglonego zakończenia linii", - "bar-color-settings":"Ustawienia koloru słupka", - "use-precise-level-color-values":"Użyj precyzyjnych poziomów kolorów", - "bar-colors":"Kolory słupków, od dolnego do górnego", - "color":"Kolor", - "no-bar-colors":"Brak skonfigurowanych kolorów słupków", - "add-bar-color":"Dodaj kolor słupka", - "from":"Od", - "to":"Do", - "fixed-level-colors":"Kolory słupków z użyciem wartości granicznych", - "gauge-title-settings":"Ustawienia tytułu miernika", - "show-gauge-title":"Pokaż tytuł miernika", - "gauge-title":"Tytuł miernika", - "gauge-title-font":"Czcionka tytułu miernika", - "unit-title-and-timestamp-settings":"Ustawienia jednostki i znacznika czasowego", - "show-timestamp":"Pokaż znacznik czasu wartości", - "timestamp-format":"Format znacznika czasu", - "label-font":"Czcionka etykiety pod wartością", - "value-settings":"Ustawienia wartości", - "show-value":"Pokaż tekst wartości", - "min-max-settings":"Ustawienia etykiet minimalnej/maksymalnej", - "show-min-max":"Pokaż wartości minimalną i maksymalną", - "min-max-font":"Czcionka etykiet minimalnej i maksymalnej", - "show-ticks":"Pokaż podziały", - "tick-width":"Szerokość podziałek", - "tick-color":"Kolor podziałek", - "tick-values":"Wartości podziałek", - "no-tick-values":"Brak skonfigurowanych wartości podziałek", - "add-tick-value":"Dodaj wartość podziałki", - "gauge-appearance":"Wygląd miernika", - "units-title":"Tytuł jednostek", - "value":"Wartość", - "ticks":"Podziały", - "arrow-and-scale-color":"Kolor strzałki i skali domyślnej", - "scale-settings":"Ustawienia skali", - "scale":"Skala", - "scale-color":"Kolory skali", - "compass-appearance":"Wygląd kompasu", - "labels":"Etykiety", - "label-style":"Styl etykiety" + "gpio": { + "pin": "Pin", + "label": "Etykieta", + "row": "Wiersz", + "column": "Kolumna", + "color": "Kolor", + "panel-settings": "Ustawienia panelu", + "background-color": "Kolor tła", + "gpio-switches": "Przełączniki GPIO", + "no-gpio-switches": "Nie skonfigurowano żadnych przełączników GPIO", + "add-gpio-switch": "Dodaj przełącznik GPIO", + "gpio-status-request": "Żądanie statusu GPIO", + "method-name": "Nazwa metody", + "method-body": "Ciało metody", + "gpio-status-change-request": "Żądanie zmiany statusu GPIO", + "parse-gpio-status-function": "Przeanalizuj funkcję statusu gpio", + "gpio-leds": "Diody GPIO", + "no-gpio-leds": "Nie skonfigurowano żadnych diod GPIO", + "add-gpio-led": "Dodaj diodę GPIO" }, - "gpio":{ - "pin":"Pin", - "label":"Label", - "row":"Row", - "column":"Column", - "color":"Color", - "panel-settings":"Panel settings", - "background-color":"Background color", - "gpio-switches":"GPIO switches", - "no-gpio-switches":"No GPIO switches configured", - "add-gpio-switch":"Add GPIO switch", - "gpio-status-request":"GPIO status request", - "method-name":"Method name", - "method-body":"Method body", - "gpio-status-change-request":"GPIO status change request", - "parse-gpio-status-function":"Parse gpio status function", - "gpio-leds":"GPIO leds", - "no-gpio-leds":"No GPIO leds configured", - "add-gpio-led":"Add GPIO led" + "html-card": { + "html": "HTML", + "css": "CSS" }, - "html-card":{ - "html":"HTML", - "css":"CSS" + "input-widgets": { + "attribute-not-allowed": "W tym widżecie nie można używać parametru atrybutu", + "blocked-location": "Geolokalizacja jest zablokowana w Twojej przeglądarce", + "claim-device": "Przypisz urządzenie", + "claim-failed": "Nie udało się przypisać urządzenia!", + "claim-not-found": "Urządzenie nie zostało znalezione!", + "claim-successful": "Urządzenie zostało pomyślnie przypisane!", + "date": "Data", + "device-name": "Nazwa urządzenia", + "device-name-required": "Nazwa urządzenia jest wymagana", + "discard-changes": "Odrzuć zmiany", + "entity-attribute-required": "Atrybut obiektu jest wymagany", + "entity-coordinate-required": "Obydwa pola, szerokość i długość geograficzna, są wymagane", + "entity-timeseries-required": "Szeregi czasowe obiektu są wymagane", + "get-location": "Uzyskaj aktualną lokalizację", + "invalid-date": "Nieprawidłowa data", + "latitude": "Szerokość geograficzna", + "longitude": "Długość geograficzna", + "min-value-error": "Wartość minimalna to {{value}}", + "max-value-error": "Maksymalna wartość to {{value}}", + "not-allowed-entity": "Wybrany obiekt nie może mieć wspólnych atrybutów", + "no-attribute-selected": "Nie wybrano żadnego atrybutu", + "no-datakey-selected": "Nie wybrano klucza danych", + "no-coordinate-specified": "Nie określono klucza danych dla szerokości/długości geograficznej", + "no-entity-selected": "Nie wybrano żadnego obiektu", + "no-image": "Brak obrazka", + "no-support-geolocation": "Twoja przeglądarka nie obsługuje geolokalizacji", + "no-support-web-camera": "Twoja przeglądarka nie obsługuje kamer", + "enable-https-use-widget": "Aby korzystać z tego widżetu, włącz protokół HTTPS", + "no-found-your-camera": "Nie można znaleźć aparatu", + "no-permission-camera": "Użytkownik odmówił pozwolenia / Ta witryna nie ma uprawnień do korzystania z kamery", + "no-timeseries-selected": "Nie wybrano szeregów czasowych", + "secret-key": "Tajny klucz", + "secret-key-required": "Tajny klucz jest wymagany", + "switch-attribute-value": "Zmień wartość atrybutu obiektu", + "switch-camera": "Przełącz aparat", + "switch-timeseries-value": "Zmień wartość szeregu czasowego obiektu", + "take-photo": "Zrób zdjęcie", + "time": "Czas", + "timeseries-not-allowed": "W tym widżecie nie można używać parametru Timeseries", + "update-failed": "Aktualizacja nie powiodła się", + "update-successful": "Aktualizacja powiodła się", + "update-attribute": "Aktualizuj atrybut", + "update-timeseries": "Zaktualizuj szeregi czasowe", + "value": "Wartość", + "general-settings": "Ustawienia główne", + "widget-title": "Tytul widżetu", + "claim-button-label": "Przypisywnie etykiety przycisku", + "show-secret-key-field": "Pokaż pole wejściowe 'Tajny klucz'", + "labels-settings": "Ustawienia etykiet", + "show-labels": "Pokaż etykiety", + "device-name-label": "Etykieta pola wprowadzania nazwy urządzenia", + "secret-key-label": "Etykieta pola wprowadzania tajnego klucza", + "messages-settings": "Ustawienia wiadomości", + "claim-device-success-message": "Wiadomość tekstowa o pomyślnym przypisaniu urządzenia", + "claim-device-not-found-message": "Wiadomość tekstowa w przypadku nie znalezienia urządzenia", + "claim-device-failed-message": "Wiadomość tekstowa z informacją o nieudanym przypisaniu urządzenia", + "claim-device-name-required-message": "Komunikat o błędzie „Wymagana nazwa urządzenia”", + "claim-device-secret-key-required-message": "Komunikat o błędzie „Wymagany tajny klucz”", + "relations-settings": "Ustawienia relacji", + "relate-device-to-state-entity": "Powiąż urządzenie z obiektem bieżącego stanu", + "relate-direction": "Kierunek odniesienia", + "relate-direction-from": "Od", + "relate-direction-to": "Do", + "relation-type": "Typ relacji", + "show-label": "Pokaż etykietę", + "label": "Etykieta", + "required": "Wymagany", + "required-error-message": "Komunikat o błędzie „Wymagany”", + "show-result-message": "Pokaż komunikat o wynikach", + "integer-field-settings": "Ustawienia pola całkowitego", + "min-value": "Wartość minimalna", + "max-value": "Wartość maksymalna", + "double-field-settings": "Ustawienia podwójnego pola", + "text-field-settings": "Ustawienia pola tekstowego", + "min-length": "Minimalna długość", + "max-length": "Maksymalna długość", + "checkbox-settings": "Ustawienia pola wyboru", + "true-label": "Sprawdzona etykieta", + "false-label": "Niesprawdzona etykieta", + "image-input-settings": "Ustawienia wejścia obrazu", + "display-preview": "Wyświetl podgląd", + "display-clear-button": "Przycisk czyszczenia wyświetlacza", + "display-apply-button": "Wyświetl przycisk zastosowania", + "display-discard-button": "Wyświetl przycisk odrzucania", + "datetime-field-settings": "Ustawienia pola daty/godziny", + "display-time-input": "Wyświetl wprowadzony czas", + "latitude-key-name": "Nazwa klucza szerokości geograficznej", + "longitude-key-name": "Nazwa klucza długości geograficznej", + "show-get-location-button": "Pokaż przycisk „Pobierz aktualną lokalizację”", + "use-high-accuracy": "Użyj wysokiej dokładności", + "location-fields-settings": "Ustawienia pól lokalizacji", + "latitude-label": "Etykieta szerokości geograficznej", + "longitude-label": "Etykieta długości geograficznej", + "input-fields-alignment": "Wyrównanie pól wejściowych", + "input-fields-alignment-column": "Kolumna (domyślna)", + "input-fields-alignment-row": "Wiersz", + "layout": "Layout", + "row-gap": "Gap between rows in pixels", + "column-gap": "Gap between columns in pixels", + "latitude-field-required": "Wymagane pole szerokości geograficznej", + "longitude-field-required": "Wymagane pole długości geograficznej", + "attribute-settings": "Ustawienia atrybutów", + "widget-mode": "Tryb widgetu", + "widget-mode-update-attribute": "Aktualizuj atrybut", + "widget-mode-update-timeseries": "Zaktualizuj szeregi czasowe", + "attribute-scope": "Zakres atrybutu", + "attribute-scope-server": "Atrybut serwera", + "attribute-scope-shared": "Wspólny atrybut", + "value-required": "Wymagana wartość", + "image-settings": "Ustawienia obrazu", + "image-format": "Format obrazu", + "image-format-jpeg": "JPG", + "image-format-png": "PNG", + "image-format-webp": "WEBP", + "image-quality": "Jakość obrazu korzystająca z kompresji stratnej, np. JPEG i WebP", + "max-image-width": "Maksymalna szerokość obrazu", + "max-image-height": "Maksymalna wysokość obrazu", + "action-buttons": "Przyciski akcji", + "show-action-buttons": "Pokaż przyciski akcji", + "update-all-values": "Zaktualizuj wszystkie wartości, a nie tylko zmodyfikowane", + "save-button-label": "Etykieta przycisku „ZAPISZ”", + "reset-button-label": "Etykieta przycisku „COFNIJ”", + "group-settings": "Ustawienia grupy", + "show-group-title": "Pokaż tytuł grupy pól powiązanych z różnymi obiektami", + "group-title": "Tytuł grupy", + "fields-alignment": "Wyrównanie pól", + "fields-alignment-row": "Wiersz (domyślny)", + "fields-alignment-column": "Kolumna", + "fields-in-row": "Liczba pól w wierszu", + "option-value": "Wartość (wpisz „null”, aby utworzyć pustą opcję)", + "option-label": "Etykieta", + "hide-input-field": "Ukryj pole wprowadzania", + "datakey-type": "Typ klucza danych", + "datakey-type-server": "Atrybut serwera (domyślny)", + "datakey-type-shared": "Wspólny atrybut", + "datakey-type-timeseries": "Szereg czasowy", + "datakey-value-type": "Typ wartości klucza danych", + "datakey-value-type-string": "Łańcuch znaków", + "datakey-value-type-double": "Liczba zmiennoprzecinkowa podwójnej precyzji", + "datakey-value-type-integer": "Liczba całkowita", + "datakey-value-type-json": "JSON", + "datakey-value-type-boolean-checkbox": "Wartość logiczna (pole wyboru)", + "datakey-value-type-boolean-switch": "Wartość logiczna (przełącznik)", + "datakey-value-type-date-time": "Data i czas", + "datakey-value-type-date": "Data", + "datakey-value-type-time": "Czas", + "datakey-value-type-select": "Wybierz", + "datakey-value-type-color": "Color", + "value-is-required": "Wartość jest wymagana", + "ability-to-edit-attribute": "Możliwość edycji atrybutu", + "ability-to-edit-attribute-editable": "Edytowalne (domyślne)", + "ability-to-edit-attribute-disabled": "Wyłączone", + "ability-to-edit-attribute-readonly": "Tylko do odczytu", + "disable-on-datakey-name": "Wyłącz w przypadku fałszywej wartości innego klucza danych (podaj nazwę klucza danych)", + "field-appearance": "Field appearance", + "appearance-fill": "Fill", + "appearance-outline": "Outline", + "subscript-sizing": "Subscript sizing", + "subscript-sizing-fixed": "Fixed", + "subscript-sizing-dynamic": "Dynamic", + "slide-toggle-settings": "Ustawienia przełączania suwaka", + "slide-toggle-label-position": "Przesuń przełącznik pozycji etykiety", + "slide-toggle-label-position-after": "Po", + "slide-toggle-label-position-before": "Przed", + "select-options": "Wybierz opcje", + "no-select-options": "Nie skonfigurowano opcji wyboru", + "add-select-option": "Dodaj opcję wyboru", + "numeric-field-settings": "Ustawienia pola numerycznego", + "step-interval": "Odstęp kroku między wartościami", + "error-messages": "Komunikaty o błędach", + "min-value-error-message": "Komunikat o błędzie „Wartość minimalna”", + "max-value-error-message": "Komunikat o błędzie „Wartość maksymalna”", + "invalid-date-error-message": "Komunikat o błędzie „Nieprawidłowa data”", + "invalid-JSON-error-message": "Komunikat o błędzie „Nieprawidłowy JSON”", + "icon-settings": "Ustawienia ikon", + "dialog-editor-settings": "Ustawienia edytora okien dialogowych", + "use-custom-icon": "Użyj niestandardowej ikony", + "input-cell-icon": "Ikona wyświetlana przed komórką wejściową", + "value-conversion-settings": "Ustawienia konwersji wartości", + "get-value-settings": "Uzyskaj ustawienia wartości", + "use-get-value-function": "Użyj funkcji getValue", + "get-value-function": "funkcja getValue", + "set-value-settings": "Ustaw ustawienia wartości", + "use-set-value-function": "Użyj funkcji setValue", + "set-value-function": "funkcja setValue", + "json-invalid": "Wartość JSON ma nieprawidłowy format", + "title": "Tytuł", + "cancel-button-label": "Etykieta przycisku „Anuluj”" }, - "input-widgets":{ - "attribute-not-allowed":"Parametr atrybutu nie może być używany w tym widżecie", - "blocked-location":"Geolokalizacja jest zablokowana w twojej przeglądarce", - "claim-device":"Zgłoś urządzenie", - "claim-failed":"Nie udało się zgłosić urządzenia!", - "claim-not-found":"Nie znaleziono urządzenia!", - "claim-successful":"Urządzenie zostało pomyślnie zgłoszone!", - "date":"Data", - "device-name":"Nazwa urządzenia", - "device-name-required":"Wymagana jest nazwa urządzenia", - "discard-changes":"Odrzuć zmiany", - "entity-attribute-required":"Wymagany jest atrybut encji", - "entity-coordinate-required":"Wymagane są obie pola, szerokość geograficzna i długość geograficzna", - "entity-timeseries-required":"Wymagany jest szereg czasowy encji", - "get-location":"Pobierz bieżącą lokalizację", - "invalid-date":"Nieprawidłowa data", - "latitude":"Szerokość geograficzna", - "longitude":"Długość geograficzna", - "min-value-error":"Wartość minimalna to {{value}}", - "max-value-error":"Wartość maksymalna to {{value}}", - "not-allowed-entity":"Wybrana encja nie może mieć współdzielonych atrybutów", - "no-attribute-selected":"Nie wybrano atrybutu", - "no-datakey-selected":"Nie wybrano klucza danych", - "no-coordinate-specified":"Nie określono klucza danych dla szerokości/długości geograficznej", - "no-entity-selected":"Nie wybrano encji", - "no-image":"Brak obrazu", - "no-support-geolocation":"Twoja przeglądarka nie obsługuje geolokalizacji", - "no-support-web-camera":"Twoja przeglądarka nie obsługuje kamer", - "enable-https-use-widget":"Proszę włączyć protokół HTTPS, aby korzystać z tego widżetu", - "no-found-your-camera":"Nie można znaleźć twojej kamery", - "no-permission-camera":"Użytkownik odmówił zgody / Ta witryna nie ma uprawnień do korzystania z kamery", - "no-timeseries-selected":"Nie wybrano szeregu czasowego", - "secret-key":"Tajny klucz", - "secret-key-required":"Wymagany jest tajny klucz", - "switch-attribute-value":"Przełącz wartość atrybutu encji", - "switch-camera":"Przełącz kamerę", - "switch-timeseries-value":"Przełącz wartość szeregu czasowego encji", - "take-photo":"Zrób zdjęcie", - "time":"Czas", - "timeseries-not-allowed":"Parametr szeregu czasowego nie może być używany w tym widżecie", - "update-failed":"Aktualizacja nieudana", - "update-successful":"Aktualizacja udana", - "update-attribute":"Zaktualizuj atrybut", - "update-timeseries":"Zaktualizuj szereg czasowy", - "value":"Wartość", - "general-settings":"Ustawienia ogólne", - "widget-title":"Tytuł widżetu", - "claim-button-label":"Etykieta przycisku zgłaszania", - "show-secret-key-field":"Pokaż pole wprowadzania „Tajny klucz”", - "labels-settings":"Ustawienia etykiet", - "show-labels":"Pokaż etykiety", - "device-name-label":"Etykieta pola wprowadzania nazwy urządzenia", - "secret-key-label":"Etykieta pola wprowadzania tajnego klucza", - "messages-settings":"Ustawienia wiadomości", - "claim-device-success-message":"Komunikat o udanym zgłoszeniu urządzenia", - "claim-device-not-found-message":"Komunikat, gdy urządzenie nie zostało znalezione", - "claim-device-failed-message":"Komunikat o nieudanym zgłoszeniu urządzenia", - "claim-device-name-required-message":"Komunikat błędu „Wymagana nazwa urządzenia”", - "claim-device-secret-key-required-message":"Komunikat błędu „Wymagany tajny klucz”", - "show-label":"Pokaż etykietę", - "label":"Etykieta", - "required":"Wymagane", - "required-error-message":"Komunikat błędu „Wymagane”", - "show-result-message":"Pokaż komunikat z wynikiem", - "integer-field-settings":"Ustawienia pola całkowitego", - "min-value":"Wartość minimalna", - "max-value":"Wartość maksymalna", - "double-field-settings":"Ustawienia pola liczbowego", - "text-field-settings":"Ustawienia pola tekstowego", - "min-length":"Minimalna długość", - "max-length":"Maksymalna długość", - "checkbox-settings":"Ustawienia pola wyboru", - "true-label":"Etykieta zaznaczenia", - "false-label":"Etykieta odznaczenia", - "image-input-settings":"Ustawienia wejścia obrazu", - "display-preview":"Wyświetl podgląd", - "display-clear-button":"Wyświetl przycisk Wyczyść", - "display-apply-button":"Wyświetl przycisk Zastosuj", - "display-discard-button":"Wyświetl przycisk Odrzuć", - "datetime-field-settings":"Ustawienia pola daty/czasu", - "display-time-input":"Wyświetl pole czasowe", - "latitude-key-name":"Nazwa klucza szerokości geograficznej", - "longitude-key-name":"Nazwa klucza długości geograficznej", - "show-get-location-button":"Pokaż przycisk „Pobierz bieżącą lokalizację”", - "use-high-accuracy":"Użyj wysokiej dokładności", - "location-fields-settings":"Ustawienia pól lokalizacji", - "latitude-label":"Etykieta dla szerokości geograficznej", - "longitude-label":"Etykieta dla długości geograficznej", - "input-fields-alignment":"Wyrównanie pól wprowadzania", - "input-fields-alignment-column":"Kolumna (domyślnie)", - "input-fields-alignment-row":"Rząd", - "layout":"Układ", - "row-gap":"Odstęp między rzędami w pikselach", - "column-gap":"Odstęp między kolumnami w pikselach", - "latitude-field-required":"Pole szerokości geograficznej jest wymagane", - "longitude-field-required":"Pole długości geograficznej jest wymagane", - "attribute-settings":"Ustawienia atrybutu", - "widget-mode":"Tryb widżetu", - "widget-mode-update-attribute":"Zaktualizuj atrybut", - "widget-mode-update-timeseries":"Zaktualizuj szereg czasowy", - "attribute-scope":"Zakres atrybutu", - "attribute-scope-server":"Atrybut serwera (domyślnie)", - "attribute-scope-shared":"Współdzielony atrybut", - "value-required":"Wartość wymagana", - "image-settings":"Ustawienia obrazu", - "image-format":"Format obrazu", - "image-format-jpeg":"JPEG", - "image-format-png":"PNG", - "image-format-webp":"WEBP", - "image-quality":"Jakość obrazu stosująca kompresję stratną, np. jpeg i webp", - "max-image-width":"Maksymalna szerokość obrazu", - "max-image-height":"Maksymalna wysokość obrazu", - "action-buttons":"Przyciski akcji", - "show-action-buttons":"Pokaż przyciski akcji", - "update-all-values":"Zaktualizuj wszystkie wartości, nie tylko zmodyfikowane", - "save-button-label":"Etykieta przycisku „ZAPISZ”", - "reset-button-label":"Etykieta przycisku „COFNIJ”", - "group-settings":"Ustawienia grupy", - "show-group-title":"Pokaż tytuł grupy pól związanych z różnymi encjami", - "group-title":"Tytuł grupy", - "fields-alignment":"Wyrównanie pól", - "fields-alignment-row":"Rząd (domyślnie)", - "fields-alignment-column":"Kolumna", - "fields-in-row":"Liczba pól w rzędzie", - "option-value":"Wartość (wpisz „null”, aby utworzyć pustą opcję)", - "option-label":"Etykieta", - "hide-input-field":"Ukryj pole wprowadzania", - "datakey-type":"Typ klucza danych", - "datakey-type-server":"Atrybut serwera (domyślnie)", - "datakey-type-shared":"Współdzielony atrybut", - "datakey-type-timeseries":"Szereg czasowy", - "datakey-value-type":"Typ wartości klucza danych", - "datakey-value-type-string":"Ciąg znaków", - "datakey-value-type-double":"Liczba zmiennoprzecinkowa", - "datakey-value-type-integer":"Liczba całkowita", - "datakey-value-type-json":"JSON", - "datakey-value-type-boolean-checkbox":"Boolean (Pole wyboru)", - "datakey-value-type-boolean-switch":"Boolean (Przełącznik)", - "datakey-value-type-date-time":"Data i godzina", - "datakey-value-type-date":"Data", - "datakey-value-type-time":"Czas", - "datakey-value-type-select":"Wybierz", - "datakey-value-type-color":"Kolor", - "value-is-required":"Wartość jest wymagana", - "ability-to-edit-attribute":"Zdolność do edycji atrybutu", - "ability-to-edit-attribute-editable":"Edytowalny (domyślnie)", - "ability-to-edit-attribute-disabled":"Wyłączony", - "ability-to-edit-attribute-readonly":"Tylko do odczytu", - "disable-on-datakey-name":"Wyłącz na fałszywą wartość innego klucza danych (podaj nazwę klucza danych)", - "field-appearance":"Wygląd pola", - "appearance-fill":"Wypełnienie", - "appearance-outline":"Obrys", - "subscript-sizing":"Rozmiar indeksu dolnego", - "subscript-sizing-fixed":"Stały", - "subscript-sizing-dynamic":"Dynamiczny", - "slide-toggle-settings":"Ustawienia przełącznika", - "slide-toggle-label-position":"Pozycja etykiety przełącznika", - "slide-toggle-label-position-after":"Po", - "slide-toggle-label-position-before":"Przed", - "select-options":"Opcje wyboru", - "no-select-options":"Brak skonfigurowanych opcji wyboru", - "add-select-option":"Dodaj opcję wyboru", - "numeric-field-settings":"Ustawienia pola numerycznego", - "step-interval":"Interwał kroku pomiędzy wartościami", - "error-messages":"Komunikaty o błędach", - "min-value-error-message":"Komunikat o błędzie 'Wartość minimalna'", - "max-value-error-message":"Komunikat o błędzie 'Wartość maksymalna'", - "invalid-date-error-message":"Komunikat o błędzie 'Nieprawidłowa data'", - "invalid-JSON-error-message":"Komunikat o błędzie 'Nieprawidłowy JSON'", - "icon-settings":"Ustawienia ikony", - "dialog-editor-settings":"Ustawienia edytora dialogu", - "use-custom-icon":"Użyj niestandardowej ikony", - "input-cell-icon":"Ikona do wyświetlenia przed komórką wejściową", - "value-conversion-settings":"Ustawienia konwersji wartości", - "get-value-settings":"Ustawienia pobierania wartości", - "use-get-value-function":"Użyj funkcji getValue", - "get-value-function":"Funkcja getValue", - "set-value-settings":"Ustawienia ustawiania wartości", - "use-set-value-function":"Użyj funkcji setValue", - "set-value-function":"Funkcja setValue", - "json-invalid":"Wartość JSON ma nieprawidłowy format", - "title":"Tytuł", - "cancel-button-label":"Etykieta przycisku 'Anuluj'" + "invalid-qr-code-text": "Nieprawidłowy tekst wejściowy dla kodu QR. Wartość wpisana powinna być łańcuchem znaków", + "qr-code": { + "use-qr-code-text-function": "Użyj funkcji tekstowej kodu QR", + "qr-code-text-pattern": "Wzór tekstu kodu QR (np. '${entityName} | ${keyName} – jakiś tekst.')", + "qr-code-text-pattern-hint": "Wzorzec tekstu kodu QR wykorzystuje wartość pierwszego znalezionego klucza w obiektach w aliasie obiektu", + "qr-code-text-pattern-required": "Wymagany jest wzór tekstu kodu QR", + "qr-code-text-function": "Funkcja tekstu kodu QR" }, - "invalid-qr-code-text":"Nieprawidłowy tekst wejściowy dla kodu QR. Wejście powinno być typu string.", - "qr-code":{ - "use-qr-code-text-function":"Użyj funkcji tekstowej kodu QR", - "qr-code-text-pattern":"Wzór tekstu kodu QR (np. '${entityName} | ${keyName} - jakiś tekst.')", - "qr-code-text-pattern-hint":"Wzór tekstu kodu QR używa wartości pierwszego znalezionego klucza w encjach w aliasie encji.", - "qr-code-text-pattern-required":"Wzór tekstu kodu QR jest wymagany.", - "qr-code-text-function":"Funkcja tekstu kodu QR" + "label-widget": { + "label-pattern": "Wzór", + "label-pattern-hint": "Podpowiedź: np. 'Text ${keyName} units.' or ${#<key index>} units'", + "label-pattern-required": "Wzór jest wymagany", + "label-position": "Pozycja (procent w stosunku do tła)", + "x-pos": "X", + "y-pos": "Y", + "background-color": "Kolor tła", + "font-settings": "Ustawienia czcionki", + "background-image": "Zdjęcie w tle", + "labels": "Etykiety", + "no-labels": "Nie skonfigurowano żadnych etykiet", + "add-label": "Dodaj etykietę" }, - "label-widget":{ - "label-pattern":"Wzór", - "label-pattern-hint":"Wskazówka: na przykład 'Tekst ${keyName} jednostki.' lub ${#<index klucza>} jednostki'", - "label-pattern-required":"Wzór jest wymagany", - "label-position":"Położenie (Procentowo w stosunku do tła)", - "x-pos":"X", - "y-pos":"Y", - "background-color":"Kolor tła", - "font-settings":"Ustawienia czcionki", - "background-image":"Obraz tła", - "labels":"Etykiety", - "no-labels":"Brak skonfigurowanych etykiet", - "add-label":"Dodaj etykietę" + "navigation": { + "title": "Tytuł", + "navigation-path": "Ścieżka nawigacji", + "filter-type": "Typ filtra", + "filter-type-all": "Wszystkie przedmioty", + "filter-type-include": "Uwzględnij elementy", + "filter-type-exclude": "Wyklucz elementy", + "items": "Rzeczy", + "enter-urls-to-filter": "Wprowadź adresy URL, aby filtrować..." }, - "navigation":{ - "title":"Tytuł", - "navigation-path":"Ścieżka nawigacji", - "filter-type":"Typ filtru", - "filter-type-all":"Wszystkie elementy", - "filter-type-include":"Zawiera elementy", - "filter-type-exclude":"Wyklucza elementy", - "items":"Elementy", - "enter-urls-to-filter":"Wprowadź adresy URL do filtrowania..." - }, - "persistent-table":{ - "rpc-id":"ID RPC", - "message-type":"Typ wiadomości", - "method":"Metoda", - "params":"Parametry", - "created-time":"Czas utworzenia", - "expiration-time":"Czas wygaśnięcia", - "retries":"Próby", - "status":"Status", - "filter":"Filtr", - "refresh":"Odśwież", - "add":"Dodaj żądanie RPC", - "details":"Szczegóły", - "delete":"Usuń", - "delete-request-title":"Usuń trwałe żądanie RPC", - "delete-request-text":"Czy na pewno chcesz usunąć to żądanie?", - "details-title":"Szczegóły ID RPC: ", - "additional-info":"Dodatkowe informacje", - "response":"Odpowiedź", - "any-status":"Dowolny status", - "rpc-status-list":"Lista statusów RPC", - "no-request-prompt":"Brak żądań do wyświetlenia", - "send-request":"Wyślij żądanie", - "add-title":"Utwórz trwałe żądanie RPC", - "method-error":"Wymagana jest metoda.", - "timeout-error":"Minimalna wartość czasu oczekiwania to 5000 (5 sekund).", - "white-space-error":"Biała przestrzeń nie jest dozwolona.", - "rpc-status":{ - "QUEUED":"W KOLEJCE", - "SENT":"WYSŁANE", - "DELIVERED":"DOSTARCZONE", - "SUCCESSFUL":"UDANE", - "TIMEOUT":"PRZEKROCZONY LIMIT CZASU", - "EXPIRED":"WYGASŁE", - "FAILED":"NIEUDANE" + "persistent-table": { + "rpc-id": "Identyfikator RPC", + "message-type": "Typ wiadomości", + "method": "Metoda", + "params": "Parametry", + "created-time": "Stworzony czas", + "expiration-time": "Data ważności", + "retries": "Ponowne próby", + "status": "Status", + "filter": "Filtr", + "refresh": "Odśwież", + "add": "Dodaj żądanie RPC", + "details": "Szczegóły", + "delete": "Usuń", + "delete-request-title": "Usuń trwałe żądanie RPC", + "delete-request-text": "Czy na pewno chcesz usunąć prośbę?", + "details-title": "Szczegóły Identyfikator RPC: ", + "additional-info": "dodatkowe informacje", + "response": "Odpowiedź", + "any-status": "Dowolny status", + "rpc-status-list": "Lista stanu RPC", + "no-request-prompt": "Brak żądania wyświetlenia", + "send-request": "Wyślij prośbę", + "add-title": "Utwórz trwałe żądanie RPC", + "method-error": "Metoda jest wymagana.", + "timeout-error": "Minimalna wartość limitu czasu wynosi 5000 (5 sekund).", + "white-space-error": "Znak biały jest niedozwolony.", + "rpc-status": { + "QUEUED": "W KOLEJCE", + "SENT": "WYSŁANO", + "DELIVERED": "DOSTARCZONY", + "SUCCESSFUL": "SUKCES", + "TIMEOUT": "KONIEC CZASU", + "EXPIRED": "WYGASŁY", + "FAILED": "NIEUDANY" }, - "rpc-search-status-all":"WSZYSTKO", - "message-types":{ - "false":"Dwukierunkowe", - "true":"Jednokierunkowe" + "rpc-search-status-all": "WSZYSTKO", + "message-types": { + "false": "Dwukierunkowe", + "true": "Jednokierunkowa" }, "general-settings":"Ustawienia ogólne", "enable-filter":"Włącz filtr", @@ -5930,778 +7236,752 @@ "fill-area":"Wypełnij obszar", "range-chart-style":"Styl wykresu zakresu" }, - "rpc":{ - "value-settings":"Ustawienia wartości", - "initial-value":"Początkowa wartość", - "retrieve-value-settings":"Ustawienia pobierania włączonej/wyłączonej wartości", - "retrieve-value-method":"Pobierz wartość za pomocą metody", - "retrieve-value-method-none":"Nie pobieraj", - "retrieve-value-method-rpc":"Wywołaj metodę pobierania wartości RPC", - "retrieve-value-method-attribute":"Subskrybuj atrybut", - "retrieve-value-method-timeseries":"Subskrybuj szereg czasowy", - "attribute-value-key":"Klucz atrybutu", - "timeseries-value-key":"Klucz szeregu czasowego", - "get-value-method":"Metoda RPC pobierz wartość", - "parse-value-function":"Funkcja analizy wartości", - "update-value-settings":"Ustawienia aktualizacji wartości", - "set-value-method":"Metoda RPC ustaw wartość", - "convert-value-function":"Funkcja konwersji wartości", - "rpc-settings":"Ustawienia RPC", - "request-timeout":"Limit czasu żądania RPC (ms)", - "persistent-rpc-settings":"Ustawienia trwałego RPC", - "request-persistent":"Trwałe żądanie RPC", - "persistent-polling-interval":"Interwał odpytywania (ms) w celu uzyskania odpowiedzi na trwałe polecenie RPC", - "common-settings":"Wspólne ustawienia", - "switch-title":"Tytuł przełącznika", - "show-on-off-labels":"Pokaż etykiety włącz/wyłącz", - "slide-toggle-label":"Etykieta przycisku przełącznika", - "label-position":"Pozycja etykiety", - "label-position-before":"Przed", - "label-position-after":"Po", - "slider-color":"Kolor suwaka", - "slider-color-primary":"Podstawowy", - "slider-color-accent":"Akcent", - "slider-color-warn":"Ostrzeżenie", - "button-style":"Styl przycisku", - "button-raised":"Podniesiony przycisk", - "button-primary":"Podstawowy kolor", - "button-background-color":"Kolor tła przycisku", - "button-text-color":"Kolor tekstu przycisku", - "widget-title":"Tytuł widżetu", - "button-label":"Etykieta przycisku", - "device-attribute-scope":"Zakres atrybutu urządzenia", - "server-attribute":"Atrybut serwera", - "shared-attribute":"Atrybut wspólny", - "device-attribute-parameters":"Parametry atrybutu urządzenia", - "is-one-way-command":"Jest to polecenie jednokierunkowe", - "rpc-method":"Metoda RPC", - "rpc-method-params":"Parametry metody RPC", - "show-rpc-error":"Pokaż błąd wykonania polecenia RPC", - "led-title":"Tytuł diody LED", - "led-color":"Kolor diody LED", - "check-status-settings":"Ustawienia sprawdzania statusu", - "perform-rpc-status-check":"Wykonaj sprawdzanie statusu urządzenia RPC", - "retrieve-led-status-value-method":"Pobierz stan diody LED za pomocą metody", - "led-status-value-attribute":"Atrybut urządzenia zawierający stan diody LED", - "led-status-value-timeseries":"Szereg czasowy urządzenia zawierający stan diody LED", - "check-status-method":"Metoda sprawdzania statusu urządzenia RPC", - "parse-led-status-value-function":"Funkcja analizy stanu diody LED", - "knob-title":"Tytuł pokrętła", - "min-value":"Minimalna wartość", - "max-value":"Maksymalna wartość" + "rpc": { + "value-settings": "Ustawienia wartości", + "initial-value": "Wartość początkowa", + "retrieve-value-settings": "Pobierz ustawienia wartości włączenia/wyłączenia", + "retrieve-value-method": "Pobierz wartość za pomocą metody", + "retrieve-value-method-none": "Nie odzyskuj", + "retrieve-value-method-rpc": "Wywołaj metodę pobierania wartości RPC", + "retrieve-value-method-attribute": "Subskrybuj atrybut", + "retrieve-value-method-timeseries": "Subskrybuj serie czasowe", + "attribute-value-key": "Klucz atrybutu", + "timeseries-value-key": "Klucz do serii czasowych", + "get-value-method": "Metoda pobierania wartości RPC", + "parse-value-function": "Przeanalizuj funkcję wartości", + "update-value-settings": "Zaktualizuj ustawienia wartości", + "set-value-method": "Metoda wartości zadanej RPC", + "convert-value-function": "Konwertuj funkcję wartości", + "rpc-settings": "Ustawienia RPC", + "request-timeout": "Limit czasu żądania RPC (ms)", + "persistent-rpc-settings": "Trwałe ustawienia RPC", + "request-persistent": "Żądanie RPC trwałe", + "persistent-polling-interval": "Interwał odpytywania (ms) w celu uzyskania trwałej odpowiedzi na polecenie RPC", + "common-settings": "Podstawowe ustawienia", + "switch-title": "Zmień tytuł", + "show-on-off-labels": "Pokaż etykiety włączania/wyłączania", + "slide-toggle-label": "Przesuń etykietę przełączania", + "label-position": "Pozycja etykiety", + "label-position-before": "Przed", + "label-position-after": "Po", + "slider-color": "Kolor suwaka", + "slider-color-primary": "Podstawowy", + "slider-color-accent": "Akcent", + "slider-color-warn": "Ostrzegaj", + "button-style": "Styl guzika", + "button-raised": "Podniesiony przycisk", + "button-primary": "Kolor podstawowy", + "button-background-color": "Kolor tła przycisku", + "button-text-color": "Kolor tekstu przycisku", + "widget-title": "Tytuł widżetu", + "button-label": "Etykieta przycisku", + "device-attribute-scope": "Zakres atrybutów urządzenia", + "server-attribute": "Atrybut serwera", + "shared-attribute": "Wspólny atrybut", + "device-attribute-parameters": "Parametry atrybutów urządzenia", + "is-one-way-command": "Jest poleceniem jednokierunkowym", + "rpc-method": "Metoda RPC", + "rpc-method-params": "Parametry metody RPC", + "show-rpc-error": "Pokaż błąd wykonania polecenia RPC", + "led-title": "Tytuł diody LED", + "led-color": "Kolor diody LED", + "check-status-settings": "Sprawdź ustawienia stanu", + "perform-rpc-status-check": "Wykonaj sprawdzenie stanu urządzenia RPC", + "retrieve-led-status-value-method": "Pobierz wartość stanu diody LED za pomocą metody", + "led-status-value-attribute": "Atrybut urządzenia zawierający wartość stanu diody LED", + "led-status-value-timeseries": "Szereg czasowy urządzenia zawierający wartość stanu diody LED", + "check-status-method": "Metoda sprawdzania stanu urządzenia przez RPC", + "parse-led-status-value-function": "Przeanalizuj funkcję wartości stanu diody LED", + "knob-title": "Tytuł pokrętła", + "min-value": "Minimalna wartość", + "max-value": "Maksymalna wartość" }, - "maps":{ - "select-entity":"Wybierz jednostkę", - "select-entity-hint":"Wskazówka: po wybraniu kliknij na mapie, aby ustawić pozycję", - "tooltips":{ - "placeMarker":"Kliknij, aby umieścić jednostkę '{{entityName}}'", - "firstVertex":"Wielokąt dla '{{entityName}}': kliknij, aby umieścić pierwszy punkt", - "firstVertex-cut":"Kliknij, aby umieścić pierwszy punkt", - "continueLine":"Wielokąt dla '{{entityName}}': kliknij, aby kontynuować rysowanie", - "continueLine-cut":"Kliknij, aby kontynuować rysowanie", - "finishLine":"Kliknij na istniejący znacznik, aby zakończyć", - "finishPoly":"Wielokąt dla '{{entityName}}': kliknij na pierwszy znacznik, aby zakończyć i zapisać", - "finishPoly-cut":"Kliknij na pierwszy znacznik, aby zakończyć i zapisać", - "finishRect":"Wielokąt dla '{{entityName}}': kliknij, aby zakończyć i zapisać", - "startCircle":"Okrąg dla '{{entityName}}': kliknij, aby umieścić środek okręgu", - "finishCircle":"Okrąg dla '{{entityName}}': kliknij, aby zakończyć okrąg", - "placeCircleMarker":"Kliknij, aby umieścić znacznik okręgu" + "maps": { + "select-entity": "Wybierz obiekt", + "select-entity-hint": "Wskazówka: po dokonaniu wyboru kliknij na mapę, aby ustawić pozycję", + "tooltips": { + "placeMarker": "Kliknij, aby umieścić obiekt '{{entityName}}'", + "firstVertex": "Poligon dla '{{entityName}}': kliknij, aby umieścić pierwszy punkt", + "firstVertex-cut": "Kliknij, aby umieścić pierwszy punkt", + "continueLine": "Poligon dla '{{entityName}}': kliknij, aby kontynuować rysowanie", + "continueLine-cut": "Kliknij, aby kontynuować rysowanie", + "finishLine": "Aby zakończyć, kliknij dowolny istniejący znacznik", + "finishPoly": "Poligon dla '{{entityName}}': kliknij pierwszy znacznik, aby zakończyć i zapisać", + "finishPoly-cut": "Kliknij pierwszy znacznik, aby zakończyć i zapisać", + "finishRect": "Poligon dla '{{entityName}}': kliknij, aby zakończyć i zapisać", + "startCircle": "Okrąg dla '{{entityName}}': kliknij, aby umieścić środek okręgu", + "finishCircle": "Okrąg dla '{{entityName}}': kliknij, aby zakończyć okrąg", + "placeCircleMarker": "Kliknij, aby umieścić znacznik okręgu" }, - "actions":{ - "finish":"Zakończ", - "cancel":"Anuluj", - "removeLastVertex":"Usuń ostatni punkt" + "actions": { + "finish": "Zakończ", + "cancel": "Anuluj", + "removeLastVertex": "Usuń ostatni punkt" }, - "buttonTitles":{ - "drawMarkerButton":"Umieść obiekt", - "drawPolyButton":"Utwórz wielokąt", - "drawLineButton":"Utwórz linię", - "drawCircleButton":"Utwórz okrąg", - "drawRectButton":"Utwórz prostokąt", - "editButton":"Tryb edycji", - "dragButton":"Tryb przeciągania", - "cutButton":"Odcinanie obszaru wielokąta", - "deleteButton":"Usuń", - "drawCircleMarkerButton":"Utwórz znacznik okręgu", - "rotateButton":"Obróć wielokąt" + "buttonTitles": { + "drawMarkerButton": "Umieść obiekt", + "drawPolyButton": "Utwórz poligon", + "drawLineButton": "Utwórz polilinię", + "drawCircleButton": "Utwórz okrąg", + "drawRectButton": "Utwórz prostokąt", + "editButton": "Tryb edycji", + "dragButton": "Tryb przeciągnij i upuść", + "cutButton": "Wytnij obszar poligonu", + "deleteButton": "Usuń", + "drawCircleMarkerButton": "Utwórz znacznik okręgu", + "rotateButton": "Obróć poligon" }, - "map-provider-settings":"Ustawienia dostawcy map", - "map-provider":"Dostawca map", - "map-provider-google":"Google Maps", - "map-provider-openstreet":"OpenStreet Maps", - "map-provider-here":"HERE Maps", - "map-provider-image":"Mapa obrazu", - "map-provider-tencent":"Tencent Maps", - "openstreet-provider":"Dostawca mapy OpenStreet", - "openstreet-provider-mapnik":"OpenStreetMap.Mapnik (Domyślny)", - "openstreet-provider-hot":"OpenStreetMap.HOT", - "openstreet-provider-esri-street":"Esri.WorldStreetMap", - "openstreet-provider-esri-topo":"Esri.WorldTopoMap", - "openstreet-provider-esri-imagery":"Esri.WorldImagery", - "openstreet-provider-cartodb-positron":"CartoDB.Positron", - "openstreet-provider-cartodb-dark-matter":"CartoDB.DarkMatter", - "use-custom-provider":"Użyj dostawcy niestandardowego", - "custom-provider-tile-url":"Niestandardowy adres URL kafelka dostawcy", - "google-maps-api-key":"Klucz API Google Maps", - "default-map-type":"Domyślny rodzaj mapy", - "google-map-type-roadmap":"Mapa drogowa", - "google-map-type-satelite":"Satelita", - "google-map-type-hybrid":"Hybrydowa", - "google-map-type-terrain":"Tereno", - "map-layer":"Warstwa mapy", - "here-map-normal-day":"HERE.normalDay (Domyślna)", - "here-map-normal-night":"HERE.normalNight", - "here-map-hybrid-day":"HERE.hybridDay", - "here-map-terrain-day":"HERE.terrainDay", - "credentials":"Poświadczenia", - "here-app-id":"ID aplikacji HERE", - "here-app-code":"Kod aplikacji HERE", - "here-api-key":"Klucz API HERE", - "here-use-new-version-api-3":"Użyj wersji API 3", - "tencent-maps-api-key":"Klucz API Tencent Maps", - "tencent-map-type-roadmap":"Mapa drogowa", - "tencent-map-type-satelite":"Satelita", - "tencent-map-type-hybrid":"Hybrydowa", - "image-map-background":"Tło mapy obrazu", - "image-map-background-from-entity-attribute":"Użyj tła mapy obrazu z atrybutu encji", - "image-url-source-entity-alias":"Źródło URL obrazu z aliasu encji", - "image-url-source-entity-attribute":"Źródło URL obrazu z atrybutu encji", - "common-map-settings":"Wspólne ustawienia mapy", - "x-pos-key-name":"Nazwa klucza X", - "y-pos-key-name":"Nazwa klucza Y", - "latitude-key-name":"Nazwa klucza szerokości geograficznej", - "longitude-key-name":"Nazwa klucza długości geograficznej", - "default-map-zoom-level":"Domyślny poziom przybliżenia mapy (0 - 20)", - "default-map-center-position":"Domyślna pozycja centralna mapy (0,0)", - "disable-scroll-zooming":"Wyłącz przybliżanie za pomocą przewijania", - "disable-double-click-zooming":"Wyłącz przybliżanie podwójnym kliknięciem", - "disable-zoom-control-buttons":"Wyłącz przyciski sterowania przybliżeniem", - "fit-map-bounds":"Dopasuj granice mapy, aby pokryć wszystkie markery", - "use-default-map-center-position":"Użyj domyślnej pozycji centralnej mapy", - "entities-limit":"Limit encji do wczytania", - "markers-settings":"Ustawienia znaczników", - "marker-offset-x":"Przesunięcie X znacznika względem pozycji pomnożone przez szerokość znacznika", - "marker-offset-y":"Przesunięcie Y znacznika względem pozycji pomnożone przez wysokość znacznika", - "position-function":"Funkcja konwersji pozycji, powinna zwracać współrzędne x, y jako liczby z zakresu od 0 do 1", - "draggable-marker":"Znacznik do przeciągania", - "label":"Etykieta", - "show-label":"Pokaż etykietę", - "use-label-function":"Użyj funkcji etykiety", - "label-pattern":"Etykieta (przykłady wzorców: '${entityName}', '${entityName}: (Tekst ${keyName} jednostki.)' )", - "label-function":"Funkcja etykiety", - "tooltip":"Podpowiedź", - "show-tooltip":"Pokaż podpowiedź", - "show-tooltip-action":"Działanie wyświetlania podpowiedzi", - "show-tooltip-action-click":"Pokaż podpowiedź po kliknięciu (Domyślnie)", - "show-tooltip-action-hover":"Pokaż podpowiedź po najechaniu", - "auto-close-tooltips":"Automatyczne zamykanie podpowiedzi", - "use-tooltip-function":"Użyj funkcji podpowiedzi", - "tooltip-pattern":"Podpowiedź (np. 'Tekst ${keyName} jednostki.' lub Tekst linku')", - "tooltip-function":"Funkcja podpowiedzi", - "tooltip-offset-x":"Przesunięcie X podpowiedzi względem kotwicy znacznika pomnożone przez szerokość znacznika", - "tooltip-offset-y":"Przesunięcie Y podpowiedzi względem kotwicy znacznika pomnożone przez wysokość znacznika", - "color":"Kolor", - "use-color-function":"Użyj funkcji koloru", - "color-function":"Funkcja koloru", - "marker-image":"Obraz znacznika", - "use-marker-image-function":"Użyj funkcji obrazu znacznika", - "custom-marker-image":"Niestandardowy obraz znacznika", - "custom-marker-image-size":"Niestandardowy rozmiar obrazu znacznika (px)", - "marker-image-function":"Funkcja obrazu znacznika", - "marker-images":"Obrazy znaczników", - "polygon-settings":"Ustawienia wielokąta", - "show-polygon":"Pokaż wielokąt", - "polygon-key-name":"Nazwa klucza wielokąta", - "enable-polygon-edit":"Włącz edycję wielokąta", - "polygon-label":"Etykieta wielokąta", - "show-polygon-label":"Pokaż etykietę wielokąta", - "use-polygon-label-function":"Użyj funkcji etykiety wielokąta", - "polygon-label-pattern":"Etykieta wielokąta (przykłady wzorców: '${entityName}', '${entityName}: (Tekst ${keyName} jednostki.)' )", - "polygon-label-function":"Funkcja etykiety wielokąta", - "polygon-tooltip":"Podpowiedź wielokąta", - "show-polygon-tooltip":"Pokaż podpowiedź wielokąta", - "auto-close-polygon-tooltips":"Automatyczne zamykanie podpowiedzi wielokąta", - "use-polygon-tooltip-function":"Użyj funkcji podpowiedzi wielokąta", - "polygon-tooltip-pattern":"Podpowiedź (np. 'Tekst ${keyName} jednostki.' lub Tekst linku')", - "polygon-tooltip-function":"Funkcja podpowiedzi wielokąta", - "polygon-color":"Kolor wielokąta", - "polygon-opacity":"Przezroczystość wielokąta", - "use-polygon-color-function":"Użyj funkcji koloru wielokąta", - "polygon-color-function":"Funkcja koloru wielokąta", - "polygon-stroke":"Obrys wielokąta", - "stroke-color":"Kolor obrysu", - "stroke-opacity":"Przezroczystość obrysu", - "stroke-weight":"Grubość obrysu", - "use-polygon-stroke-color-function":"Użyj funkcji koloru obrysu wielokąta", - "polygon-stroke-color-function":"Funkcja koloru obrysu wielokąta", - "circle-settings":"Ustawienia okręgu", - "show-circle":"Pokaż okrąg", - "circle-key-name":"Nazwa klucza okręgu", - "enable-circle-edit":"Włącz edycję okręgu", - "circle-label":"Etykieta okręgu", - "show-circle-label":"Pokaż etykietę okręgu", - "use-circle-label-function":"Użyj funkcji etykiety okręgu", - "circle-label-pattern":"Etykieta okręgu (przykłady wzorców: '${entityName}', '${entityName}: (Tekst ${keyName} jednostki.)' )", - "circle-label-function":"Funkcja etykiety okręgu", - "circle-tooltip":"Podpowiedź okręgu", - "show-circle-tooltip":"Pokaż podpowiedź okręgu", - "auto-close-circle-tooltips":"Automatyczne zamykanie podpowiedzi okręgu", - "use-circle-tooltip-function":"Użyj funkcji podpowiedzi okręgu", - "circle-tooltip-pattern":"Podpowiedź (np. 'Tekst ${keyName} jednostki.' lub Tekst linku')", - "circle-tooltip-function":"Funkcja podpowiedzi okręgu", - "circle-fill-color":"Kolor wypełnienia okręgu", - "circle-fill-color-opacity":"Przezroczystość koloru wypełnienia okręgu", - "use-circle-fill-color-function":"Użyj funkcji koloru wypełnienia okręgu", - "circle-fill-color-function":"Funkcja koloru wypełnienia okręgu", - "circle-stroke":"Obrys okręgu", - "use-circle-stroke-color-function":"Użyj funkcji koloru obrysu okręgu", - "circle-stroke-color-function":"Funkcja koloru obrysu okręgu", - "markers-clustering-settings":"Ustawienia grupowania znaczników", - "use-map-markers-clustering":"Użyj grupowania znaczników na mapie", - "zoom-on-cluster-click":"Powiększ po kliknięciu na klastrze", - "max-cluster-zoom":"Maksymalny poziom powiększenia, przy którym znacznik może być częścią klastra (0 - 18)", - "max-cluster-radius-pixels":"Maksymalny promień, który może obejmować klaster w pikselach", - "cluster-zoom-animation":"Pokaż animację znaczników podczas przybliżania", - "show-markers-bounds-on-cluster-mouse-over":"Pokaż granice znaczników po najechaniu myszą na klaster", - "spiderfy-max-zoom-level":"Rozpoznaj na najwyższym poziomie powiększenia (aby zobaczyć wszystkie znaczniki klastra)", - "load-optimization":"Optymalizacja ładowania", - "cluster-chunked-loading":"Użyj fragmentów do dodawania znaczników, aby strona się nie zawiesiła", - "cluster-markers-lazy-load":"Użyj ładowania opóźnionego do dodawania znaczników", - "editor-settings":"Ustawienia edytora", - "enable-snapping":"Włącz przyciąganie do innych wierzchołków dla precyzyjnego rysowania", - "init-draggable-mode":"Inicjalizuj mapę w trybie przeciągania", - "hide-all-edit-buttons":"Ukryj wszystkie przyciski edycji", - "hide-draw-buttons":"Ukryj przyciski rysowania", - "hide-edit-buttons":"Ukryj przyciski edycji", - "hide-remove-button":"Ukryj przycisk usuwania", - "route-map-settings":"Ustawienia mapy trasy", - "trip-animation-settings":"Ustawienia animacji podróży", - "normalization-step":"Krok normalizacji danych (ms)", - "tooltip-background-color":"Kolor tła podpowiedzi", - "tooltip-font-color":"Kolor czcionki podpowiedzi", - "tooltip-opacity":"Przezroczystość podpowiedzi (0-1)", - "auto-close-tooltip":"Automatyczne zamykanie podpowiedzi", - "rotation-angle":"Ustaw dodatkowy kąt obrotu dla znacznika (stopnie)", - "path-settings":"Ustawienia ścieżki", - "path-color":"Kolor ścieżki", - "use-path-color-function":"Użyj funkcji koloru ścieżki", - "path-color-function":"Funkcja koloru ścieżki", - "path-decorator":"Dekorator ścieżki", - "use-path-decorator":"Użyj dekoratora ścieżki", - "decorator-symbol":"Symbol dekoratora", - "decorator-symbol-arrow-head":"Strzała", - "decorator-symbol-dash":"Kreska", - "decorator-symbol-size":"Rozmiar symbolu dekoratora (px)", - "use-path-decorator-custom-color":"Użyj niestandardowego koloru dekoratora ścieżki", - "decorator-custom-color":"Niestandardowy kolor dekoratora", - "decorator-offset":"Przesunięcie dekoratora", - "end-decorator-offset":"Przesunięcie końcowe dekoratora", - "decorator-repeat":"Powtórzenie dekoratora", - "points-settings":"Ustawienia punktów", - "show-points":"Pokaż punkty", - "point-color":"Kolor punktu", - "point-size":"Rozmiar punktu (px)", - "use-point-color-function":"Użyj funkcji koloru punktu", - "point-color-function":"Funkcja koloru punktu", - "use-point-as-anchor":"Użyj punktu jako kotwicy", - "point-as-anchor-function":"Funkcja punktu jako kotwicy", - "independent-point-tooltip":"Niezależna podpowiedź punktu", - "clustering-markers":"Klastrowanie znaczników", - "use-icon-create-function":"Użyj funkcji koloru znaczników", - "marker-color-function":"Funkcja koloru znacznika" + "map-provider-settings": "Ustawienia dostawcy map", + "map-provider": "Dostawca map", + "map-provider-google": "Google maps", + "map-provider-openstreet": "OpenStreet maps", + "map-provider-here": "HERE maps", + "map-provider-image": "Image map", + "map-provider-tencent": "Tencent maps", + "openstreet-provider": "OpenStreet map provider", + "openstreet-provider-mapnik": "OpenStreetMap.Mapnik (Domyślny)", + "openstreet-provider-hot": "OpenStreetMap.HOT", + "openstreet-provider-esri-street": "Esri.WorldStreetMap", + "openstreet-provider-esri-topo": "Esri.WorldTopoMap", + "openstreet-provider-esri-imagery": "Esri.WorldImagery", + "openstreet-provider-cartodb-positron": "CartoDB.Positron", + "openstreet-provider-cartodb-dark-matter": "CartoDB.DarkMatter", + "use-custom-provider": "Użyj niestandardowego dostawcy", + "custom-provider-tile-url": "Niestandardowy kafelek URL dostawcy", + "google-maps-api-key": "Klucz API Google Maps", + "default-map-type": "Domyślny typ mapy", + "google-map-type-roadmap": "Mapa drogowa", + "google-map-type-satelite": "Satelita", + "google-map-type-hybrid": "Hybrydowy", + "google-map-type-terrain": "Teren", + "map-layer": "Warstwa mapy", + "here-map-normal-day": "HERE.normalDay (Domyślne)", + "here-map-normal-night": "HERE.normalNight", + "here-map-hybrid-day": "HERE.hybridDay", + "here-map-terrain-day": "HERE.terrainDay", + "credentials": "dane uwierzytelniające", + "here-app-id": "TUTAJ identyfikator aplikacji", + "here-app-code": "TUTAJ kod aplikacji", + "here-api-key": "TUTAJ klucz API", + "here-use-new-version-api-3": "Użyj wersji API 3", + "tencent-maps-api-key": "Klucz API Tencent Maps", + "tencent-map-type-roadmap": "Mapa drogowa", + "tencent-map-type-satelite": "Satelita", + "tencent-map-type-hybrid": "Hybrydowy", + "image-map-background": "Tło mapy obrazu", + "image-map-background-from-entity-attribute": "Pobierz tło mapy obrazu z atrybutu obiektu", + "image-url-source-entity-alias": "Alias ​​obiektu źródłowej adresu URL obrazu", + "image-url-source-entity-attribute": "Atrybut obiektu źródłowej adresu URL obrazu", + "common-map-settings": "Typowe ustawienia mapy", + "x-pos-key-name": "Nazwa klawisza pozycji X", + "y-pos-key-name": "Nazwa klawisza pozycji Y", + "latitude-key-name": "Nazwa klucza szerokości geograficznej", + "longitude-key-name": "Nazwa klucza długości geograficznej", + "default-map-zoom-level": "Domyślny poziom powiększenia mapy (0 - 20)", + "default-map-center-position": "Domyślna pozycja środkowa mapy (0,0)", + "disable-scroll-zooming": "Wyłącz powiększanie podczas przewijania", + "disable-double-click-zooming": "Wyłącz powiększanie za pomocą podwójnego kliknięcia", + "disable-zoom-control-buttons": "Wyłącz przyciski sterowania zoomem", + "fit-map-bounds": "Dopasuj granice mapy, aby pokryć wszystkie znaczniki", + "use-default-map-center-position": "Użyj domyślnej pozycji środkowej mapy", + "entities-limit": "Limit obiektów do załadowania", + "markers-settings": "Ustawienia znaczników", + "marker-offset-x": "Przesunięcie znacznika X względem pozycji pomnożonej przez szerokość znacznika", + "marker-offset-y": "Przesunięcie znacznika Y względem pozycji pomnożonej przez wysokość znacznika", + "position-function": "Funkcja konwersji pozycji powinna zwracać współrzędne x, y w postaci liczby zmiennoprzecinkowej podwójnej precyji od 0 do 1 każda", + "draggable-marker": "Przeciągany znacznik", + "label": "Etykieta", + "show-label": "Pokaż etykietę", + "use-label-function": "Użyj funkcji etykiety", + "label-pattern": "Etykieta (przykłady wzorców: '${entityName}', '${entityName}: (Tekst ${keyName} jednostki.)' )", + "label-function": "Funkcja etykiety", + "tooltip": "Podpowiedź", + "show-tooltip": "Pokaż podpowiedź", + "show-tooltip-action": "Akcja służąca do wyświetlania podpowiedzi", + "show-tooltip-action-click": "Pokaż podpowiedź po kliknięciu (domyślne)", + "show-tooltip-action-hover": "Pokaż podpowiedź po najechaniu myszką", + "auto-close-tooltips": "Automatyczne zamykanie podpowiedzi", + "use-tooltip-function": "Użyj funkcji podpowiedzi", + "tooltip-pattern": "Podpowiedź (np. „Tekst ${keyName} jednostki.” lub tekst linku')", + "tooltip-function": "Funkcja podpowiedzi", + "tooltip-offset-x": "Przesunięcie X podpowiedzi względem kotwicy znacznika pomnożonej przez szerokość znacznika", + "tooltip-offset-y": "Przesunięcie Y podpowiedzi w stosunku do kotwicy znacznika pomnożonej przez wysokość znacznika", + "color": "Kolor", + "use-color-function": "Użyj funkcji koloru", + "color-function": "Funkcja koloru", + "marker-image": "Obraz znacznika", + "use-marker-image-function": "Użyj funkcji obrazu znacznika", + "custom-marker-image": "Niestandardowy obraz znacznika", + "custom-marker-image-size": "Niestandardowy rozmiar obrazu znacznika (px)", + "marker-image-function": "Funkcja obrazu znacznika", + "marker-images": "Obrazy znaczników", + "polygon-settings": "Ustawienia poligonu", + "show-polygon": "Pokaż poligon", + "polygon-key-name": "Nazwa klucza poligonu", + "enable-polygon-edit": "Włącz edycję poligonu", + "polygon-label": "Etykieta poligonu", + "show-polygon-label": "Pokaż etykietę poligonu", + "use-polygon-label-function": "Użyj funkcji etykiety poligonu", + "polygon-label-pattern": "Etykieta poligonu (przykłady wzorców: '${entityName}', '${entityName}: (Tekst ${keyName} jednostki.)' )", + "polygon-label-function": "Funkcja etykiety poligonu", + "polygon-tooltip": "Etykietka poligonu", + "show-polygon-tooltip": "Pokaż podpowiedź poligonu", + "auto-close-polygon-tooltips": "Automatyczne zamykanie etykiet poligonu", + "use-polygon-tooltip-function": "Użyj funkcji podpowiedzi poligonu", + "polygon-tooltip-pattern": "Etykietka narzędzia (np. „Tekst ${keyName} jednostki.” lub tekst linku')", + "polygon-tooltip-function": "Funkcja podpowiedzi poligonu", + "polygon-color": "Kolor poligonu", + "polygon-opacity": "Nieprzezroczystość poligonu", + "use-polygon-color-function": "Użyj funkcji koloru poligonu", + "polygon-color-function": "Funkcja koloru poligonu", + "polygon-stroke": "Obrys poligonu", + "stroke-color": "Kolor obrysu", + "stroke-opacity": "Nieprzezroczystość obrysu", + "stroke-weight": "Waga obrysu", + "use-polygon-stroke-color-function": "Użyj funkcji koloru obrysu poligonu", + "polygon-stroke-color-function": "Funkcja koloru obrysu poligonu", + "circle-settings": "Ustawienia kręgu", + "show-circle": "Pokaż okrąg", + "circle-key-name": "Nazwa klucza okręgu", + "enable-circle-edit": "Włącz edycję okręgu", + "circle-label": "Etykieta okręgu", + "show-circle-label": "Pokaż etykietę okręgu", + "use-circle-label-function": "Użyj funkcji etykiety okręgu", + "circle-label-pattern": "Etykieta okrągła (przykłady wzorów: '${entityName}', '${entityName}: (Tekst ${keyName} obiektu.)' )", + "circle-label-function": "Funkcja etykiety okręgu", + "circle-tooltip": "Okrągła podpowiedź", + "show-circle-tooltip": "Pokaż podpowiedź okręgu", + "auto-close-circle-tooltips": "Automatyczne zamykanie podpowiedzi w okręgu", + "use-circle-tooltip-function": "Użyj funkcji podpowiedzi okręgu", + "circle-tooltip-pattern": "Etykietka narzędzia (np. „Tekst ${keyName} obiektu.” lub tekst linku')", + "circle-tooltip-function": "Funkcja podpowiedzi okręgu", + "circle-fill-color": "Kolor wypełnienia okręgu", + "circle-fill-color-opacity": "Nieprzezroczystość koloru wypełnienia okręgu", + "use-circle-fill-color-function": "Użyj funkcji koloru wypełnienia okręgu", + "circle-fill-color-function": "Funkcja koloru wypełnienia okręgu", + "circle-stroke": "Obrys okręgu", + "use-circle-stroke-color-function": "Użyj funkcji koloru obrysu okręgu", + "circle-stroke-color-function": "Funkcja koloru obrysu okręgu", + "markers-clustering-settings": "Ustawienia grupowania znaczników", + "use-map-markers-clustering": "Użyj grupowania znaczników mapy", + "zoom-on-cluster-click": "Powiększ po kliknięciu klastra", + "max-cluster-zoom": "Maksymalny poziom powiększenia, gdy znacznik może być częścią klastra (0–18)", + "max-cluster-radius-pixels": "Maksymalny promień, jaki będzie obejmował klaster w pikselach", + "cluster-zoom-animation": "Pokaż animację na znacznikach podczas powiększania", + "show-markers-bounds-on-cluster-mouse-over": "Pokaż granice znaczników, gdy najedziesz myszką na klaster", + "spiderfy-max-zoom-level": "Rozrzedź na maksymalnym poziomie powiększenia (aby zobaczyć wszystkie znaczniki klastrów)", + "load-optimization": "Optymalizacja obciążenia", + "cluster-chunked-loading": "Do dodawania znaczników używaj fragmentów, aby strona się nie zawieszała", + "cluster-markers-lazy-load": "Do dodawania znaczników używaj leniwego ładowania", + "editor-settings": "Ustawienia edytora", + "enable-snapping": "Włącz przyciąganie do innych wierzchołków w celu precyzyjnego rysowania", + "init-draggable-mode": "Zainicjuj mapę w trybie przeciągania", + "hide-all-edit-buttons": "Ukryj wszystkie przyciski sterujące edycją", + "hide-draw-buttons": "Ukryj przyciski rysowania", + "hide-edit-buttons": "Ukryj przyciski edycji", + "hide-remove-button": "Ukryj przycisk usuwania", + "route-map-settings": "Ustawienia mapy drogowej", + "trip-animation-settings": "Ustawienia animacji podróży", + "normalization-step": "Krok normalizacji danych (ms)", + "tooltip-background-color": "Kolor tła podpowiedzi", + "tooltip-font-color": "Kolor czcionki podpowiedzi", + "tooltip-opacity": "Nieprzezroczystość podpowiedzi (0-1)", + "auto-close-tooltip": "Automatyczne zamykanie podpowiedzi", + "rotation-angle": "Ustaw dodatkowy kąt obrotu znacznika (stopnie)", + "path-settings": "Ustawienia ścieżki", + "path-color": "Kolor ścieżki", + "use-path-color-function": "Użyj funkcji koloru ścieżki", + "path-color-function": "Funkcja koloru ścieżki", + "path-decorator": "Dekorator ścieżek", + "use-path-decorator": "Użyj dekoratora ścieżek", + "decorator-symbol": "Symbol dekoratora", + "decorator-symbol-arrow-head": "Strzałka", + "decorator-symbol-dash": "Kropla", + "decorator-symbol-size": "Rozmiar symbolu dekoratora (px)", + "use-path-decorator-custom-color": "Użyj niestandardowego koloru dekoratora ścieżek", + "decorator-custom-color": "Kolor niestandardowy dekoratora", + "decorator-offset": "Przesunięcie dekoratora", + "end-decorator-offset": "Przesunięcie dekoratora końcowego", + "decorator-repeat": "Powtórzenie dekoratora", + "points-settings": "Ustawienia punktów", + "show-points": "Pokaż punkty", + "point-color": "Kolor punktowy", + "point-size": "Rozmiar punktu (px)", + "use-point-color-function": "Użyj funkcji koloru punktu", + "point-color-function": "Funkcja koloru punktu", + "use-point-as-anchor": "Użyj punktu jako kotwicy", + "point-as-anchor-function": "Punkt jako funkcja kotwicy", + "independent-point-tooltip": "Niezależna podpowiedź dotycząca punktu", + "clustering-markers": "Markery grupujące", + "use-icon-create-function": "Użyj funkcji koloru znaczników", + "marker-color-function": "Funkcja koloru znacznika" }, - "markdown":{ - "use-markdown-text-function":"Użyj funkcji wartości markdown/HTML", - "markdown-text-function":"Funkcja wartości markdown/HTML", - "markdown-text-pattern":"Wzorzec markdown/HTML (markdown lub HTML z zmiennymi, np. '${entityName} lub ${keyName} - jakiś tekst.')", - "apply-default-markdown-style":"Zastosuj domyślny styl markdown", - "markdown-css":"CSS markdown/HTML" + "markdown": { + "use-markdown-text-function": "Użyj funkcji markdown/wartości HTML", + "markdown-text-function": "Funkcja Markdown/wartości HTML", + "markdown-text-pattern": "Wzorzec Markdown/HTML (markdown lub HTML ze zmiennymi, np. „${entityName} lub ${keyName} - jakiś tekst.”)", + "apply-default-markdown-style": "Zastosuj domyślny styl przeceny", + "markdown-css": "Markdown/HTML CSS" }, - "simple-card":{ - "label":"Etykieta", - "label-position":"Pozycja etykiety", - "label-position-left":"Po lewej", - "label-position-top":"Na górze" + "simple-card": { + "label": "Label", + "label-position": "Pozycja etykiety", + "label-position-left": "Po lewej", + "label-position-top": "Na górze" }, - "value-card":{ - "layout":"Układ", - "layout-square":"Kwadratowy", - "layout-vertical":"Pionowy", - "layout-centered":"Wyśrodkowany", - "layout-simplified":"Uproszczony", - "layout-horizontal":"Poziomy", - "layout-horizontal-reversed":"Odwrócony poziomy", - "label":"Etykieta", - "icon":"Ikona", - "value":"Wartość", - "date":"Data", - "value-card-style":"Styl karty wartości", - "auto-scale":"Automatyczne dostosowanie skali" + "value-card": { + "layout": "Layout", + "layout-square": "Square", + "layout-vertical": "Vertical", + "layout-centered": "Centered", + "layout-simplified": "Simplified", + "layout-horizontal": "Horizontal", + "layout-horizontal-reversed": "Horizontal reversed", + "label": "Label", + "icon": "Icon", + "value": "Value", + "date": "Date", + "value-card-style": "Value card style" }, - "liquid-level-card":{ - "layout-simple":"Prosty", - "layout-percentage":"Procentowy", - "layout-absolute":"Bezwzględny", - "layout":"Układ", - "background-overlay":"Nakładka na tło wartości", - "total-volume":"Całkowita objętość", - "tank":"Zbiornik", - "shape":"Kształt", - "datasource-units":"Jednostki źródła danych", - "widget-units":"Jednostki widżetu", - "decimals":"Miejsca dziesiętne", - "liquid":"Ciecz", - "liquid-color":"Kolor cieczy", - "value":"Wartość", - "value-font":"Czcionka wartości", - "level":"Poziom", - "last-update":"Ostatnia aktualizacja", - "shape-by-attribute":"Ustaw kształt zbiornika według nazwy atrybutu", - "tooltip-background":"Kolor tła", - "background-blur":"Rozmycie tła", - "tank-color":"Kolor zbiornika", - "static":"Statyczny", - "see-examples":"Zobacz przykłady", - "attribute":"Atrybut", - "shape-type":"Typ", - "v-oval":"Pionowy Owal", - "v-cylinder":"Pionowy Cylinder", - "v-capsule":"Pionowa Kapsuła", - "rectangle":"Prostokąt", - "h-oval":"Poziomy Owal", - "h-ellipse":"Pozioma Elipsa", - "h-dish-ends":"Poziome Zakończenia Dzbanka", - "h-cylinder":"Poziomy Cylinder", - "h-capsule":"Pozioma Kapsuła", - "h-elliptical_2_1":"Pozioma Elipsa 2:1", - "icon":"Ikona karty", - "title":"Tytuł karty", - "units":"Jednostki", - "color-and-font":"Kolor i czcionka", - "shape-attribute-name":"Nazwa atrybutu", - "total-volume-required":"Wymagana jest całkowita objętość.", - "attribute-name-required":"Wymagana jest nazwa atrybutu.", - "attribute-key-not-set":"Klucz atrybutu '{{attributeName}}' nie jest ustawiony", - "attribute-key-invalid":"Klucz atrybutu '{{attributeName}}' jest nieprawidłowy" + "aggregated-value-card": { + "subtitle": "Subtitle", + "chart": "Chart", + "values": "Values", + "value-appearance": "Value appearance", + "position": "Position", + "position-center": "Center", + "position-right-top": "Right top", + "position-right-bottom": "Right bottom", + "position-left-top": "Left top", + "position-left-bottom": "Left bottom", + "font": "Font", + "color": "Color", + "arrow": "Arrow", + "display-up-down-arrow": "Display Up/Down arrow", + "add-value": "Add value", + "remove-value": "Remove value", + "no-values": "No values configured", + "aggregation": "Aggregation", + "aggregated-value-card-style": "Aggregated value card style" }, - "aggregated-value-card":{ - "subtitle":"Podtytuł", - "chart":"Wykres", - "values":"Wartości", - "value-appearance":"Wygląd wartości", - "position":"Pozycja", - "position-center":"Środek", - "position-right-top":"Prawy górny róg", - "position-right-bottom":"Prawy dolny róg", - "position-left-top":"Lewy górny róg", - "position-left-bottom":"Lewy dolny róg", - "font":"Czcionka", - "color":"Kolor", - "arrow":"Strzałka", - "display-up-down-arrow":"Wyświetl strzałkę w górę/dół", - "add-value":"Dodaj wartość", - "remove-value":"Usuń wartość", - "no-values":"Brak skonfigurowanych wartości", - "aggregation":"Agregacja", - "aggregated-value-card-style":"Styl karty zagregowanej wartości", - "auto-scale":"Automatyczne skalowanie" + "alarm-count": { + "alarm-count-card-style": "Alarm count card style" }, - "value-chart-card":{ - "layout":"Układ", - "layout-left":"Lewo", - "layout-right":"Prawo", - "auto-scale":"Automatyczna skala", - "icon":"Ikona", - "value":"Wartość", - "chart":"Wykres", - "value-chart-card-style":"Styl karty wartości z wykresem" + "entity-count": { + "entity-count-card-style": "Entity count card style" }, - "progress-bar":{ - "layout":"Układ", - "layout-default":"Domyślny", - "layout-simplified":"Uproszczony", - "auto-scale":"Automatyczna skala", - "icon":"Ikona", - "value":"Wartość", - "range":"Zakres", - "min":"min", - "max":"max", - "range-ticks":"Podziałka zakresu", - "bar":"Pasek", - "bar-color":"Kolor paska", - "bar-background":"Tło paska", - "progress-bar-card-style":"Styl karty paska postępu" + "count": { + "layout": "Layout", + "layout-column": "Column", + "layout-row": "Row", + "label": "Label", + "icon": "Icon", + "icon-background": "Icon background", + "value": "Value", + "chevron": "Chevron" }, - "alarm-count":{ - "alarm-count-card-style":"Styl karty licznika alarmów" + "table": { + "common-table-settings": "Wspólne ustawienia tabeli", + "enable-search": "Włącz wyszukiwanie", + "enable-sticky-header": "Zawsze wyświetlaj nagłówek", + "enable-sticky-action": "Zawsze wyświetlaj kolumnę działań", + "hidden-cell-button-display-mode": "Tryb wyświetlania akcji przycisków ukrytych komórek", + "show-empty-space-hidden-action": "Pokaż pustą przestrzeń zamiast działania przycisku ukrytej komórki", + "dont-reserve-space-hidden-action": "Nie rezerwuj miejsca na ukryte przyciski akcji", + "display-timestamp": "Wyświetl kolumnę sygnatury czasowej", + "display-milliseconds": "Wyświetl znacznik czasu w milisekundach", + "display-pagination": "Wyświetl paginację", + "default-page-size": "Domyślny rozmiar strony", + "use-entity-label-tab-name": "Użyj etykiety obiektu w nazwie karty", + "hide-empty-lines": "Ukryj puste linie", + "row-style": "Styl rzędu", + "use-row-style-function": "Użyj funkcji stylu wiersza", + "row-style-function": "Funkcja stylu wiersza", + "cell-style": "Styl komórki", + "use-cell-style-function": "Użyj funkcji stylu komórki", + "cell-style-function": "Funkcja stylu komórki", + "cell-content": "Zawartość komórki", + "use-cell-content-function": "Użyj funkcji zawartości komórki", + "cell-content-function": "Funkcja zawartości komórki", + "show-latest-data-column": "Pokaż ostatnią kolumnę danych", + "latest-data-column-order": "Najnowsza kolejność kolumn danych", + "entities-table-title": "Tytuł tabeli obiektów", + "enable-select-column-display": "Włącz wybrane kolumny do wyświetlenia", + "display-entity-name": "Wyświetl kolumnę z nazwą obiektu", + "entity-name-column-title": "Tytuł kolumny z nazwą obiektu", + "display-entity-label": "Wyświetl kolumnę etykiety obiektu", + "entity-label-column-title": "Tytuł kolumny etykiety obiektu", + "display-entity-type": "Wyświetl kolumnę typu obiektu", + "default-sort-order": "Domyślny porządek sortowania", + "custom-title": "Niestandardowy tytuł nagłówka", + "column-width": "Szerokość kolumny (px lub %)", + "default-column-visibility": "Domyślna widoczność kolumny", + "column-visibility-visible": "Widoczna", + "column-visibility-hidden": "Ukryta", + "column-visibility-hidden-mobile": "Ukryta w trybie mobilnym", + "column-selection-to-display": "Wybór kolumny w „Kolumnach do wyświetlenia”", + "column-selection-to-display-enabled": "Włączona", + "column-selection-to-display-disabled": "Wyłączona", + "column-export-option": "Uwzględnij kolumnę w eksporcie", + "column-export-option-always": "Zawsze", + "column-export-option-only-visible": "Tylko jeśli kolumna jest widoczna", + "column-export-option-never": "Nigdy", + "alarms-table-title": "Tytuł tabeli alarmów", + "enable-alarms-selection": "Włącz wybór alarmów", + "enable-alarms-search": "Włącz wyszukiwanie alarmów", + "enable-alarm-filter": "Włącz filtr alarmowy", + "display-alarm-details": "Wyświetl szczegóły alarmu", + "allow-alarms-ack": "Zezwalaj na potwierdzanie alarmów", + "allow-alarms-clear": "Zezwól na usunięcie alarmów", + "display-alarm-activity": "Wyświetl aktywność alarmową", + "allow-alarms-assign": "Zezwalaj na przypisywanie alarmów", + "blob-entities-table-title": "Tytuł tabeli obiektów BLOB", + "display-created-time": "Wyświetl utworzoną kolumnę czasu", + "display-type": "Kolumna typu wyświetlania", + "display-customer": "Wyświetl kolumnę klienta", + "no-data-display-message": "Alternatywny komunikat „Brak danych do wyświetlenia”.", + "force-default-blob-entity-type": "Wymuś domyślny typ obiektu typu BLOB", + "scheduler-events-table-title": "Tytuł tabeli zdarzeń planisty", + "force-default-event-type": "Wymuś domyślny typ zdarzenia", + "columns": "Columns", + "column-settings": "Column settings", + "remove-column": "Remove column", + "add-column": "Add column", + "no-columns": "No columns configured", + "columns-to-display": "Columns to display", + "table-header": "Table header", + "header-buttons": "Header buttons", + "table-buttons": "Table buttons", + "pagination": "Pagination", + "rows": "Rows", + "timeseries-column-error": "At least one timeseries column should be specified", + "table-tabs": "Table tabs", + "show-cell-actions-menu-mobile": "Show cell actions dropdown menu in mobile mode" }, - "entity-count":{ - "entity-count-card-style":"Entity count card style" + "scheduler": { + "enabled-scheduler-event-views": "Włączono widoki zdarzeń planisty", + "enabled-scheduler-event-views-both": "Obydwa", + "enabled-scheduler-event-views-list": "Tylko widok listy", + "enabled-scheduler-event-views-calendar": "Tylko widok kalendarza", + "display-name": "Wyświetlana nazwa", + "type-name": "Wpisz nazwę", + "display-originator-select": "Wyświetl wybór obiektu inicjaującego", + "display-message-type-select": "Wyświetl wybór typu wiadomości", + "display-metadata-table": "Wyświetl tabelę metadanych wiadomości", + "configuration-html-template": "Szablon HTML konfiguracji", + "custom-event-types": "Niestandardowe typy zdarzeń", + "no-custom-event-types": "Nie skonfigurowano niestandardowych typów zdarzeń", + "add-custom-event-type": "Dodaj niestandardowy typ zdarzenia" }, - "count":{ - "layout":"Układ", - "layout-column":"Kolumna", - "layout-row":"Wiersz", - "label":"Etykieta", - "icon":"Ikona", - "icon-background":"Tło ikony", - "value":"Wartość", - "chevron":"Strzałka", - "auto-scale":"Automatyczna skala" + "value-source": { + "value-source": "Źródło wartości", + "predefined-value": "Predefiniowana wartość", + "entity-attribute": "Wartość pobrana z atrybutu obiektu", + "value": "Wartość", + "source-entity-alias": "Alias obiektu źródłowego", + "source-entity-attribute": "Atrybut obiektu źródłowego" }, - "table":{ - "common-table-settings":"Wspólne ustawienia tabeli", - "enable-search":"Włącz wyszukiwanie", - "enable-sticky-header":"Zawsze wyświetlaj nagłówek", - "enable-sticky-action":"Zawsze wyświetlaj kolumnę akcji", - "hidden-cell-button-display-mode":"Tryb wyświetlania ukrytego przycisku akcji w komórce", - "show-empty-space-hidden-action":"Pokaż pustą przestrzeń zamiast ukrytego przycisku akcji w komórce", - "dont-reserve-space-hidden-action":"Nie rezerwuj miejsca na ukryte przyciski akcji", - "display-timestamp":"Znak czasu", - "display-pagination":"Wyświetl paginację", - "default-page-size":"Domyślny rozmiar strony", - "use-entity-label-tab-name":"Użyj etykiety encji w nazwie karty", - "hide-empty-lines":"Ukryj puste wiersze", - "row-style":"Styl wiersza", - "use-row-style-function":"Użyj funkcji stylu wiersza", - "row-style-function":"Funkcja stylu wiersza", - "cell-style":"Styl komórki", - "use-cell-style-function":"Użyj funkcji stylu komórki", - "cell-style-function":"Funkcja stylu komórki", - "cell-content":"Zawartość komórki", - "use-cell-content-function":"Użyj funkcji zawartości komórki", - "cell-content-function":"Funkcja zawartości komórki", - "show-latest-data-column":"Pokaż kolumnę z najnowszymi danymi", - "latest-data-column-order":"Kolejność kolumny z najnowszymi danymi", - "entities-table-title":"Tytuł tabeli encji", - "enable-select-column-display":"Włącz wybór kolumn do wyświetlenia", - "display-entity-name":"Wyświetl kolumnę z nazwą encji", - "entity-name-column-title":"Tytuł kolumny z nazwą encji", - "display-entity-label":"Wyświetl kolumnę z etykietą encji", - "entity-label-column-title":"Tytuł kolumny z etykietą encji", - "display-entity-type":"Wyświetl kolumnę z typem encji", - "default-sort-order":"Domyślna kolejność sortowania", - "custom-title":"Niestandardowy tytuł nagłówka", - "column-width":"Szerokość kolumny (px lub %)", - "default-column-visibility":"Domyślna widoczność kolumny", - "column-visibility-visible":"Widoczna", - "column-visibility-hidden":"Ukryta", - "column-visibility-hidden-mobile":"Ukryta w trybie mobilnym", - "column-selection-to-display":"Wybór kolumn w 'Kolumny do wyświetlenia'", - "column-selection-to-display-enabled":"Włączony", - "column-selection-to-display-disabled":"Wyłączony", - "alarms-table-title":"Tytuł tabeli alarmów", - "enable-alarms-selection":"Włącz wybór alarmów", - "enable-alarms-search":"Włącz wyszukiwanie alarmów", - "enable-alarm-filter":"Włącz filtr alarmów", - "display-alarm-details":"Wyświetl szczegóły alarmu", - "allow-alarms-ack":"Zezwalaj na potwierdzanie alarmów", - "allow-alarms-clear":"Zezwalaj na usuwanie alarmów", - "display-alarm-activity":"Wyświetl aktywność alarmu", - "allow-alarms-assign":"Zezwalaj na przypisywanie alarmów", - "columns":"Kolumny", - "column-settings":"Ustawienia kolumn", - "remove-column":"Usuń kolumnę", - "add-column":"Dodaj kolumnę", - "no-columns":"Brak skonfigurowanych kolumn", - "columns-to-display":"Kolumny do wyświetlenia", - "table-header":"Nagłówek tabeli", - "header-buttons":"Przyciski nagłówka", - "table-buttons":"Przyciski tabeli", - "pagination":"Paginacja", - "rows":"Wiersze", - "timeseries-column-error":"Należy określić co najmniej jedną kolumnę szeregów czasowych", - "alarm-column-error":"Należy określić co najmniej jedną kolumnę alarmów", - "table-tabs":"Karty tabeli", - "show-cell-actions-menu-mobile":"Pokaż menu rozwijane akcji komórek w trybie mobilnym" + "widget-font": { + "font-settings": "Font settings", + "font-family": "Rodzina czcionek", + "size": "Rozmiar", + "relative-font-size": "Względny rozmiar czcionki (w procentach)", + "font-style": "Styl", + "font-style-normal": "Normalna", + "font-style-italic": "Włoska", + "font-style-oblique": "Skośna", + "font-weight": "Grubość", + "font-weight-normal": "Normalna", + "font-weight-bold": "Pogrubiona", + "font-weight-bolder": "Bardziej pogrubiona", + "font-weight-lighter": "Cieńsza", + "color": "Kolor", + "shadow-color": "Kolor cienia", + "preview": "Preview", + "line-height": "Line height", + "auto": "Auto" }, - "wind-speed-direction":{ - "layout":"Układ", - "layout-default":"Domyślny", - "layout-advanced":"Zaawansowany", - "layout-simplified":"Uproszczony", - "values":"Wartości", - "wind-direction":"Kierunek wiatru", - "center-value":"Wartość środkowa", - "icon":"Ikona", - "arrow":"Strzałka", - "ticks":"Kreski", - "labels-type":"Typ etykiet", - "directional-names":"Nazwy kierunkowe", - "degrees":"Stopnie", - "major-ticks":"Główne kreski", - "minor-ticks":"Drobne kreski", - "wind-speed-direction-card-style":"Styl karty prędkości i kierunku wiatru", - "ticks-color":"Kolor kresek", - "ticks-labels-type":"Typ etykiet kreskowych", - "arrow-color":"Kolor strzałki" + "home": { + "no-data-available": "Brak dostępnych danych" }, - "value-source":{ - "value-source":"Źródło wartości", - "predefined-value":"Wartość predefiniowana", - "entity-attribute":"Atrybut jednostki", - "value":"Wartość", - "source-entity-alias":"Alias jednostki źródłowej", - "source-entity-attribute":"Atrybut jednostki źródłowej" + "system-info": { + "cpu": "CPU (procesor)", + "ram": "Pamięć RAM", + "disk": "Dysk", + "cpu-warning-text": "Wysokie wykorzystanie procesora. Zoptymalizuj działanie systemu aby zapobiec awarii systemu.", + "cpu-critical-text": "Krytycznie wysokie użycie procesora. Zoptymalizuj działanie systemu aby zapobiec awarii systemu.", + "ram-warning-text": "Kończy się rezerwa pamięci RAM. Zoptymalizuj działanie systemu, lub zwiększ pamięć RAM aby zapobiec awarii systemu.", + "ram-critical-text": "Krytycznie niska rezerwa pamięci RAM. Zoptymalizuj działanie systemu, lub zwiększ pamięć RAM aby zapobiec awarii systemu.", + "disk-warning-text": "Kończy się miejsce na dysku. Aby zapobiec utracie danych, zwolnij lub zwiększ miejsce na dysku.", + "disk-critical-text": "Krytycznie mało miejsca na dysku. Aby zapobiec utracie danych, zwolnij lub zwiększ miejsce na dysku." }, - "widget-font":{ - "font-settings":"Ustawienia czcionki", - "font-family":"Rodzina czcionek", - "size":"Rozmiar", - "relative-font-size":"Względny rozmiar czcionki (procenty)", - "font-style":"Styl", - "font-style-normal":"Normalny", - "font-style-italic":"Kursywa", - "font-style-oblique":"Pochyły", - "font-weight":"Grubość", - "font-weight-normal":"Normalna", - "font-weight-bold":"Pogrubiona", - "font-weight-bolder":"Grubsza", - "font-weight-lighter":"Lżejsza", - "color":"Kolor", - "shadow-color":"Kolor cienia", - "preview":"Podgląd", - "line-height":"Wysokość wiersza", - "auto":"Automatyczne" + "cluster-info": { + "service-id": "Identyfikator usługi", + "service-type": "Rodzaj usługi", + "no-data": "Brak danych" }, - "home":{ - "no-data-available":"Brak dostępnych danych" + "transport-messages": { + "title": "Komunikaty transportowe", + "info": "Wszystkie wiadomości pochodzące z urządzeń" }, - "system-info":{ - "cpu":"Procesor", - "ram":"RAM", - "disk":"Dysk", - "cpu-warning-text":"Wysokie zużycie procesora. Aby uniknąć awarii systemu, zoptymalizuj wydajność systemu.", - "cpu-critical-text":"Krytycznie wysokie zużycie procesora. Aby uniknąć awarii systemu, zoptymalizuj wydajność systemu.", - "ram-warning-text":"Niski zapas pamięci RAM. Aby uniknąć awarii systemu, zoptymalizuj wydajność systemu lub zwiększ rozmiar pamięci RAM.", - "ram-critical-text":"Krytycznie niski zapas pamięci RAM. Aby uniknąć awarii systemu, zoptymalizuj wydajność systemu lub zwiększ rozmiar pamięci RAM.", - "disk-warning-text":"Niskie miejsce na dysku. Aby uniknąć utraty danych, zwolnij miejsce lub zwiększ rozmiar dysku.", - "disk-critical-text":"Krytycznie niskie miejsce na dysku. Aby uniknąć utraty danych, zwolnij miejsce lub zwiększ rozmiar dysku." + "activity": { + "title": "Działalność" }, - "cluster-info":{ - "service-id":"ID usługi", - "service-type":"Typ usługi", - "no-data":"Brak danych" + "documentation": { + "title": "Dokumentacja", + "add-link": "Dodaj link", + "add-link-title": "Dodaj link do dokumentacji", + "name": "Nazwa", + "name-required": "Nazwa jest wymagana.", + "link": "Połączyć", + "link-required": "Link jest wymagany.", + "columns": "Kolumny" }, - "transport-messages":{ - "title":"Wiadomości transportowe", - "info":"Wszystkie wiadomości odebrane od urządzeń" + "quick-links": { + "title": "Szybkie linki", + "add-link": "Dodaj link", + "add-link-title": "Dodaj szybki link", + "quick-link": "Szybki link", + "quick-link-required": "Wymagany jest szybki link.", + "no-links-matching": "Nie znaleziono linku '{{name}}'.", + "columns": "Kolumny" }, - "activity":{ - "title":"Aktywność" + "recent-dashboards": { + "title": "Panele", + "last": "Ostatnio oglądane", + "starred": "Oznaczone gwiazdką", + "name": "Nazwa", + "last-viewed": "Ostatnio oglądane", + "no-last-viewed-dashboards": "Jeszcze nie ma ostatnio oglądanych paneli" }, - "documentation":{ - "title":"Dokumentacja", - "add-link":"Dodaj link", - "add-link-title":"Dodaj link do dokumentacji", - "name":"Nazwa", - "name-required":"Nazwa jest wymagana.", - "link":"Link", - "link-required":"Link jest wymagany.", - "columns":"Kolumny" + "configured-features": { + "title": "Skonfigurowane funkcje", + "info": "Stan funkcji wymagających konfiguracji", + "white-labeling-feature": "White labeling", + "email-feature": "E-mail", + "sms-feature": "SMS-em", + "slack-feature": "Slack", + "oauth2-feature": "OAuth 2", + "2fa-feature": "2FA", + "feature-configured": "Funkcja jest skonfigurowana.\nKliknij, aby skonfigurować", + "feature-not-configured": "Funkcja nie jest skonfigurowana.\nKliknij, aby skonfigurować" }, - "quick-links":{ - "title":"Szybkie linki", - "add-link":"Dodaj link", - "add-link-title":"Dodaj szybki link", - "quick-link":"Szybki link", - "quick-link-required":"Szybki link jest wymagany.", - "no-links-matching":"Nie znaleziono linków pasujących do '{{name}}'.", - "columns":"Kolumny" + "version-info": { + "title": "Wersja", + "contact-us": "Skontaktuj się z nami", + "current-version": "Obecna wersja", + "current": "Aktualna", + "available-version": "Dostępna wersja", + "available": "DostępnaS", + "upgrade": "Aktualizacja", + "version-is-up-to-date": "Wersja jest aktualna" }, - "recent-dashboards":{ - "title":"Dashboardy", - "last":"Ostatnio przeglądane", - "starred":"Ulubione", - "name":"Nazwa", - "last-viewed":"Ostatnio przeglądane", - "no-last-viewed-dashboards":"Nie oglądałeś jeszcze żadnych dashboardów" + "license-info": { + "title": "Informacje o licencji", + "view-all": "Pokaż wszystkie", + "license-portal": "Portal licencji", + "devices-info": "{count} / { max, plural, =0 {∞} other {#} } Urządzeń", + "assets-info": "{count} / { max, plural, =0 {∞} other {#} } Zasobów", + "dashboards-info": "{count} / { max, plural, =0 {∞} other {#} } Paneli", + "integrations-info": "{count} / { max, plural, =0 {∞} other {#} } Integracji", + "community-support": "Pomoc społeczności", + "white-labeling": "White labeling", + "unlimited-datapoints-and-messages": "Nieograniczone punkty danych i wiadomości", + "unlimited-api-calls": "Nieograniczone wywołania API" }, - "configured-features":{ - "title":"Skonfigurowane funkcje", - "info":"Status funkcji wymagających konfiguracji", - "email-feature":"Email", - "sms-feature":"SMS", - "slack-feature":"Slack", - "oauth2-feature":"OAuth 2", - "2fa-feature":"2FA", - "feature-configured":"Funkcja jest skonfigurowana.\nKliknij, aby skonfigurować", - "feature-not-configured":"Funkcja nie jest skonfigurowana.\nKliknij, aby skonfigurować" + "usage-info": { + "title": "Wykorzystanie", + "entities": "Obiekty", + "api-calls": "Wywołania API" }, - "version-info":{ - "title":"Wersja", - "contact-us":"Skontaktuj się z nami", - "current-version":"Aktualna wersja", - "current":"Aktualna", - "available-version":"Dostępna wersja", - "available":"Dostępna", - "upgrade":"Aktualizuj", - "version-is-up-to-date":"Wersja jest aktualna" + "functions": { + "title": "Funkcje", + "pe-feature-tooltip": "Tylko na ThingsBoard\nProfessional Edition", + "switch-to-pe": "Przejdź na PE", + "alarms": "Alarmy", + "dashboards": "Panele", + "entities-and-relations": "Obiekty i Relacje", + "profiles": "Profile", + "advanced-features": "Zaawansowane funkcje", + "notification-center": "Centrum powiadomień", + "api-usage": "Użycie API", + "customers": "Klienci", + "customers-hierarchy": "Hierarchia klientów", + "roles-and-permissions": "Role i Pozwolenia", + "groups": "Grupy", + "integrations": "Integracje", + "solution-templates": "Szablony rozwiązań", + "scheduler": "Planista", + "white-labeling": "White-labeling" }, - "usage-info":{ - "title":"Użycie", - "entities":"Encje", - "api-calls":"Wywołania API" + "devices": { + "view-docs": "Zobacz dokumenty", + "inactive": "Nieaktywne", + "active": "Aktywne", + "total": "Wszystkie" }, - "functions":{ - "title":"Funkcje", - "pe-feature-tooltip":"Tylko w ThingsBoard\nProfessional Edition", - "switch-to-pe":"Przełącz do PE", - "alarms":"Alarmy", - "dashboards":"Dashboards", - "entities-and-relations":"Encje i relacje", - "profiles":"Profile", - "advanced-features":"Zaawansowane funkcje", - "notification-center":"Centrum powiadomień", - "api-usage":"Użycie API", - "customers":"Klienci", - "customers-hierarchy":"Hierarchia klientów", - "roles-and-permissions":"Role i uprawnienia", - "groups":"Grupy", - "integrations":"Integracje", - "solution-templates":"Szablony rozwiązań", - "scheduler":"Harmonogram", - "white-labeling":"White-labeling" + "alarms": { + "critical": "Krytyczne", + "assigned-to-me": "Przydzielone do mnie", + "total": "Wszystkie" }, - "devices":{ - "view-docs":"Zobacz dokumentację", - "inactive":"Nieaktywne", - "active":"Aktywne", - "total":"Razem" + "solution-templates": { + "title": "Szablony rozwiązań", + "prototype-plan": "Plan prototypu", + "startup-plan": "Plan startowy" }, - "alarms":{ - "critical":"Krytyczne", - "assigned-to-me":"Przypisane do mnie", - "total":"Razem" - }, - "getting-started":{ - "get-started":"Rozpocznij", - "finish":"Zakończ", - "done-welcome-title":"Witamy na pokładzie", - "done-welcome-text":"Świetnie sobie poradziłeś!", - "sys-admin":{ - "step1":{ - "title":"Utwórz Najemcę i Administratora Najemcy", - "content":"

Najemca to osoba lub organizacja, która posiada lub wytwarza urządzenia i zasoby. Najemca może mieć wielu administratorów najemców, klientów, urządzeń i zasobów.

Administrator najemcy może tworzyć i zarządzać urządzeniami, zasobami, klientami i pulpitami w ramach konta najemcy.

Przeczytaj dokumentację, aby się dowiedzieć, jak to zrobić:

", - "how-to-create-tenant":"Jak utworzyć Najemcę i Administratora Najemcy" + "getting-started": { + "get-started": "Jak zacząć?", + "finish": "Koniec", + "done-welcome-title": "Witaj na pokładzie", + "done-welcome-text": "Świetnie sobie z tym poradziłeś!", + "sys-admin": { + "step1": { + "title": "Stwórz Tenanta i Administratora Tenanta", + "content": "

Tenant to osoba fizyczna lub organizacja posiadająca lub produkująca urządzenia i zasoby.

Administrator Tenanta może tworzyć urządzenia, zasoby, klientów i panele oraz zarządzać nimi w ramach konta Tenanta.

Postępuj zgodnie z dokumentacją, aby dowiedzieć się, jak to zrobić:

", + "how-to-create-tenant": "Jak stworzyć Tenanta i Administratora Tenanta" }, - "step2":{ - "title":"Skonfiguruj funkcję: Serwer poczty", - "content":"

Konfiguracja serwera poczty jest niezbędna do aktywacji użytkowników, odzyskiwania hasła i dostarczania powiadomień o alarmach.

Przeczytaj dokumentację, aby się dowiedzieć, jak to zrobić:

", - "how-to-configure-mail-server":"Jak skonfigurować serwer poczty" + "step2": { + "title": "Skonfiguruj funkcję: Serwer pocztowy", + "content": "

Konfiguracja serwera pocztowego jest niezbędna do aktywacji użytkownika, odzyskiwania hasła i dostarczania powiadomień o alarmach.

Postępuj zgodnie z dokumentacją, aby dowiedzieć się, jak to zrobić:

", + "how-to-configure-mail-server": "Jak skonfigurować serwer pocztowy" }, - "step3":{ - "title":"Skonfiguruj funkcję: Dostawca SMS", - "content":"

Skonfiguruj dostawców SMS, aby informować klientów o alarmach za pomocą wiadomości SMS.

Przeczytaj dokumentację, aby się dowiedzieć, jak to zrobić:

", - "how-to-configure-sms-provider":"Jak skonfigurować dostawcę SMS" + "step3": { + "title": "Skonfiguruj funkcję: dostawca SMS", + "content": "

Skonfiguruj dostawców SMS, aby powiadamiali klientów o alarmach za pomocą wiadomości SMS.

Postępuj zgodnie z dokumentacją, aby dowiedzieć się, jak to zrobić:

", + "how-to-configure-sms-provider": "Jak skonfigurować dostawcę SMS" }, - "step4":{ - "title":"Skonfiguruj funkcję: 2FA", - "content":"

Popraw bezpieczeństwo kont platformy za pomocą uwierzytelniania dwuetapowego.

Przeczytaj dokumentację, aby się dowiedzieć, jak to zrobić:

", - "how-to-configure-2fa":"Jak skonfigurować 2FA" + "step4": { + "title": "Skonfiguruj funkcję: White labeling", + "content": "

Z łatwością dostosuj logo i kolorystykę swojej firmy lub produktu bez kodowania i ponownego uruchamiania usługi.

Postępuj zgodnie z dokumentacją, aby dowiedzieć się, jak to zrobić:

", + "how-to-configure-white-labeling": "Jak white labeling" }, - "step5":{ - "title":"Skonfiguruj funkcję: OAuth 2", - "content":"

Uprość logowanie dla użytkowników najemcy i klientów za pomocą funkcji jednokrotnego logowania za pośrednictwem OAuth 2.0.

Przeczytaj dokumentację, aby się dowiedzieć, jak to zrobić:

", - "how-to-configure-oauth2":"Jak skonfigurować OAuth 2" + "step5": { + "title": "Skonfiguruj funkcję: 2FA", + "content": "

Popraw bezpieczeństwo kont platformy dzięki uwierzytelnianiu dwuskładnikowemu.

Postępuj zgodnie z dokumentacją, aby dowiedzieć się, jak to zrobić:

", + "how-to-configure-2fa": "Jak skonfigurować 2FA" }, - "step6":{ - "title":"Skonfiguruj funkcję: Slack", - "content":"

Rozprowadzaj powiadomienia do użytkowników najemców i klientów za pośrednictwem Slack zgodnie z zasadami powiadomień, które ustawisz.

Przeczytaj dokumentację, aby się dowiedzieć, jak to zrobić:

", - "how-to-configure-notifications":"Jak skonfigurować Slack" + "step6": { + "title": "Skonfiguruj funkcję: OAuth 2", + "content": "

Uprość logowanie użytkowników Tenantów i klientów dzięki funkcji pojedynczego logowania za pośrednictwem protokołu OAuth 2.0.

Postępuj zgodnie z dokumentacją, aby dowiedzieć się, jak to zrobić:

", + "how-to-configure-oauth2": "Jak skonfigurować OAuth 2" + }, + "step7": { + "title": "Skonfiguruj funkcję: Slack", + "content": "

Rozpowszechniaj powiadomienia do użytkowników Tenantów i klientów za pośrednictwem Slacka zgodnie z ustawionymi regułami powiadomień.

Postępuj zgodnie z dokumentacją, aby dowiedzieć się, jak to zrobić:

", + "how-to-configure-notifications": "Jak skonfigurować Slacka" } }, - "tenant-admin":{ - "step1":{ - "title":"Utwórz urządzenie", - "content":"

Dodaj swoje pierwsze urządzenie do platformy za pomocą interfejsu użytkownika. Przeczytaj dokumentację, aby dowiedzieć się, jak to zrobić:

", - "how-to-create-device":"Jak utworzyć urządzenie" + "tenant-admin": { + "step1": { + "title": "Stwórz urządzenie", + "content": "

Udostępnimy Twoje pierwsze urządzenie na platformie za pośrednictwem interfejsu użytkownika. Postępuj zgodnie z dokumentacją, aby dowiedzieć się, jak to zrobić

", + "how-to-create-device": "Jak stworzyć urządzenie" }, - "step2":{ - "title":"Podłącz urządzenie", - "content-before":"

Aby podłączyć urządzenie, potrzebujesz danych uwierzytelniających urządzenia. Zalecamy korzystanie z domyślnie generowanych danych uwierzytelniających, czyli token dostępu, zgodnie z tym przewodnikiem.

  • Przejdź do tabeli urządzeń
  • Kliknij w wiersz urządzenia, aby otworzyć szczegóły urządzenia
  • Naciśnij przycisk „Kopiuj token dostępu”

Użyj prostych poleceń, aby publikować dane za pomocą protokołu HTTP. Nie zapomnij zamienić $ACCESS_TOKEN na swój token dostępu do urządzenia:

", - "ubuntu":{ - "install-curl":"Zainstaluj cURL dla Ubuntu:" + "step2": { + "title": "Podłącz urządzenie", + "content-before": "

Aby podłączyć urządzenie, musisz uzyskać dane uwierzytelniające urządzenia.

  • Przejdź do tabeli urządzeń
  • Kliknij wiersz urządzenia, aby otworzyć szczegóły urządzenia
  • Naciśnij przycisk „Kopiuj token dostępu”

Użyj prostych poleceń, aby publikować dane za pośrednictwem protokołu HTTP. Nie zapomnij, żeby zastąpić $ACCESS_TOKEN tokenem dostępu twojego urządzenia:

", + "ubuntu": { + "install-curl": "Zainstaluj cURL dla Ubuntu:" }, - "macos":{ - "install-curl":"Zainstaluj cURL dla MacOS:" + "macos": { + "install-curl": "Zainstaluj cURL dla MacOS:" }, - "windows":{ - "install-curl":"Od Windows 10 b17063 cURL jest dostępny domyślnie." + "windows": { + "install-curl": "Począwszy od systemu Windows 10 b17063, cURL jest dostępny domyślnie." }, - "replace-access-token":"Zamień $ACCESS_TOKEN na token dostępu do swojego urządzenia:", - "content-after":"

Możesz także używać innych protokołów, takich jak MQTT, CoAP, itp.

Przeczytaj dokumentację, aby dowiedzieć się, jak to zrobić:

", - "how-to-connect-device":"Jak podłączyć urządzenie" + "replace-access-token": "Zastąp $ACCESS_TOKEN tokenem twojego urządzenia:", + "content-after": "

Można także używać innych protokołów, takich jak MQTT, CoAP itp.

Postępuj zgodnie z dokumentacją, aby dowiedzieć się, jak to zrobić:

", + "how-to-connect-device": "Jak podłączyć urządzenie" }, - "step3":{ - "title":"Utwórz pulpit", - "content":"

Utwórz pulpit, aby wizualizować dane z jednostek, takich jak zasoby, urządzenia, itp.

Przeczytaj dokumentację, aby dowiedzieć się, jak to zrobić:

", - "how-to-create-dashboard":"Jak utworzyć pulpit" + "step3": { + "title": "Utwórz panel", + "content": "

Utwórz panel, aby wizualizować dane z obiektów, takich jak zasoby, urządzenia itp.

Postępuj zgodnie z dokumentacją, aby dowiedzieć się, jak to zrobić:

", + "how-to-create-dashboard": "Jak stworzyć Panel" }, - "step4":{ - "title":"Skonfiguruj reguły alarmowe", - "alarm-rules":"Reguły alarmowe", - "content":"

Podnieśmy alarm, gdy temperatura osiągnie 25°C. Przeczytaj dokumentację, aby dowiedzieć się, jak to zrobić:

", - "how-to-configure-alarm-rules":"Jak skonfigurować reguły alarmowe" + "step4": { + "title": "Skonfiguruj reguły alarmów", + "alarm-rules": "Zasady alarmowania", + "content": "

Podnieśmy alarm, gdy temperatura osiągnie 25°C.

", + "how-to-configure-alarm-rules": "Jak skonfigurować reguły alarmów" }, - "step5":{ - "title":"Utwórz alarm", - "content-before":"

Aby uruchomić alarm, prześlij nową wartość telemetrii równej lub wyższej niż 26°C.

", - "replace-access-token":"Zamień $ACCESS_TOKEN na token dostępu do swojego urządzenia:", - "content-after":"

Przeczytaj dokumentację, aby dowiedzieć się, jak to zrobić:

", - "how-to-create-alarm":"Jak utworzyć alarm" + "step5": { + "title": "Utwórz alarm", + "content-before": "

Aby wywołać alarm, wyślij nową wartość telemetryczną wynoszącą 26°C lub wyższą.

", + "replace-access-token": "Zastąp $ACCESS_TOKEN tokenem twojego urządzenia:", + "content-after": "

Postępuj zgodnie z dokumentacją, aby dowiedzieć się, jak to zrobić:

", + "how-to-create-alarm": "Jak utworzyć alarm" }, - "step6":{ - "title":"Utwórz klienta i przypisz pulpit", - "content":"

Tworząc pulpity dla końcowych użytkowników, użytkownik klienta może widzieć tylko swoje urządzenia, a dane innego klienta będą ukryte.

Przeczytaj dokumentację, aby dowiedzieć się, jak to zrobić:

", - "how-to-create-customer-and-assign-dashboard":"Jak utworzyć klienta i przypisać pulpit" + "step6": { + "title": "Utwórz klienta i udostępnij panel", + "content": "

Tworząc panele użytkownika końcowego, użytkownik klient może widzieć tylko swoje własne urządzenia, a dane innych klientów zostaną ukryte.

Postępuj zgodnie z dokumentacją, aby dowiedzieć się, jak to zrobić:

", + "how-to-create-customer-and-share-dashboard": "Jak utworzyć Klienta i udostępnić Panel" } } } }, - "color":{ - "color":"Kolor" + "icon": { + "icon": "Ikona", + "icons": "Icons", + "select-icon": "Wybierz ikonę", + "material-icons": "Ikony materialne", + "show-all": "Pokaż wszystkie ikony", + "search-icon": "Search icon", + "no-icons-found": "No icons found for '{{iconSearch}}'" }, - "icon":{ - "icon":"Ikona", - "icons":"Ikony", - "select-icon":"Wybierz ikonę", - "material-icons":"Ikony materiałowe", - "show-all":"Pokaż wszystkie ikony", - "search-icon":"Wyszukaj ikonę", - "no-icons-found":"Nie znaleziono ikon dla '{{iconSearch}}'" + "subscription": { + "entity-limit-text": "Możesz jednak uaktualnić swój plan subskrypcji, aby zwiększyć swoje limity.", + "upgrade-your-plan": "Uaktualnij plan subskrypcji", + "white-labeling-feature": "Funkcja white labeling", + "white-labeling-text-full": "Zmień nazwę interfejsu internetowego platformy ThingsBoard za pomocą logo Twojej firmy lub produktu oraz schematu kolorów w 2 minuty.

Usuń opcję „Powered By” w stopce panelu.
Nie jest wymagane kodowanie ani ponowne uruchamianie usługi. Pozwól także swoim klientom na White Labeling swoich interfejsów", + "enable-white-labeling": "Włącz teraz funkcję white labeling, aktualizując swój plan subskrypcji!", + "read-more": "Czytaj więcej", + "white-labeling-video-text": "Obejrzyj samouczek wideo poniżej, aby zobaczyć, jak działa ta funkcja!" }, - "phone-input":{ - "phone-input-label":"Numer telefonu", - "phone-input-required":"Numer telefonu jest wymagany", - "phone-input-validation":"Numer telefonu jest nieprawidłowy lub niemożliwy", - "phone-input-pattern":"Nieprawidłowy numer telefonu. Powinien być w formacie E.164, np. {{phoneNumber}}", - "phone-input-hint":"Numer telefonu w formacie E.164, np. {{phoneNumber}}" - }, - "custom":{ - "widget-action":{ - "action-cell-button":"Przycisk w komórce akcji", - "row-click":"Po kliknięciu w wiersz", - "polygon-click":"Po kliknięciu w wielokąt", - "marker-click":"Po kliknięciu w marker", - "circle-click":"Po kliknięciu w okrąg", - "tooltip-tag-action":"Akcja etykiety narzędziowej", - "node-selected":"Po wybraniu węzła", - "element-click":"Po kliknięciu w element HTML", - "pie-slice-click":"Po kliknięciu w kawałek tarty", - "row-double-click":"Po podwójnym kliknięciu w wiersz", - "card-click":"Po kliknięciu w kartę" + "subscription-error": { + "title": "Naruszenie subskrypcji", + "warning-title": "Ostrzeżenie dotyczące subskrypcji", + "upgrade-subscription-plan": "Uaktualnij swój plan subskrypcji", + "upgrade-subscription-plan-to-install-solution-template": "Aby zainstalować rozwiązanie {{solutionTemplateName}}, musisz uaktualnić swoją subskrypcję co najmniej do planu {{planName}}!", + "limit-reached": { + "device-count": "Osiągnięto maksymalną liczbę urządzeń ({{value}}) dozwolone przez Twój plan abonamentowy!", + "asset-count": "Osiągnąłeś maksymalną liczbę zasobów ({{value}}) dozwolone przez Twój plan abonamentowy!" + }, + "feature-disabled": { + "white-labeling": "Funkcja white labeling nie jest dozwolona w Twoim planie subskrypcji!" } }, - "paginator":{ - "items-per-page":"Elementy na stronie:", - "first-page-label":"Pierwsza strona", - "last-page-label":"Ostatnia strona", - "next-page-label":"Następna strona", - "previous-page-label":"Poprzednia strona", - "items-per-page-separator":"z" + "phone-input": { + "phone-input-label": "Numer telefonu", + "phone-input-required": "Numer telefonu jest wymagany", + "phone-input-validation": "Numer telefonu jest nieprawidłowy lub niemożliwy", + "phone-input-pattern": "Nieprawidłowy numer telefonu. Powinien być w formacie E.164, np. {{phoneNumber}}", + "phone-input-hint": "Numer telefonu w formacie E.164, np. {{phoneNumber}}" }, - "language":{ - "language":"Język" + "custom": { + "widget-action": { + "action-cell-button": "Przycisk komórki akcji", + "row-click": "Po kliknięciu wiersza", + "polygon-click": "Po kliknięciu poligonu", + "marker-click": "Po kliknięciu znacznika", + "circle-click": "Po kliknięciu okręgu", + "tooltip-tag-action": "Akcja tagu podpowiedzi", + "node-selected": "Po wybraniu węzła", + "element-click": "Po kliknięciu elementu HTML", + "pie-slice-click": "Po kliknięciu wycinka", + "row-double-click": "Po dwukrotnym kliknięciu wiersza", + "card-click": "On card click" + } + }, + "paginator": { + "items-per-page": "Przedmioty na stronę:", + "first-page-label": "Pierwsza strona", + "last-page-label": "Ostatnia strona", + "next-page-label": "Następna strona", + "previous-page-label": "Poprzednia strona", + "items-per-page-separator": "z" + }, + "language": { + "language": "Język" } } From e9956cbd10cb1aff90b524a8ab4791cbcab9e72d Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Mon, 6 May 2024 09:32:36 +0300 Subject: [PATCH 08/17] UI: Fixed models --- .../profile/device/lwm2m/lwm2m-profile-config.models.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-profile-config.models.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-profile-config.models.ts index 79e9bb6514..4262e47970 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-profile-config.models.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-profile-config.models.ts @@ -175,7 +175,7 @@ export interface ClientLwM2mSettings { edrxCycle?: number; pagingTransmissionWindow?: number; psmActivityTimer?: number; - defaultObjectIDVer: string; + defaultObjectIDVer: ObjectIDVer; } export interface ObservableAttributes { From c3f1e186c53764c48397da209c4b18afa66d531c Mon Sep 17 00:00:00 2001 From: nick Date: Tue, 7 May 2024 14:49:30 +0300 Subject: [PATCH 09/17] lwm2m: object-id-version default 1.0 --- .../lwm2m-device-profile-transport-configuration.component.ts | 4 ++-- .../profile/device/lwm2m/lwm2m-profile-config.models.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.ts index 8aeb3e58d8..fbc72d9498 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-device-profile-transport-configuration.component.ts @@ -123,7 +123,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro edrxCycle: [{disabled: true, value: 0}, Validators.required], psmActivityTimer: [{disabled: true, value: 0}, Validators.required], pagingTransmissionWindow: [{disabled: true, value: 0}, Validators.required], - defaultObjectIDVer: [ObjectIDVer.V1_1, Validators.required] + defaultObjectIDVer: [ObjectIDVer.V1_0, Validators.required] }) }); @@ -282,7 +282,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro pagingTransmissionWindow: this.configurationValue.clientLwM2mSettings.pagingTransmissionWindow || DEFAULT_PAGING_TRANSMISSION_WINDOW, psmActivityTimer: this.configurationValue.clientLwM2mSettings.psmActivityTimer || DEFAULT_PSM_ACTIVITY_TIMER, - defaultObjectIDVer: this.configurationValue.clientLwM2mSettings.defaultObjectIDVer || ObjectIDVer.V1_1 + defaultObjectIDVer: this.configurationValue.clientLwM2mSettings.defaultObjectIDVer || ObjectIDVer.V1_0 } }, {emitEvent: false}); diff --git a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-profile-config.models.ts b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-profile-config.models.ts index 4262e47970..8c1bb56a49 100644 --- a/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-profile-config.models.ts +++ b/ui-ngx/src/app/modules/home/components/profile/device/lwm2m/lwm2m-profile-config.models.ts @@ -202,7 +202,7 @@ export function getDefaultProfileClientLwM2mSettingsConfig(): ClientLwM2mSetting fwUpdateStrategy: 1, swUpdateStrategy: 1, powerMode: PowerMode.DRX, - defaultObjectIDVer: ObjectIDVer.V1_1 + defaultObjectIDVer: ObjectIDVer.V1_0 }; } From 15d189ead730245e29dcf07d959e34cfb8693e48 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Tue, 7 May 2024 15:13:52 +0300 Subject: [PATCH 10/17] Refactoring for consumer manager --- .../HousekeeperReprocessingService.java | 2 +- .../housekeeper/HousekeeperService.java | 2 +- .../queue/DefaultTbCoreConsumerService.java | 4 +- .../queue/consumer/QueueConsumerManager.java | 109 ------------------ .../processing/AbstractConsumerService.java | 2 +- .../common/consumer/QueueConsumerManager.java | 13 ++- .../service/DefaultTransportService.java | 3 +- .../DefaultClusterVersionControlService.java | 3 +- 8 files changed, 15 insertions(+), 123 deletions(-) delete mode 100644 application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java diff --git a/application/src/main/java/org/thingsboard/server/service/housekeeper/HousekeeperReprocessingService.java b/application/src/main/java/org/thingsboard/server/service/housekeeper/HousekeeperReprocessingService.java index ae16f925a0..37a55c99d6 100644 --- a/application/src/main/java/org/thingsboard/server/service/housekeeper/HousekeeperReprocessingService.java +++ b/application/src/main/java/org/thingsboard/server/service/housekeeper/HousekeeperReprocessingService.java @@ -27,11 +27,11 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToHousekeeperService import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; +import org.thingsboard.server.queue.common.consumer.QueueConsumerManager; import org.thingsboard.server.queue.housekeeper.HousekeeperConfig; import org.thingsboard.server.queue.provider.TbCoreQueueFactory; import org.thingsboard.server.queue.util.AfterStartUp; import org.thingsboard.server.queue.util.TbCoreComponent; -import org.thingsboard.server.service.queue.consumer.QueueConsumerManager; import javax.annotation.PreDestroy; import java.util.LinkedHashSet; diff --git a/application/src/main/java/org/thingsboard/server/service/housekeeper/HousekeeperService.java b/application/src/main/java/org/thingsboard/server/service/housekeeper/HousekeeperService.java index 06e38d0160..eea92eb75b 100644 --- a/application/src/main/java/org/thingsboard/server/service/housekeeper/HousekeeperService.java +++ b/application/src/main/java/org/thingsboard/server/service/housekeeper/HousekeeperService.java @@ -27,13 +27,13 @@ import org.thingsboard.server.common.msg.notification.NotificationRuleProcessor; import org.thingsboard.server.gen.transport.TransportProtos.ToHousekeeperServiceMsg; import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; +import org.thingsboard.server.queue.common.consumer.QueueConsumerManager; import org.thingsboard.server.queue.housekeeper.HousekeeperConfig; import org.thingsboard.server.queue.provider.TbCoreQueueFactory; import org.thingsboard.server.queue.util.AfterStartUp; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.housekeeper.processor.HousekeeperTaskProcessor; import org.thingsboard.server.service.housekeeper.stats.HousekeeperStatsService; -import org.thingsboard.server.service.queue.consumer.QueueConsumerManager; import javax.annotation.PreDestroy; import java.util.List; diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java index abfcd47a46..fbef0cfd29 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java @@ -210,20 +210,20 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService>builder() - .key("usage-stats") .name("TB Usage Stats") .msgPackProcessor(this::processUsageStatsMsg) .pollInterval(pollInterval) .consumerCreator(queueFactory::createToUsageStatsServiceMsgConsumer) .consumerExecutor(consumersExecutor) + .threadPrefix("usage-stats") .build(); this.firmwareStatesConsumer = QueueConsumerManager.>builder() - .key("firmware") .name("TB Ota Package States") .msgPackProcessor(this::processFirmwareMsgs) .pollInterval(pollInterval) .consumerCreator(queueFactory::createToOtaPackageStateServiceMsgConsumer) .consumerExecutor(consumersExecutor) + .threadPrefix("firmware") .build(); } diff --git a/application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java b/application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java deleted file mode 100644 index e7b3a2f2b7..0000000000 --- a/application/src/main/java/org/thingsboard/server/service/queue/consumer/QueueConsumerManager.java +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Copyright © 2016-2024 The Thingsboard Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.thingsboard.server.service.queue.consumer; - -import lombok.Builder; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import org.thingsboard.common.util.ThingsBoardThreadFactory; -import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; -import org.thingsboard.server.queue.TbQueueConsumer; -import org.thingsboard.server.queue.TbQueueMsg; - -import java.util.List; -import java.util.Set; -import java.util.concurrent.ExecutorService; -import java.util.function.Supplier; - -@Slf4j -public class QueueConsumerManager { - - private final String name; - private final MsgPackProcessor msgPackProcessor; - private final long pollInterval; - private final ExecutorService consumerExecutor; - private final String threadPrefix; - - @Getter - private final TbQueueConsumer consumer; - private volatile boolean stopped; - - @Builder - public QueueConsumerManager(String name, MsgPackProcessor msgPackProcessor, - long pollInterval, Supplier> consumerCreator, - ExecutorService consumerExecutor, String threadPrefix) { - this.name = name; - this.pollInterval = pollInterval; - this.msgPackProcessor = msgPackProcessor; - this.consumerExecutor = consumerExecutor; - this.threadPrefix = threadPrefix; - this.consumer = consumerCreator.get(); - } - - public void subscribe() { - consumer.subscribe(); - } - - public void subscribe(Set partitions) { - consumer.subscribe(partitions); - } - - public void launch() { - log.info("[{}] Launching consumer", name); - consumerExecutor.submit(() -> { - if (threadPrefix != null) { - ThingsBoardThreadFactory.addThreadNamePrefix(threadPrefix); - } - try { - consumerLoop(consumer); - } catch (Throwable e) { - log.error("Failure in consumer loop", e); - } - log.info("[{}] Consumer stopped", name); - }); - } - - private void consumerLoop(TbQueueConsumer consumer) { - while (!stopped && !consumer.isStopped()) { - try { - List msgs = consumer.poll(pollInterval); - if (msgs.isEmpty()) { - continue; - } - msgPackProcessor.process(msgs, consumer); - } catch (Exception e) { - if (!consumer.isStopped()) { - log.warn("Failed to process messages from queue", e); - try { - Thread.sleep(pollInterval); - } catch (InterruptedException interruptedException) { - log.trace("Failed to wait until the server has capacity to handle new requests", interruptedException); - } - } - } - } - } - - public void stop() { - log.debug("[{}] Stopping consumer", name); - stopped = true; - consumer.unsubscribe(); - } - - public interface MsgPackProcessor { - void process(List msgs, TbQueueConsumer consumer) throws Exception; - } -} \ No newline at end of file diff --git a/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java index 2967143dd4..85227e50ab 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java @@ -85,12 +85,12 @@ public abstract class AbstractConsumerService>builder() - .key("notifications") .name("TB Notifications") .msgPackProcessor(this::processNotifications) .pollInterval(getNotificationPollDuration()) .consumerCreator(this::createNotificationsConsumer) .consumerExecutor(consumersExecutor) + .threadPrefix("notifications") .build(); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/common/consumer/QueueConsumerManager.java b/common/queue/src/main/java/org/thingsboard/server/queue/common/consumer/QueueConsumerManager.java index bf103bef60..90f4cf050c 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/common/consumer/QueueConsumerManager.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/common/consumer/QueueConsumerManager.java @@ -31,25 +31,25 @@ import java.util.function.Supplier; @Slf4j public class QueueConsumerManager { - private final String key; private final String name; private final MsgPackProcessor msgPackProcessor; private final long pollInterval; private final ExecutorService consumerExecutor; + private final String threadPrefix; @Getter private final TbQueueConsumer consumer; private volatile boolean stopped; @Builder - public QueueConsumerManager(String key, String name, MsgPackProcessor msgPackProcessor, + public QueueConsumerManager(String name, MsgPackProcessor msgPackProcessor, long pollInterval, Supplier> consumerCreator, - ExecutorService consumerExecutor) { - this.key = key; + ExecutorService consumerExecutor, String threadPrefix) { this.name = name; this.pollInterval = pollInterval; this.msgPackProcessor = msgPackProcessor; this.consumerExecutor = consumerExecutor; + this.threadPrefix = threadPrefix; this.consumer = consumerCreator.get(); } @@ -64,7 +64,9 @@ public class QueueConsumerManager { public void launch() { log.info("[{}] Launching consumer", name); consumerExecutor.submit(() -> { - ThingsBoardThreadFactory.addThreadNamePrefix(key); + if (threadPrefix != null) { + ThingsBoardThreadFactory.addThreadNamePrefix(threadPrefix); + } try { consumerLoop(consumer); } catch (Throwable e) { @@ -104,4 +106,5 @@ public class QueueConsumerManager { public interface MsgPackProcessor { void process(List msgs, TbQueueConsumer consumer) throws Exception; } + } diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java index d208fab29e..8b7b88c261 100644 --- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java @@ -232,9 +232,8 @@ public class DefaultTransportService extends TransportActivityManager implements ruleEngineMsgProducer = producerProvider.getRuleEngineMsgProducer(); tbCoreMsgProducer = producerProvider.getTbCoreMsgProducer(); transportApiRequestTemplate.init(); - consumerExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("consumer")); + consumerExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("transport-consumer")); transportNotificationsConsumer = QueueConsumerManager.>builder() - .key("transport") .name("TB Transport") .msgPackProcessor(this::processNotificationMsgs) .pollInterval(notificationsPollDuration) diff --git a/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java b/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java index a5a7021d8d..34171c19cd 100644 --- a/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java +++ b/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java @@ -132,14 +132,13 @@ public class DefaultClusterVersionControlService extends TbApplicationEventListe @PostConstruct public void init() { - consumerExecutor = Executors.newCachedThreadPool(ThingsBoardThreadFactory.forName("consumer")); + consumerExecutor = Executors.newCachedThreadPool(ThingsBoardThreadFactory.forName("vc-consumer")); var threadFactory = ThingsBoardThreadFactory.forName("vc-io-thread"); for (int i = 0; i < ioPoolSize; i++) { ioThreads.add(MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor(threadFactory))); } producer = producerProvider.getTbCoreNotificationsMsgProducer(); consumer = QueueConsumerManager.>builder() - .key("vc") .name("TB Version Control") .msgPackProcessor(this::processMsgs) .pollInterval(pollDuration) From a6e47c3b133607a644d26d2be1c394cc3f6a44de Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Wed, 8 May 2024 13:50:30 +0300 Subject: [PATCH 11/17] Minor refactoring for fields naming --- ui-ngx/src/assets/locale/locale.constant-en_US.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json index 83ffba634f..e4ac64378e 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -1900,10 +1900,10 @@ "min-evaluation-period": "Minimum evaluation period", "max-evaluation-period": "Maximum evaluation period" }, - "default-object-id": "Default object Version (Attribute)", + "default-object-id": "Default Object Version (Attribute)", "default-object-id-ver": { - "v1-0": "\"1.0\" is the object's version value if the object's version is empty.", - "v1-1": "\"1.1\" is the object's version value if the object's version is empty." + "v1-0": "1.0", + "v1-1": "1.1" } }, "snmp": { From b16d8484e91798ec77a6e73f1726e5159de160b8 Mon Sep 17 00:00:00 2001 From: ViacheslavKlimov Date: Wed, 8 May 2024 14:50:11 +0300 Subject: [PATCH 12/17] Minor refactoring for notifications consumers --- .../queue/processing/AbstractConsumerService.java | 2 +- .../server/common/msg/queue/ServiceType.java | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java index 85227e50ab..a264f912cb 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java @@ -85,7 +85,7 @@ public abstract class AbstractConsumerService>builder() - .name("TB Notifications") + .name(getServiceType().getLabel() + " Notifications") .msgPackProcessor(this::processNotifications) .pollInterval(getNotificationPollDuration()) .consumerCreator(this::createNotificationsConsumer) diff --git a/common/message/src/main/java/org/thingsboard/server/common/msg/queue/ServiceType.java b/common/message/src/main/java/org/thingsboard/server/common/msg/queue/ServiceType.java index c823ea4d73..f3a0e47d09 100644 --- a/common/message/src/main/java/org/thingsboard/server/common/msg/queue/ServiceType.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/queue/ServiceType.java @@ -15,11 +15,23 @@ */ package org.thingsboard.server.common.msg.queue; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter public enum ServiceType { - TB_CORE, TB_RULE_ENGINE, TB_TRANSPORT, JS_EXECUTOR, TB_VC_EXECUTOR; + TB_CORE("TB Core"), + TB_RULE_ENGINE("TB Rule Engine"), + TB_TRANSPORT("TB Transport"), + JS_EXECUTOR("JS Executor"), + TB_VC_EXECUTOR("TB VC Executor"); + + private final String label; public static ServiceType of(String serviceType) { return ServiceType.valueOf(serviceType.replace("-", "_").toUpperCase()); } + } From 6c499fd342edb7e87989527143c95c54f0a8849f Mon Sep 17 00:00:00 2001 From: Kulikov <44275303+nickAS21@users.noreply.github.com> Date: Wed, 8 May 2024 16:09:37 +0300 Subject: [PATCH 13/17] LwM2M: default object version (#10731) * lwm2m: object-id-version default 1.0 * lwm2m: delete translate * lwm2m: delete translate3 * lwm2m: object id ver comment4 * lwm2m: object id ver comment5 * lwm2m: object id ver comment6 --- .../device/DeviceBulkImportService.java | 5 +- .../profile/lwm2m/OtherConfiguration.java | 1 + .../lwm2m/server/LwM2mServerListener.java | 6 +- .../server/LwM2mVersionedModelProvider.java | 8 +- .../lwm2m/server/client/LwM2mClient.java | 102 ++++++++++-------- .../server/client/LwM2mClientContextImpl.java | 2 +- .../ota/DefaultLwM2MOtaUpdateService.java | 14 +-- .../server/store/util/LwM2MClientSerDes.java | 9 ++ .../uplink/DefaultLwM2mUplinkMsgHandler.java | 28 ++--- .../server/uplink/LwM2mUplinkMsgHandler.java | 2 + .../lwm2m/utils/LwM2MTransportUtil.java | 81 +------------- .../main/resources/lwm2m/device_profile.json | 9 +- .../resources/lwm2m/models/test-model.xml | 4 +- .../src/main/resources/lwm2m/resource.json | 2 +- 14 files changed, 115 insertions(+), 158 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/device/DeviceBulkImportService.java b/application/src/main/java/org/thingsboard/server/service/device/DeviceBulkImportService.java index 0c3146a6c6..38f44898ee 100644 --- a/application/src/main/java/org/thingsboard/server/service/device/DeviceBulkImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/device/DeviceBulkImportService.java @@ -33,7 +33,6 @@ import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.device.credentials.BasicMqttCredentials; import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MClientCredential; import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode; -import org.thingsboard.server.common.data.device.data.DefaultDeviceConfiguration; import org.thingsboard.server.common.data.device.data.DeviceData; import org.thingsboard.server.common.data.device.data.PowerMode; import org.thingsboard.server.common.data.device.data.SnmpDeviceTransportConfiguration; @@ -68,6 +67,8 @@ import java.util.Set; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import static org.eclipse.leshan.core.LwM2m.Version.V1_0; + @Service @TbCoreComponent @RequiredArgsConstructor @@ -256,7 +257,7 @@ public class DeviceBulkImportService extends AbstractBulkImportService { Lwm2mDeviceProfileTransportConfiguration transportConfiguration = new Lwm2mDeviceProfileTransportConfiguration(); transportConfiguration.setBootstrap(Collections.emptyList()); - transportConfiguration.setClientLwM2mSettings(new OtherConfiguration(1, 1, 1, PowerMode.DRX, null, null, null, null, null)); + transportConfiguration.setClientLwM2mSettings(new OtherConfiguration(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())); DeviceProfileData deviceProfileData = new DeviceProfileData(); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/OtherConfiguration.java b/common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/OtherConfiguration.java index 36179502ad..7ab5ee3b56 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/OtherConfiguration.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/device/profile/lwm2m/OtherConfiguration.java @@ -39,4 +39,5 @@ public class OtherConfiguration extends PowerSavingConfiguration { private Long pagingTransmissionWindow; private String fwUpdateResource; private String swUpdateResource; + private String defaultObjectIDVer; } diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mServerListener.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mServerListener.java index b59914e2ac..7797242b51 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mServerListener.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mServerListener.java @@ -29,6 +29,7 @@ import org.eclipse.leshan.server.registration.Registration; import org.eclipse.leshan.server.registration.RegistrationListener; import org.eclipse.leshan.server.registration.RegistrationUpdate; import org.eclipse.leshan.server.send.SendListener; +import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; import java.util.Collection; @@ -101,7 +102,10 @@ public class LwM2mServerListener { @Override public void onResponse(SingleObservation observation, Registration registration, ObserveResponse response) { if (registration != null) { - service.onUpdateValueAfterReadResponse(registration, convertObjectIdToVersionedId(observation.getPath().toString(), registration), response); + LwM2mClient lwM2MClient = service.getClientContext().getClientByEndpoint(registration.getEndpoint()); + if (lwM2MClient != null) { + service.onUpdateValueAfterReadResponse(registration, convertObjectIdToVersionedId(observation.getPath().toString(), lwM2MClient), response); + } } } diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mVersionedModelProvider.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mVersionedModelProvider.java index 3e407bdfc9..78f76adc1d 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mVersionedModelProvider.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mVersionedModelProvider.java @@ -27,10 +27,10 @@ import org.springframework.stereotype.Service; import org.thingsboard.server.common.data.TbResource; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; +import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; import java.util.ArrayList; -import java.util.Base64; import java.util.Collection; import java.util.Map; import java.util.Optional; @@ -107,7 +107,8 @@ public class LwM2mVersionedModelProvider implements LwM2mModelProvider { @Override public ObjectModel getObjectModel(int objectId) { - String version = String.valueOf(registration.getSupportedVersion(objectId)); + LwM2mClient lwM2mClient = lwM2mClientContext.getClientByEndpoint(registration.getEndpoint()); + String version = lwM2mClient.getSupportedObjectVersion(objectId).toString(); if (version != null) { return this.getObjectModelDynamic(objectId, version); } @@ -116,7 +117,8 @@ public class LwM2mVersionedModelProvider implements LwM2mModelProvider { @Override public Collection getObjectModels() { - Map supportedObjects = this.registration.getSupportedObject(); + LwM2mClient lwM2mClient = lwM2mClientContext.getClientByEndpoint(registration.getEndpoint()); + Map supportedObjects = lwM2mClient.getSupportedClientObjects(); Collection result = new ArrayList<>(supportedObjects.size()); for (Map.Entry supportedObject : supportedObjects.entrySet()) { ObjectModel objectModel = this.getObjectModelDynamic(supportedObject.getKey(), String.valueOf(supportedObject.getValue())); diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java index cb391b27e9..e267561cd2 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java @@ -21,7 +21,10 @@ import lombok.Setter; import lombok.ToString; import lombok.extern.slf4j.Slf4j; import org.eclipse.leshan.core.LwM2m; +import org.eclipse.leshan.core.LwM2m.Version; +import org.eclipse.leshan.core.link.Link; import org.eclipse.leshan.core.link.attributes.Attribute; +import org.eclipse.leshan.core.link.lwm2m.MixedLwM2mLink; import org.eclipse.leshan.core.model.ObjectModel; import org.eclipse.leshan.core.model.ResourceModel; import org.eclipse.leshan.core.node.LwM2mMultipleResource; @@ -37,6 +40,7 @@ import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.device.data.Lwm2mDeviceTransportConfiguration; import org.thingsboard.server.common.data.device.data.PowerMode; +import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse; import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto; @@ -61,8 +65,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPARATOR_PATH; +import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LWM2M_OBJECT_VERSION_DEFAULT; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.convertMultiResourceValuesFromRpcBody; -import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.convertObjectIdToVersionedId; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.equalsResourceTypeGetSimpleName; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.fromVersionedIdToObjectId; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.getVerFromPathIdVerOrId; @@ -129,6 +133,12 @@ public class LwM2mClient { @Setter private UUID lastSentRpcId; + @Setter + private LwM2m.Version defaultObjectIDVer; + + @Getter + private Map supportedClientObjects; + public Object clone() throws CloneNotSupportedException { return super.clone(); } @@ -142,6 +152,7 @@ public class LwM2mClient { this.state = LwM2MClientState.CREATED; this.lock = new ReentrantLock(); this.retryAttempts = new AtomicInteger(0); + this.supportedClientObjects = null; } public void init(ValidateDeviceCredentialsResponse credentials, UUID sessionId) { @@ -153,12 +164,14 @@ public class LwM2mClient { this.edrxCycle = credentials.getDeviceInfo().getEdrxCycle(); this.psmActivityTimer = credentials.getDeviceInfo().getPsmActivityTimer(); this.pagingTransmissionWindow = credentials.getDeviceInfo().getPagingTransmissionWindow(); + this.defaultObjectIDVer = getObjectIDVerFromDeviceProfile(credentials.getDeviceProfile()); } public void setRegistration(Registration registration) { this.registration = registration; this.clientSupportContentFormats = clientSupportContentFormat(registration); this.defaultContentFormat = calculateDefaultContentFormat(registration); + this.setSupportedClientObjects(); } public void lock() { @@ -197,6 +210,15 @@ public class LwM2mClient { builder.setDeviceType(deviceProfile.getName()); } + private LwM2m.Version getObjectIDVerFromDeviceProfile(DeviceProfile deviceProfile) { + String defaultObjectIdVer = ((Lwm2mDeviceProfileTransportConfiguration)deviceProfile + .getProfileData() + .getTransportConfiguration()) + .getClientLwM2mSettings() + .getDefaultObjectIDVer(); + return new Version(defaultObjectIdVer == null ? LWM2M_OBJECT_VERSION_DEFAULT : defaultObjectIdVer); + } + public void refreshSessionId(String nodeId) { UUID newId = UUID.randomUUID(); SessionInfoProto.Builder builder = SessionInfoProto.newBuilder().mergeFrom(session); @@ -240,67 +262,28 @@ public class LwM2mClient { } } - public Object getResourceValue(String pathRezIdVer, String pathRezId) { - String pathRez = pathRezIdVer == null ? convertObjectIdToVersionedId(pathRezId, this.registration) : pathRezIdVer; - if (this.resources.get(pathRez) != null) { - return this.resources.get(pathRez).getLwM2mResource().getValue(); - } - return null; - } - - public Object getResourceNameByRezId(String pathRezIdVer, String pathRezId) { - String pathRez = pathRezIdVer == null ? convertObjectIdToVersionedId(pathRezId, this.registration) : pathRezIdVer; - if (this.resources.get(pathRez) != null) { - return this.resources.get(pathRez).getResourceModel().name; - } - return null; - } - - public String getRezIdByResourceNameAndObjectInstanceId(String resourceName, String pathObjectInstanceIdVer, LwM2mModelProvider modelProvider) { - LwM2mPath pathIds = getLwM2mPathFromString(pathObjectInstanceIdVer); - if (pathIds.isObjectInstance()) { - Set rezIds = modelProvider.getObjectModel(registration) - .getObjectModel(pathIds.getObjectId()).resources.entrySet() - .stream() - .filter(map -> resourceName.equals(map.getValue().name)) - .map(map -> map.getKey()) - .collect(Collectors.toSet()); - return rezIds.size() > 0 ? String.valueOf(rezIds.stream().findFirst().get()) : null; - } - return null; - } - public ResourceModel getResourceModel(String pathIdVer, LwM2mModelProvider modelProvider) { LwM2mPath pathIds = getLwM2mPathFromString(pathIdVer); - String verSupportedObject = String.valueOf(registration.getSupportedObject().get(pathIds.getObjectId())); + String verSupportedObject = String.valueOf(this.getSupportedObjectVersion(pathIds.getObjectId())); String verRez = getVerFromPathIdVerOrId(pathIdVer); return verRez != null && verRez.equals(verSupportedObject) ? modelProvider.getObjectModel(registration) .getResourceModel(pathIds.getObjectId(), pathIds.getResourceId()) : null; } - public boolean isResourceMultiInstances(String pathIdVer, LwM2mModelProvider modelProvider) { - var resourceModel = getResourceModel(pathIdVer, modelProvider); - if (resourceModel != null && resourceModel.multiple != null) { - return resourceModel.multiple; - } else { - return false; - } - } - public ObjectModel getObjectModel(String pathIdVer, LwM2mModelProvider modelProvider) { try { LwM2mPath pathIds = getLwM2mPathFromString(pathIdVer); - String verSupportedObject = String.valueOf(registration.getSupportedObject().get(pathIds.getObjectId())); + String verSupportedObject = String.valueOf(this.getSupportedObjectVersion(pathIds.getObjectId())); String verRez = getVerFromPathIdVerOrId(pathIdVer); return verRez != null && verRez.equals(verSupportedObject) ? modelProvider.getObjectModel(registration) .getObjectModel(pathIds.getObjectId()) : null; } catch (Exception e) { if (registration == null) { log.error("[{}] Failed Registration is null, GetObjectModelRegistration. ", this.endpoint, e); - } else if (registration.getSupportedObject() == null) { + } else if (this.getSupportedClientObjects() == null) { log.error("[{}] Failed SupportedObject in Registration, GetObjectModelRegistration.", this.endpoint, e); } else { - log.error("[{}] Failed ModelProvider.getObjectModel [{}] in Registration. ", this.endpoint, registration.getSupportedObject(), e); + log.error("[{}] Failed ModelProvider.getObjectModel [{}] in Registration. ", this.endpoint, this.getSupportedClientObjects(), e); } return null; } @@ -371,7 +354,7 @@ public class LwM2mClient { public String isValidObjectVersion(String path) { LwM2mPath pathIds = getLwM2mPathFromString(path); - LwM2m.Version verSupportedObject = registration.getSupportedObject().get(pathIds.getObjectId()); + LwM2m.Version verSupportedObject = this.getSupportedObjectVersion(pathIds.getObjectId()); if (verSupportedObject == null) { return String.format("Specified object id %s absent in the list supported objects of the client or is security object!", pathIds.getObjectId()); } else { @@ -460,5 +443,34 @@ public class LwM2mClient { return new LwM2mPath(fromVersionedIdToObjectId(path)); } + public LwM2m.Version getDefaultObjectIDVer() { + return this.defaultObjectIDVer == null ? new Version(LWM2M_OBJECT_VERSION_DEFAULT) : this.defaultObjectIDVer; + } + + public LwM2m.Version getSupportedObjectVersion(Integer objectid) { + return this.supportedClientObjects.get(objectid); + } + + private void setSupportedClientObjects(){ + this.supportedClientObjects = new ConcurrentHashMap<>(); + for (Link link: this.registration.getSortedObjectLinks()) { + MixedLwM2mLink mixedLwM2mLink = (MixedLwM2mLink)link; + if(!mixedLwM2mLink.getPath().isRoot()){ + LwM2mPath lwM2mPath = mixedLwM2mLink.getPath(); + if (lwM2mPath.isObject()) { + LwM2m.Version ver; + if (mixedLwM2mLink.getAttributes().get("ver")!= null) { + ver = (Version) mixedLwM2mLink.getAttributes().get("ver").getValue(); + } else { + ver = getDefaultObjectIDVer(); + } + this.supportedClientObjects.put(lwM2mPath.getObjectId(), ver); + } else if (this.supportedClientObjects.get(lwM2mPath.getObjectId()) == null){ + this.supportedClientObjects.put(lwM2mPath.getObjectId(), getDefaultObjectIDVer()); + } + } + } + } + } diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClientContextImpl.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClientContextImpl.java index 4f35489250..851b517db6 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClientContextImpl.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClientContextImpl.java @@ -396,7 +396,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext { Arrays.stream(client.getRegistration().getObjectLinks()).forEach(link -> { LwM2mPath pathIds = new LwM2mPath(link.getUriReference()); if (!pathIds.isRoot()) { - clientObjects.add(convertObjectIdToVersionedId(link.getUriReference(), client.getRegistration())); + clientObjects.add(convertObjectIdToVersionedId(link.getUriReference(), client)); } }); return (clientObjects.size() > 0) ? clientObjects : null; diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/ota/DefaultLwM2MOtaUpdateService.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/ota/DefaultLwM2MOtaUpdateService.java index f9d23383cd..0b5e995ea5 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/ota/DefaultLwM2MOtaUpdateService.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/ota/DefaultLwM2MOtaUpdateService.java @@ -481,7 +481,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl } private void startUpdateUsingUrl(LwM2mClient client, String id, String url) { - String targetIdVer = convertObjectIdToVersionedId(id, client.getRegistration()); + String targetIdVer = convertObjectIdToVersionedId(id, client); TbLwM2MWriteReplaceRequest request = TbLwM2MWriteReplaceRequest.builder().versionedId(targetIdVer).value(url).timeout(clientContext.getRequestTimeout(client)).build(); downlinkHandler.sendWriteReplaceRequest(client, request, new TbLwM2MWriteResponseCallback(uplinkHandler, logService, client, targetIdVer)); } @@ -512,10 +512,10 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl } switch (strategy) { case OBJ_5_BINARY: - startUpdateUsingBinary(client, convertObjectIdToVersionedId(FW_PACKAGE_5_ID, client.getRegistration()), otaPackageId); + startUpdateUsingBinary(client, convertObjectIdToVersionedId(FW_PACKAGE_5_ID, client), otaPackageId); break; case OBJ_19_BINARY: - startUpdateUsingBinary(client, convertObjectIdToVersionedId(FW_PACKAGE_19_ID, client.getRegistration()), otaPackageId); + startUpdateUsingBinary(client, convertObjectIdToVersionedId(FW_PACKAGE_19_ID, client), otaPackageId); break; case OBJ_5_TEMP_URL: startUpdateUsingUrl(client, FW_URL_ID, info.getBaseUrl() + "/" + FIRMWARE_UPDATE_COAP_RESOURCE + "/" + otaPackageId.toString()); @@ -534,7 +534,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl LwM2MSoftwareUpdateStrategy strategy = info.getStrategy(); switch (strategy) { case BINARY: - startUpdateUsingBinary(client, convertObjectIdToVersionedId(SW_PACKAGE_ID, client.getRegistration()), otaPackageId); + startUpdateUsingBinary(client, convertObjectIdToVersionedId(SW_PACKAGE_ID, client), otaPackageId); break; case TEMP_URL: startUpdateUsingUrl(client, SW_PACKAGE_URI_ID, info.getBaseUrl() + "/" + FIRMWARE_UPDATE_COAP_RESOURCE + "/" + otaPackageId.toString()); @@ -566,19 +566,19 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl } private void executeFwUpdate(LwM2mClient client) { - String fwExecuteVerId = convertObjectIdToVersionedId(FW_EXECUTE_ID, client.getRegistration()); + String fwExecuteVerId = convertObjectIdToVersionedId(FW_EXECUTE_ID, client); TbLwM2MExecuteRequest request = TbLwM2MExecuteRequest.builder().versionedId(fwExecuteVerId).timeout(clientContext.getRequestTimeout(client)).build(); downlinkHandler.sendExecuteRequest(client, request, new TbLwM2MExecuteCallback(logService, client, fwExecuteVerId)); } private void executeSwInstall(LwM2mClient client) { - String swInstallVerId = convertObjectIdToVersionedId(SW_INSTALL_ID, client.getRegistration()); + String swInstallVerId = convertObjectIdToVersionedId(SW_INSTALL_ID, client); TbLwM2MExecuteRequest request = TbLwM2MExecuteRequest.builder().versionedId(swInstallVerId).timeout(clientContext.getRequestTimeout(client)).build(); downlinkHandler.sendExecuteRequest(client, request, new TbLwM2MExecuteCallback(logService, client, swInstallVerId)); } private void executeSwUninstallForUpdate(LwM2mClient client) { - String swInInstallVerId = convertObjectIdToVersionedId(SW_UN_INSTALL_ID, client.getRegistration()); + String swInInstallVerId = convertObjectIdToVersionedId(SW_UN_INSTALL_ID, client); TbLwM2MExecuteRequest request = TbLwM2MExecuteRequest.builder().versionedId(swInInstallVerId).params("1").timeout(clientContext.getRequestTimeout(client)).build(); downlinkHandler.sendExecuteRequest(client, request, new TbLwM2MExecuteCallback(logService, client, swInInstallVerId)); } diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/util/LwM2MClientSerDes.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/util/LwM2MClientSerDes.java index 17fef8acb0..21cdc356a4 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/util/LwM2MClientSerDes.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/util/LwM2MClientSerDes.java @@ -107,6 +107,8 @@ public class LwM2MClientSerDes { if (client.getPagingTransmissionWindow() != null) { o.addProperty("pagingTransmissionWindow", client.getPagingTransmissionWindow()); } + o.addProperty("defaultObjectIDVer", client.getDefaultObjectIDVer().toString()); + if (client.getRegistration() != null) { String registrationAddress = client.getRegistration().getAddress().toString(); JsonNode registrationNode = registrationSerDes.jSerialize(client.getRegistration()); @@ -339,6 +341,13 @@ public class LwM2MClientSerDes { pagingTransmissionWindowField.set(lwM2mClient, pagingTransmissionWindow.getAsLong()); } + JsonElement defaultObjectIDVer = o.get("defaultObjectIDVer"); + if (defaultObjectIDVer != null) { + Field defaultObjectIDVerField = lwM2mClientClass.getDeclaredField("defaultObjectIDVer"); + defaultObjectIDVerField.setAccessible(true); + defaultObjectIDVerField.set(lwM2mClient, defaultObjectIDVer.getAsString()); + } + JsonElement registration = o.get("registration"); if (registration != null) { lwM2mClient.setRegistration(registrationSerDes.deserialize(toJsonNode(registration.getAsString()))); diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/uplink/DefaultLwM2mUplinkMsgHandler.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/uplink/DefaultLwM2mUplinkMsgHandler.java index fc95bb3728..bfc9f32dd8 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/uplink/DefaultLwM2mUplinkMsgHandler.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/uplink/DefaultLwM2mUplinkMsgHandler.java @@ -368,7 +368,7 @@ public class DefaultLwM2mUplinkMsgHandler extends LwM2MExecutorAwareService impl LwM2mPath path = entry.getKey(); LwM2mNode node = entry.getValue(); LwM2mClient lwM2MClient = clientContext.getClientByEndpoint(registration.getEndpoint()); - String stringPath = convertObjectIdToVersionedId(path.toString(), registration); + String stringPath = convertObjectIdToVersionedId(path.toString(), lwM2MClient); ObjectModel objectModelVersion = lwM2MClient.getObjectModel(stringPath, modelProvider); if (objectModelVersion != null) { if (node instanceof LwM2mObject) { @@ -584,27 +584,27 @@ public class DefaultLwM2mUplinkMsgHandler extends LwM2MExecutorAwareService impl private void updateResourcesValue(LwM2mClient lwM2MClient, LwM2mResource lwM2mResource, String path, Mode mode, int code) { Registration registration = lwM2MClient.getRegistration(); if (lwM2MClient.saveResourceValue(path, lwM2mResource, modelProvider, mode)) { - if (path.equals(convertObjectIdToVersionedId(FW_NAME_ID, registration))) { + if (path.equals(convertObjectIdToVersionedId(FW_NAME_ID, lwM2MClient))) { otaService.onCurrentFirmwareNameUpdate(lwM2MClient, (String) lwM2mResource.getValue()); - } else if (path.equals(convertObjectIdToVersionedId(FW_3_VER_ID, registration))) { + } else if (path.equals(convertObjectIdToVersionedId(FW_3_VER_ID, lwM2MClient))) { otaService.onCurrentFirmwareVersion3Update(lwM2MClient, (String) lwM2mResource.getValue()); - } else if (path.equals(convertObjectIdToVersionedId(FW_VER_ID, registration))) { + } else if (path.equals(convertObjectIdToVersionedId(FW_VER_ID, lwM2MClient))) { otaService.onCurrentFirmwareVersionUpdate(lwM2MClient, (String) lwM2mResource.getValue()); - } else if (path.equals(convertObjectIdToVersionedId(FW_STATE_ID, registration))) { + } else if (path.equals(convertObjectIdToVersionedId(FW_STATE_ID, lwM2MClient))) { otaService.onCurrentFirmwareStateUpdate(lwM2MClient, (Long) lwM2mResource.getValue()); - } else if (path.equals(convertObjectIdToVersionedId(FW_RESULT_ID, registration))) { + } else if (path.equals(convertObjectIdToVersionedId(FW_RESULT_ID, lwM2MClient))) { otaService.onCurrentFirmwareResultUpdate(lwM2MClient, (Long) lwM2mResource.getValue()); - } else if (path.equals(convertObjectIdToVersionedId(FW_DELIVERY_METHOD, registration))) { + } else if (path.equals(convertObjectIdToVersionedId(FW_DELIVERY_METHOD, lwM2MClient))) { otaService.onCurrentFirmwareDeliveryMethodUpdate(lwM2MClient, (Long) lwM2mResource.getValue()); - } else if (path.equals(convertObjectIdToVersionedId(SW_NAME_ID, registration))) { + } else if (path.equals(convertObjectIdToVersionedId(SW_NAME_ID, lwM2MClient))) { otaService.onCurrentSoftwareNameUpdate(lwM2MClient, (String) lwM2mResource.getValue()); - } else if (path.equals(convertObjectIdToVersionedId(SW_VER_ID, registration))) { + } else if (path.equals(convertObjectIdToVersionedId(SW_VER_ID, lwM2MClient))) { otaService.onCurrentSoftwareVersionUpdate(lwM2MClient, (String) lwM2mResource.getValue()); - } else if (path.equals(convertObjectIdToVersionedId(SW_3_VER_ID, registration))) { + } else if (path.equals(convertObjectIdToVersionedId(SW_3_VER_ID, lwM2MClient))) { otaService.onCurrentSoftwareVersion3Update(lwM2MClient, (String) lwM2mResource.getValue()); - } else if (path.equals(convertObjectIdToVersionedId(SW_STATE_ID, registration))) { + } else if (path.equals(convertObjectIdToVersionedId(SW_STATE_ID, lwM2MClient))) { otaService.onCurrentSoftwareStateUpdate(lwM2MClient, (Long) lwM2mResource.getValue()); - } else if (path.equals(convertObjectIdToVersionedId(SW_RESULT_ID, registration))) { + } else if (path.equals(convertObjectIdToVersionedId(SW_RESULT_ID, lwM2MClient))) { otaService.onCurrentSoftwareResultUpdate(lwM2MClient, (Long) lwM2mResource.getValue()); } if (ResponseCode.BAD_REQUEST.getCode() > code) { @@ -969,6 +969,10 @@ public class DefaultLwM2mUplinkMsgHandler extends LwM2MExecutorAwareService impl } } + public LwM2mClientContext getClientContext(){ + return this.clientContext; + }; + private Map getNamesFromProfileForSharedAttributes(LwM2mClient lwM2MClient) { Lwm2mDeviceProfileTransportConfiguration profile = clientContext.getProfile(lwM2MClient.getProfileId()); return profile.getObserveAttr().getKeyName(); diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/uplink/LwM2mUplinkMsgHandler.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/uplink/LwM2mUplinkMsgHandler.java index 65c7fb9654..0896963be2 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/uplink/LwM2mUplinkMsgHandler.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/uplink/LwM2mUplinkMsgHandler.java @@ -30,6 +30,7 @@ import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig; import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; +import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; import java.util.Collection; import java.util.Optional; @@ -77,4 +78,5 @@ public interface LwM2mUplinkMsgHandler { LwM2mValueConverter getConverter(); + LwM2mClientContext getClientContext(); } diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/utils/LwM2MTransportUtil.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/utils/LwM2MTransportUtil.java index db8398cd57..e2e31f2768 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/utils/LwM2MTransportUtil.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/utils/LwM2MTransportUtil.java @@ -20,16 +20,13 @@ import lombok.extern.slf4j.Slf4j; import org.eclipse.californium.elements.config.Configuration; import org.eclipse.leshan.core.model.LwM2mModel; import org.eclipse.leshan.core.model.ObjectLoader; -import org.eclipse.leshan.core.model.ObjectModel; import org.eclipse.leshan.core.model.ResourceModel; import org.eclipse.leshan.core.model.StaticModel; import org.eclipse.leshan.core.node.LwM2mMultipleResource; import org.eclipse.leshan.core.node.LwM2mPath; import org.eclipse.leshan.core.node.LwM2mResource; import org.eclipse.leshan.core.node.LwM2mSingleResource; -import org.eclipse.leshan.core.node.codec.CodecException; import org.eclipse.leshan.core.util.Hex; -import org.eclipse.leshan.server.registration.Registration; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceTransportType; @@ -49,8 +46,6 @@ import org.thingsboard.server.transport.lwm2m.server.ota.firmware.FirmwareUpdate import org.thingsboard.server.transport.lwm2m.server.ota.software.SoftwareUpdateResult; import org.thingsboard.server.transport.lwm2m.server.ota.software.SoftwareUpdateState; -import java.util.Arrays; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -84,56 +79,6 @@ public class LwM2MTransportUtil { public static final String LOG_LWM2M_WARN = "warn"; public static final int BOOTSTRAP_DEFAULT_SHORT_ID_0 = 0; - public enum LwM2MClientStrategy { - CLIENT_STRATEGY_1(1, "Read only resources marked as observation"), - CLIENT_STRATEGY_2(2, "Read all client resources"); - - public int code; - public String type; - - LwM2MClientStrategy(int code, String type) { - this.code = code; - this.type = type; - } - - public static LwM2MClientStrategy fromStrategyClientByType(String type) { - for (LwM2MClientStrategy to : LwM2MClientStrategy.values()) { - if (to.type.equals(type)) { - return to; - } - } - throw new IllegalArgumentException(String.format("Unsupported Client Strategy type : %s", type)); - } - - public static LwM2MClientStrategy fromStrategyClientByCode(int code) { - for (LwM2MClientStrategy to : LwM2MClientStrategy.values()) { - if (to.code == code) { - return to; - } - } - throw new IllegalArgumentException(String.format("Unsupported Client Strategy code : %s", code)); - } - } - - public static boolean equalsResourceValue(Object valueOld, Object valueNew, ResourceModel.Type type, LwM2mPath - resourcePath) throws CodecException { - switch (type) { - case BOOLEAN: - case INTEGER: - case FLOAT: - return String.valueOf(valueOld).equals(String.valueOf(valueNew)); - case TIME: - return ((Date) valueOld).getTime() == ((Date) valueNew).getTime(); - case STRING: - case OBJLNK: - return valueOld.equals(valueNew); - case OPAQUE: - return Arrays.equals(Hex.decodeHex(((String) valueOld).toCharArray()), Hex.decodeHex(((String) valueNew).toCharArray())); - default: - throw new CodecException("Invalid value type for resource %s, type %s", resourcePath, type); - } - } - public static LwM2mOtaConvert convertOtaUpdateValueToString(String pathIdVer, Object value, ResourceModel.Type currentType) { String path = fromVersionedIdToObjectId(pathIdVer); LwM2mOtaConvert lwM2mOtaConvert = new LwM2mOtaConvert(); @@ -210,22 +155,8 @@ public class LwM2MTransportUtil { return null; } - public static String validPathIdVer(String pathIdVer, Registration registration) throws - IllegalArgumentException { - if (!pathIdVer.contains(LWM2M_SEPARATOR_PATH)) { - throw new IllegalArgumentException(String.format("Error:")); - } else { - String[] keyArray = pathIdVer.split(LWM2M_SEPARATOR_PATH); - if (keyArray.length > 1 && keyArray[1].split(LWM2M_SEPARATOR_KEY).length == 2) { - return pathIdVer; - } else { - return convertObjectIdToVersionedId(pathIdVer, registration); - } - } - } - - public static String convertObjectIdToVersionedId(String path, Registration registration) { - String ver = String.valueOf(registration.getSupportedObject().get(new LwM2mPath(path).getObjectId())); + public static String convertObjectIdToVersionedId(String path, LwM2mClient lwM2MClient) { + String ver = String.valueOf(lwM2MClient.getSupportedObjectVersion(new LwM2mPath(path).getObjectId())); return convertObjectIdToVerId(path, ver); } public static String convertObjectIdToVerId(String path, String ver) { @@ -243,14 +174,6 @@ public class LwM2MTransportUtil { } } - public static String validateObjectVerFromKey(String key) { - try { - return (key.split(LWM2M_SEPARATOR_PATH)[1].split(LWM2M_SEPARATOR_KEY)[1]); - } catch (Exception e) { - return ObjectModel.DEFAULT_VERSION; - } - } - /** * "UNSIGNED_INTEGER": // Number -> Integer Example: * Alarm Timestamp [32-bit unsigned integer] diff --git a/monitoring/src/main/resources/lwm2m/device_profile.json b/monitoring/src/main/resources/lwm2m/device_profile.json index cc78187938..c75fe9ce7a 100644 --- a/monitoring/src/main/resources/lwm2m/device_profile.json +++ b/monitoring/src/main/resources/lwm2m/device_profile.json @@ -12,14 +12,14 @@ "transportConfiguration": { "observeAttr": { "observe": [ - "/3_1.1/0/0" + "/3_1.0/0/0" ], "attribute": [], "telemetry": [ - "/3_1.1/0/0" + "/3_1.0/0/0" ], "keyName": { - "/3_1.1/0/0": "testData" + "/3_1.0/0/0": "testData" }, "attributeLwm2m": {} }, @@ -44,8 +44,7 @@ "clientOnlyObserveAfterConnect": 1, "fwUpdateStrategy": 1, "swUpdateStrategy": 1, - "powerMode": "DRX", - "compositeOperationsSupport": false + "powerMode": "DRX" }, "bootstrapServerUpdateEnable": false, "type": "LWM2M" diff --git a/monitoring/src/main/resources/lwm2m/models/test-model.xml b/monitoring/src/main/resources/lwm2m/models/test-model.xml index b13934531d..7b71b5e783 100644 --- a/monitoring/src/main/resources/lwm2m/models/test-model.xml +++ b/monitoring/src/main/resources/lwm2m/models/test-model.xml @@ -23,9 +23,9 @@ 3 - urn:oma:lwm2m:oma:3:1.1 + urn:oma:lwm2m:oma:3 1.1 - 1.1 + 1.0 Single Mandatory diff --git a/monitoring/src/main/resources/lwm2m/resource.json b/monitoring/src/main/resources/lwm2m/resource.json index 3f4ec5c3fe..dcc0182bdd 100644 --- a/monitoring/src/main/resources/lwm2m/resource.json +++ b/monitoring/src/main/resources/lwm2m/resource.json @@ -2,5 +2,5 @@ "title": "", "resourceType": "LWM2M_MODEL", "fileName": "test-model.xml", - "data": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLQoKICAgIENvcHlyaWdodCDCqSAyMDE2LTIwMjIgVGhlIFRoaW5nc2JvYXJkIEF1dGhvcnMKCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi0tPgo8TFdNMk0geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKICAgICAgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3Lm9wZW5tb2JpbGVhbGxpYW5jZS5vcmcvdGVjaC9wcm9maWxlcy9MV00yTS12MV8xLnhzZCI+CiAgICA8T2JqZWN0IE9iamVjdFR5cGU9Ik1PRGVmaW5pdGlvbiI+CiAgICAgICAgPE5hbWU+THdNMk0gTW9uaXRvcmluZzwvTmFtZT4KICAgICAgICA8RGVzY3JpcHRpb24xPgogICAgICAgICAgICA8IVtDREFUQVtdXT48L0Rlc2NyaXB0aW9uMT4KICAgICAgICA8T2JqZWN0SUQ+MzwvT2JqZWN0SUQ+CiAgICAgICAgPE9iamVjdFVSTj51cm46b21hOmx3bTJtOm9tYTozOjEuMTwvT2JqZWN0VVJOPgogICAgICAgIDxMV00yTVZlcnNpb24+MS4xPC9MV00yTVZlcnNpb24+CiAgICAgICAgPE9iamVjdFZlcnNpb24+MS4xPC9PYmplY3RWZXJzaW9uPgogICAgICAgIDxNdWx0aXBsZUluc3RhbmNlcz5TaW5nbGU8L011bHRpcGxlSW5zdGFuY2VzPgogICAgICAgIDxNYW5kYXRvcnk+TWFuZGF0b3J5PC9NYW5kYXRvcnk+CiAgICAgICAgPFJlc291cmNlcz4KICAgICAgICAgICAgPEl0ZW0gSUQ9IjAiPgogICAgICAgICAgICAgICAgPE5hbWU+VGVzdCBkYXRhPC9OYW1lPgogICAgICAgICAgICAgICAgPE9wZXJhdGlvbnM+UjwvT3BlcmF0aW9ucz4KICAgICAgICAgICAgICAgIDxNdWx0aXBsZUluc3RhbmNlcz5TaW5nbGU8L011bHRpcGxlSW5zdGFuY2VzPgogICAgICAgICAgICAgICAgPE1hbmRhdG9yeT5PcHRpb25hbDwvTWFuZGF0b3J5PgogICAgICAgICAgICAgICAgPFR5cGU+U3RyaW5nPC9UeXBlPgogICAgICAgICAgICAgICAgPFJhbmdlRW51bWVyYXRpb24+PC9SYW5nZUVudW1lcmF0aW9uPgogICAgICAgICAgICAgICAgPFVuaXRzPjwvVW5pdHM+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+PCFbQ0RBVEFbVGVzdCBkYXRhXV0+PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvUmVzb3VyY2VzPgogICAgICAgIDxEZXNjcmlwdGlvbjI+PC9EZXNjcmlwdGlvbjI+CiAgICA8L09iamVjdD4KPC9MV00yTT4K" + "data": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLQoKICAgIENvcHlyaWdodCDCqSAyMDE2LTIwMjQgVGhlIFRoaW5nc2JvYXJkIEF1dGhvcnMKCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi0tPgo8TFdNMk0geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKICAgICAgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3Lm9wZW5tb2JpbGVhbGxpYW5jZS5vcmcvdGVjaC9wcm9maWxlcy9MV00yTS12MV8xLnhzZCI+CiAgICA8T2JqZWN0IE9iamVjdFR5cGU9Ik1PRGVmaW5pdGlvbiI+CiAgICAgICAgPE5hbWU+THdNMk0gTW9uaXRvcmluZzwvTmFtZT4KICAgICAgICA8RGVzY3JpcHRpb24xPgogICAgICAgICAgICA8IVtDREFUQVtdXT48L0Rlc2NyaXB0aW9uMT4KICAgICAgICA8T2JqZWN0SUQ+MzwvT2JqZWN0SUQ+CiAgICAgICAgPE9iamVjdFVSTj51cm46b21hOmx3bTJtOm9tYTozPC9PYmplY3RVUk4+CiAgICAgICAgPExXTTJNVmVyc2lvbj4xLjE8L0xXTTJNVmVyc2lvbj4KICAgICAgICA8T2JqZWN0VmVyc2lvbj4xLjA8L09iamVjdFZlcnNpb24+CiAgICAgICAgPE11bHRpcGxlSW5zdGFuY2VzPlNpbmdsZTwvTXVsdGlwbGVJbnN0YW5jZXM+CiAgICAgICAgPE1hbmRhdG9yeT5NYW5kYXRvcnk8L01hbmRhdG9yeT4KICAgICAgICA8UmVzb3VyY2VzPgogICAgICAgICAgICA8SXRlbSBJRD0iMCI+CiAgICAgICAgICAgICAgICA8TmFtZT5UZXN0IGRhdGE8L05hbWU+CiAgICAgICAgICAgICAgICA8T3BlcmF0aW9ucz5SPC9PcGVyYXRpb25zPgogICAgICAgICAgICAgICAgPE11bHRpcGxlSW5zdGFuY2VzPlNpbmdsZTwvTXVsdGlwbGVJbnN0YW5jZXM+CiAgICAgICAgICAgICAgICA8TWFuZGF0b3J5Pk9wdGlvbmFsPC9NYW5kYXRvcnk+CiAgICAgICAgICAgICAgICA8VHlwZT5TdHJpbmc8L1R5cGU+CiAgICAgICAgICAgICAgICA8UmFuZ2VFbnVtZXJhdGlvbj48L1JhbmdlRW51bWVyYXRpb24+CiAgICAgICAgICAgICAgICA8VW5pdHM+PC9Vbml0cz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj48IVtDREFUQVtUZXN0IGRhdGFdXT48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9SZXNvdXJjZXM+CiAgICAgICAgPERlc2NyaXB0aW9uMj48L0Rlc2NyaXB0aW9uMj4KICAgIDwvT2JqZWN0Pgo8L0xXTTJNPgo=" } \ No newline at end of file From 65fd836d9ffdb675a3f5873270d12a6c03097708 Mon Sep 17 00:00:00 2001 From: nick Date: Wed, 8 May 2024 17:16:11 +0300 Subject: [PATCH 14/17] fis_bug: LwM2MClientSerDes test --- .../lwm2m/server/client/LwM2mClient.java | 37 +++++++++---------- .../server/store/util/LwM2MClientSerDes.java | 3 +- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java index e267561cd2..405050bd71 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java @@ -24,7 +24,6 @@ import org.eclipse.leshan.core.LwM2m; import org.eclipse.leshan.core.LwM2m.Version; import org.eclipse.leshan.core.link.Link; import org.eclipse.leshan.core.link.attributes.Attribute; -import org.eclipse.leshan.core.link.lwm2m.MixedLwM2mLink; import org.eclipse.leshan.core.model.ObjectModel; import org.eclipse.leshan.core.model.ResourceModel; import org.eclipse.leshan.core.node.LwM2mMultipleResource; @@ -211,11 +210,14 @@ public class LwM2mClient { } private LwM2m.Version getObjectIDVerFromDeviceProfile(DeviceProfile deviceProfile) { - String defaultObjectIdVer = ((Lwm2mDeviceProfileTransportConfiguration)deviceProfile - .getProfileData() - .getTransportConfiguration()) - .getClientLwM2mSettings() - .getDefaultObjectIDVer(); + String defaultObjectIdVer = null; + if (deviceProfile != null) { + defaultObjectIdVer = ((Lwm2mDeviceProfileTransportConfiguration) deviceProfile + .getProfileData() + .getTransportConfiguration()) + .getClientLwM2mSettings() + .getDefaultObjectIDVer(); + } return new Version(defaultObjectIdVer == null ? LWM2M_OBJECT_VERSION_DEFAULT : defaultObjectIdVer); } @@ -454,20 +456,17 @@ public class LwM2mClient { private void setSupportedClientObjects(){ this.supportedClientObjects = new ConcurrentHashMap<>(); for (Link link: this.registration.getSortedObjectLinks()) { - MixedLwM2mLink mixedLwM2mLink = (MixedLwM2mLink)link; - if(!mixedLwM2mLink.getPath().isRoot()){ - LwM2mPath lwM2mPath = mixedLwM2mLink.getPath(); - if (lwM2mPath.isObject()) { - LwM2m.Version ver; - if (mixedLwM2mLink.getAttributes().get("ver")!= null) { - ver = (Version) mixedLwM2mLink.getAttributes().get("ver").getValue(); - } else { - ver = getDefaultObjectIDVer(); - } - this.supportedClientObjects.put(lwM2mPath.getObjectId(), ver); - } else if (this.supportedClientObjects.get(lwM2mPath.getObjectId()) == null){ - this.supportedClientObjects.put(lwM2mPath.getObjectId(), getDefaultObjectIDVer()); + LwM2mPath lwM2mPath = new LwM2mPath(link.getUriReference()); + if (lwM2mPath.isObject()) { + LwM2m.Version ver; + if (link.getAttributes().get("ver")!= null) { + ver = (Version) link.getAttributes().get("ver").getValue(); + } else { + ver = getDefaultObjectIDVer(); } + this.supportedClientObjects.put(lwM2mPath.getObjectId(), ver); + } else if (this.supportedClientObjects.get(lwM2mPath.getObjectId()) == null){ + this.supportedClientObjects.put(lwM2mPath.getObjectId(), getDefaultObjectIDVer()); } } } diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/util/LwM2MClientSerDes.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/util/LwM2MClientSerDes.java index 21cdc356a4..8cafc2bfd0 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/util/LwM2MClientSerDes.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/util/LwM2MClientSerDes.java @@ -23,6 +23,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.protobuf.util.JsonFormat; import lombok.SneakyThrows; +import org.eclipse.leshan.core.LwM2m.Version; import org.eclipse.leshan.core.model.ResourceModel; import org.eclipse.leshan.core.node.LwM2mMultipleResource; import org.eclipse.leshan.core.node.LwM2mNodeException; @@ -345,7 +346,7 @@ public class LwM2MClientSerDes { if (defaultObjectIDVer != null) { Field defaultObjectIDVerField = lwM2mClientClass.getDeclaredField("defaultObjectIDVer"); defaultObjectIDVerField.setAccessible(true); - defaultObjectIDVerField.set(lwM2mClient, defaultObjectIDVer.getAsString()); + defaultObjectIDVerField.set(lwM2mClient, new Version(defaultObjectIDVer.getAsString())); } JsonElement registration = o.get("registration"); From 6809114c0506d061fcd4f775d13b1104c83f00bb Mon Sep 17 00:00:00 2001 From: nick Date: Wed, 8 May 2024 19:10:53 +0300 Subject: [PATCH 15/17] fis_bug: setSupportedClientObjects() if link is root --- .../server/transport/lwm2m/server/client/LwM2mClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java index 405050bd71..705ed45995 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java @@ -465,7 +465,7 @@ public class LwM2mClient { ver = getDefaultObjectIDVer(); } this.supportedClientObjects.put(lwM2mPath.getObjectId(), ver); - } else if (this.supportedClientObjects.get(lwM2mPath.getObjectId()) == null){ + } else if (lwM2mPath.getObjectId() != null && this.supportedClientObjects.get(lwM2mPath.getObjectId()) == null){ this.supportedClientObjects.put(lwM2mPath.getObjectId(), getDefaultObjectIDVer()); } } From 305945133c78411b43728c6d0d609183293e02e6 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Thu, 9 May 2024 11:06:50 +0300 Subject: [PATCH 16/17] Import system images from tenant dashboards. Do not create tenant dashboards for test spring profile. --- .../server/service/entitiy/AbstractTbEntityService.java | 9 +++++++++ .../service/entitiy/tenant/DefaultTbTenantService.java | 5 ++++- .../server/service/install/InstallScripts.java | 3 ++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/AbstractTbEntityService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/AbstractTbEntityService.java index 0c91d72ea5..438cb58b91 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/AbstractTbEntityService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/AbstractTbEntityService.java @@ -22,6 +22,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; +import org.springframework.core.env.Environment; import org.thingsboard.server.cluster.TbClusterService; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.User; @@ -39,11 +40,15 @@ import org.thingsboard.server.service.telemetry.AlarmSubscriptionService; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.UUID; @Slf4j public abstract class AbstractTbEntityService { + @Autowired + private Environment env; + @Value("${server.log_controller_error_stack_trace}") @Getter private boolean logControllerErrorStackTrace; @@ -67,6 +72,10 @@ public abstract class AbstractTbEntityService { @Lazy private EntitiesVersionControlService vcService; + protected boolean isTestProfile() { + return Set.of(this.env.getActiveProfiles()).contains("test"); + } + protected T checkNotNull(T reference) throws ThingsboardException { return checkNotNull(reference, "Requested item wasn't found!"); } diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/tenant/DefaultTbTenantService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/tenant/DefaultTbTenantService.java index 8096722940..74061ee9e5 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/tenant/DefaultTbTenantService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/tenant/DefaultTbTenantService.java @@ -17,6 +17,7 @@ package org.thingsboard.server.service.entitiy.tenant; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Value; import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.id.TenantId; @@ -52,7 +53,9 @@ public class DefaultTbTenantService extends AbstractTbEntityService implements T Tenant savedTenant = tenantService.saveTenant(tenant, tenantId -> { installScripts.createDefaultRuleChains(tenantId); installScripts.createDefaultEdgeRuleChains(tenantId); - installScripts.createDefaultTenantDashboards(tenantId, null); + if (!isTestProfile()) { + installScripts.createDefaultTenantDashboards(tenantId, null); + } }); tenantProfileCache.evict(savedTenant.getId()); diff --git a/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java b/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java index 999079e913..9db2a99e7f 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java +++ b/application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java @@ -317,7 +317,8 @@ public class InstallScripts { @SneakyThrows public void loadSystemImages() { log.info("Loading system images..."); - Stream dashboardsFiles = Files.list(Paths.get(getDataDir(), JSON_DIR, DEMO_DIR, DASHBOARDS_DIR)); + Stream dashboardsFiles = Stream.concat(Files.list(Paths.get(getDataDir(), JSON_DIR, DEMO_DIR, DASHBOARDS_DIR)), + Files.list(Paths.get(getDataDir(), JSON_DIR, TENANT_DIR, DASHBOARDS_DIR))); try (dashboardsFiles) { dashboardsFiles.forEach(file -> { try { From bc82e2084fa3c0eb81be7fc8f45b6cd0b1893e81 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Thu, 9 May 2024 12:09:58 +0300 Subject: [PATCH 17/17] Fix testUsageInfo --- .../java/org/thingsboard/server/controller/HomePageApiTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/src/test/java/org/thingsboard/server/controller/HomePageApiTest.java b/application/src/test/java/org/thingsboard/server/controller/HomePageApiTest.java index 31c82408c1..55af29ab0b 100644 --- a/application/src/test/java/org/thingsboard/server/controller/HomePageApiTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/HomePageApiTest.java @@ -92,7 +92,7 @@ public class HomePageApiTest extends AbstractControllerTest { @MockBean private SmsService smsService; - private static final int DEFAULT_DASHBOARDS_COUNT = 1; + private static final int DEFAULT_DASHBOARDS_COUNT = 0; //For system administrator @Test