From 6b4c5119fd77cfa508c4c84ceaee0e8a175172b4 Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Tue, 1 Apr 2025 23:57:37 -0700 Subject: [PATCH 01/93] Circle Text Node Detail --- Meshtastic/Views/Helpers/CircleText.swift | 40 +++++++++++++------ .../Views/Messages/ChannelMessageList.swift | 2 +- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/Meshtastic/Views/Helpers/CircleText.swift b/Meshtastic/Views/Helpers/CircleText.swift index b8f74842..c48ed902 100644 --- a/Meshtastic/Views/Helpers/CircleText.swift +++ b/Meshtastic/Views/Helpers/CircleText.swift @@ -4,29 +4,43 @@ A view draws a circle in the background of the shortName text */ import SwiftUI +import CoreData struct CircleText: View { - var text: String - var color: Color + var text: String + var color: Color var circleSize: CGFloat = 45 + var node: NodeInfoEntity? = nil + + var body: some View { + NavigationStack{ + if let node = node { + NavigationLink(destination: NodeDetail(node: node)) { + circleContent + } + } else { + circleContent + } + } + + } - var body: some View { - - ZStack { - Circle() - .fill(color) - .frame(width: circleSize, height: circleSize) - Text(text.addingVariationSelectors) + var circleContent: some View { + ZStack { + Circle() + .fill(color) + .frame(width: circleSize, height: circleSize) + Text(text) .frame(width: circleSize * 0.9, height: circleSize * 0.9, alignment: .center) .foregroundColor(color.isLight() ? .black : .white) .minimumScaleFactor(0.001) .font(.system(size: 1300)) - } - } + } + } } struct CircleText_Previews: PreviewProvider { - static var previews: some View { + static var previews: some View { VStack { HStack { CircleText(text: "N1", color: Color.yellow, circleSize: 80) @@ -75,5 +89,5 @@ struct CircleText_Previews: PreviewProvider { .previewLayout(.fixed(width: 300, height: 100)) } } - } + } } diff --git a/Meshtastic/Views/Messages/ChannelMessageList.swift b/Meshtastic/Views/Messages/ChannelMessageList.swift index bf5be325..5a1a4fe2 100644 --- a/Meshtastic/Views/Messages/ChannelMessageList.swift +++ b/Meshtastic/Views/Messages/ChannelMessageList.swift @@ -48,7 +48,7 @@ struct ChannelMessageList: View { HStack(alignment: .bottom) { if currentUser { Spacer(minLength: 50) } if !currentUser { - CircleText(text: message.fromUser?.shortName ?? "?", color: Color(UIColor(hex: UInt32(message.fromUser?.num ?? 0))), circleSize: 44) + CircleText(text: message.fromUser?.shortName ?? "?", color: Color(UIColor(hex: UInt32(message.fromUser?.num ?? 0))), circleSize: 44, node: getNodeInfo(id: Int64(message.fromUser?.num ?? 0), context: context)) .padding(.all, 5) .offset(y: -7) } From ac37e6a28fe0cc6d25f1d67c4ef75e9eb73bbea1 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Wed, 2 Apr 2025 07:26:29 -0700 Subject: [PATCH 02/93] Add SVG files for think node m1 and M2 fix power metrick strings --- Localizable.xcstrings | 10 - Meshtastic.xcodeproj/project.pbxproj | 8 +- .../THINKNODEM1.imageset/Contents.json | 12 + .../THINKNODEM1.imageset/thinknode_m1.svg | 109 +++++ .../THINKNODEM2.imageset/Contents.json | 12 + .../THINKNODEM2.imageset/thinknode_m2.svg | 391 ++++++++++++++++++ Meshtastic/Resources/DeviceHardware.json | 17 +- 7 files changed, 540 insertions(+), 19 deletions(-) create mode 100644 Meshtastic/Assets.xcassets/THINKNODEM1.imageset/Contents.json create mode 100644 Meshtastic/Assets.xcassets/THINKNODEM1.imageset/thinknode_m1.svg create mode 100644 Meshtastic/Assets.xcassets/THINKNODEM2.imageset/Contents.json create mode 100644 Meshtastic/Assets.xcassets/THINKNODEM2.imageset/thinknode_m2.svg diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 08f7b2ae..43a11bb0 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -23158,16 +23158,6 @@ } }, "Power Metrics Log" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Логови метрике снаге" - } - } - } - }, - "Power Metrics Log}" : { "localizations" : { "sr" : { "stringUnit" : { diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 58e2baa5..a1f44726 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -1805,7 +1805,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.5.22; + MARKETING_VERSION = 2.5.23; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; @@ -1839,7 +1839,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.5.22; + MARKETING_VERSION = 2.5.23; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; @@ -1871,7 +1871,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.5.22; + MARKETING_VERSION = 2.5.23; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient.Widgets; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1904,7 +1904,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.5.22; + MARKETING_VERSION = 2.5.23; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient.Widgets; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/Meshtastic/Assets.xcassets/THINKNODEM1.imageset/Contents.json b/Meshtastic/Assets.xcassets/THINKNODEM1.imageset/Contents.json new file mode 100644 index 00000000..7001ca9b --- /dev/null +++ b/Meshtastic/Assets.xcassets/THINKNODEM1.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "thinknode_m1.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Meshtastic/Assets.xcassets/THINKNODEM1.imageset/thinknode_m1.svg b/Meshtastic/Assets.xcassets/THINKNODEM1.imageset/thinknode_m1.svg new file mode 100644 index 00000000..27e21a0b --- /dev/null +++ b/Meshtastic/Assets.xcassets/THINKNODEM1.imageset/thinknode_m1.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Meshtastic/Assets.xcassets/THINKNODEM2.imageset/Contents.json b/Meshtastic/Assets.xcassets/THINKNODEM2.imageset/Contents.json new file mode 100644 index 00000000..81ee0ac1 --- /dev/null +++ b/Meshtastic/Assets.xcassets/THINKNODEM2.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "thinknode_m2.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Meshtastic/Assets.xcassets/THINKNODEM2.imageset/thinknode_m2.svg b/Meshtastic/Assets.xcassets/THINKNODEM2.imageset/thinknode_m2.svg new file mode 100644 index 00000000..5e5a0e3c --- /dev/null +++ b/Meshtastic/Assets.xcassets/THINKNODEM2.imageset/thinknode_m2.svg @@ -0,0 +1,391 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Meshtastic/Resources/DeviceHardware.json b/Meshtastic/Resources/DeviceHardware.json index 00b80aea..bbe99f2a 100644 --- a/Meshtastic/Resources/DeviceHardware.json +++ b/Meshtastic/Resources/DeviceHardware.json @@ -543,7 +543,7 @@ "images": [ "t-watch-s3.svg" ], - "partitionScheme": "16MB" + "partitionScheme": "8MB" }, { "hwModel": 52, @@ -845,25 +845,32 @@ "hwModelSlug": "THINKNODE_M1", "platformioTarget": "thinknode_m1", "architecture": "nrf52840", - "activelySupported": false, + "activelySupported": true, "supportLevel": 1, "displayName": "ThinkNode M1", "tags": [ "Elecrow" ], - "requiresDfu": true + "requiresDfu": true, + "images": [ + "thinknode_m1.svg" + ], + "hasInkHud": true }, { "hwModel": 90, "hwModelSlug": "THINKNODE_M2", "platformioTarget": "thinknode_m2", "architecture": "esp32-s3", - "activelySupported": false, + "activelySupported": true, "supportLevel": 1, "displayName": "ThinkNode M2", "tags": [ "Elecrow" ], - "requiresDfu": false + "requiresDfu": false, + "images": [ + "thinknode_m2.svg" + ] } ] From 2db3883ce1b387f9cc04bf6cae71849743099daf Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Wed, 2 Apr 2025 15:30:53 -0700 Subject: [PATCH 03/93] Add SVG for XIAO NRF kit --- .../XIAONRF52KIT.imageset/Contents.json | 12 ++++++++++++ .../XIAONRF52KIT.imageset/seeed_xiao_nrf52_kit.svg | 1 + 2 files changed, 13 insertions(+) create mode 100644 Meshtastic/Assets.xcassets/XIAONRF52KIT.imageset/Contents.json create mode 100644 Meshtastic/Assets.xcassets/XIAONRF52KIT.imageset/seeed_xiao_nrf52_kit.svg diff --git a/Meshtastic/Assets.xcassets/XIAONRF52KIT.imageset/Contents.json b/Meshtastic/Assets.xcassets/XIAONRF52KIT.imageset/Contents.json new file mode 100644 index 00000000..08990d2d --- /dev/null +++ b/Meshtastic/Assets.xcassets/XIAONRF52KIT.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "seeed_xiao_nrf52_kit.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Meshtastic/Assets.xcassets/XIAONRF52KIT.imageset/seeed_xiao_nrf52_kit.svg b/Meshtastic/Assets.xcassets/XIAONRF52KIT.imageset/seeed_xiao_nrf52_kit.svg new file mode 100644 index 00000000..95f7211b --- /dev/null +++ b/Meshtastic/Assets.xcassets/XIAONRF52KIT.imageset/seeed_xiao_nrf52_kit.svg @@ -0,0 +1 @@ + \ No newline at end of file From 36da70c728cb80702a6d69ce3c6823f441c7d12a Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Wed, 2 Apr 2025 17:44:01 -0700 Subject: [PATCH 04/93] Scroll to Bottom Button View --- Localizable.xcstrings | 4 + Meshtastic.xcodeproj/project.pbxproj | 4 + .../Helpers/ScrollToBottomButtonView.swift | 30 ++ .../Views/Messages/ChannelMessageList.swift | 267 +++++++++++------- .../Views/Messages/UserMessageList.swift | 237 ++++++++++------ 5 files changed, 346 insertions(+), 196 deletions(-) create mode 100644 Meshtastic/Views/Helpers/ScrollToBottomButtonView.swift diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 08f7b2ae..2202f997 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -15149,6 +15149,9 @@ } } } + }, + "Jump to present" : { + }, "Key" : { "localizations" : { @@ -23168,6 +23171,7 @@ } }, "Power Metrics Log}" : { + "extractionState" : "stale", "localizations" : { "sr" : { "stringUnit" : { diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 58e2baa5..84c35ddf 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -62,6 +62,7 @@ BCB613832C672A2600485544 /* MessageChannelIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB613822C672A2600485544 /* MessageChannelIntent.swift */; }; BCB613852C68703800485544 /* NodePositionIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB613842C68703800485544 /* NodePositionIntent.swift */; }; BCB613872C69A0FB00485544 /* AppIntentErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB613862C69A0FB00485544 /* AppIntentErrors.swift */; }; + BCD93CB82D9E0D9F006C9214 /* ScrollToBottomButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD93CB72D9E0D9F006C9214 /* ScrollToBottomButtonView.swift */; }; BCE2D3C32C7ADF42008E6199 /* ShutDownNodeIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCE2D3C22C7ADF42008E6199 /* ShutDownNodeIntent.swift */; }; BCE2D3C52C7AE369008E6199 /* RestartNodeIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCE2D3C42C7AE369008E6199 /* RestartNodeIntent.swift */; }; BCE2D3C72C7B0D0A008E6199 /* ShortcutsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCE2D3C62C7B0D0A008E6199 /* ShortcutsProvider.swift */; }; @@ -326,6 +327,7 @@ BCB613822C672A2600485544 /* MessageChannelIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageChannelIntent.swift; sourceTree = ""; }; BCB613842C68703800485544 /* NodePositionIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodePositionIntent.swift; sourceTree = ""; }; BCB613862C69A0FB00485544 /* AppIntentErrors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIntentErrors.swift; sourceTree = ""; }; + BCD93CB72D9E0D9F006C9214 /* ScrollToBottomButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollToBottomButtonView.swift; sourceTree = ""; }; BCE2D3C22C7ADF42008E6199 /* ShutDownNodeIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShutDownNodeIntent.swift; sourceTree = ""; }; BCE2D3C42C7AE369008E6199 /* RestartNodeIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RestartNodeIntent.swift; sourceTree = ""; }; BCE2D3C62C7B0D0A008E6199 /* ShortcutsProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortcutsProvider.swift; sourceTree = ""; }; @@ -1056,6 +1058,7 @@ DD5E523D298F5A7D00D21B61 /* Weather */, DD6F65712C6AB8EC0053C113 /* SecureInput.swift */, 8D3F8A3E2D44BB02009EAAA4 /* PowerMetrics.swift */, + BCD93CB72D9E0D9F006C9214 /* ScrollToBottomButtonView.swift */, ); path = Helpers; sourceTree = ""; @@ -1437,6 +1440,7 @@ B399E8A42B6F486400E4488E /* RetryButton.swift in Sources */, DDB8F4102A9EE5B400230ECE /* Messages.swift in Sources */, 233E99C32D849D7A00CC3A77 /* WeightCompactWidget.swift in Sources */, + BCD93CB82D9E0D9F006C9214 /* ScrollToBottomButtonView.swift in Sources */, DD4A911E2708C65400501B7E /* AppSettings.swift in Sources */, DD1BD0F32C63C65E008C0C70 /* SecurityConfig.swift in Sources */, DD2160AF28C5552500C17253 /* MQTTConfig.swift in Sources */, diff --git a/Meshtastic/Views/Helpers/ScrollToBottomButtonView.swift b/Meshtastic/Views/Helpers/ScrollToBottomButtonView.swift new file mode 100644 index 00000000..50ddee24 --- /dev/null +++ b/Meshtastic/Views/Helpers/ScrollToBottomButtonView.swift @@ -0,0 +1,30 @@ +// +// ScrollToBottomButtonView.swift +// Meshtastic +// +// Created by Benjamin Faershtein on 4/2/25. +// + +import SwiftUI + +struct ScrollToBottomButtonView: View { + var body: some View { + HStack(spacing: 4) { + Text("Jump to present") + .font(.caption) + .padding(.horizontal, 8) + .padding(.vertical, 4) + .cornerRadius(12) + Image(systemName: "arrow.down") + .font(.title2) + .symbolRenderingMode(.hierarchical) + + } + .foregroundColor(.accentColor) + .shadow(radius: 2) + } +} + +#Preview { + ScrollToBottomButtonView() +} diff --git a/Meshtastic/Views/Messages/ChannelMessageList.swift b/Meshtastic/Views/Messages/ChannelMessageList.swift index bf5be325..19cdc4d3 100644 --- a/Meshtastic/Views/Messages/ChannelMessageList.swift +++ b/Meshtastic/Views/Messages/ChannelMessageList.swift @@ -22,128 +22,183 @@ struct ChannelMessageList: View { @ObservedObject var channel: ChannelEntity @State private var replyMessageId: Int64 = 0 @AppStorage("preferredPeripheralNum") private var preferredPeripheralNum = -1 + + // Scroll state + @State private var showScrollToBottomButton = false + @State private var hasReachedBottom = false + @State private var gotFirstUnreadMessage: Bool = false var body: some View { VStack { ScrollViewReader { scrollView in - ScrollView { - LazyVStack { - ForEach( channel.allPrivateMessages ) { (message: MessageEntity) in - let currentUser: Bool = (Int64(preferredPeripheralNum) == message.fromUser?.num ? true : false) - if message.replyID > 0 { - let messageReply = channel.allPrivateMessages.first(where: { $0.messageId == message.replyID }) - HStack { - Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) - .padding(10) - .overlay( - RoundedRectangle(cornerRadius: 18) - .stroke(Color.blue, lineWidth: 0.5) - ) - Image(systemName: "arrowshape.turn.up.left.fill") - .symbolRenderingMode(.hierarchical) - .imageScale(.large).foregroundColor(.accentColor) - .padding(.trailing) - } - } - HStack(alignment: .bottom) { - if currentUser { Spacer(minLength: 50) } - if !currentUser { - CircleText(text: message.fromUser?.shortName ?? "?", color: Color(UIColor(hex: UInt32(message.fromUser?.num ?? 0))), circleSize: 44) - .padding(.all, 5) - .offset(y: -7) - } - - VStack(alignment: currentUser ? .trailing : .leading) { - let isDetectionSensorMessage = message.portNum == Int32(PortNum.detectionSensorApp.rawValue) - - if !currentUser && message.fromUser != nil { - Text("\(message.fromUser?.longName ?? "unknown".localized ) (\(message.fromUser?.userId ?? "?"))") - .font(.caption) - .foregroundColor(.gray) - .offset(y: 8) - } - + ZStack(alignment: .bottomTrailing) { + ScrollView { + LazyVStack { + ForEach( channel.allPrivateMessages ) { (message: MessageEntity) in + let currentUser: Bool = (Int64(preferredPeripheralNum) == message.fromUser?.num ? true : false) + if message.replyID > 0 { + let messageReply = channel.allPrivateMessages.first(where: { $0.messageId == message.replyID }) HStack { - MessageText( - message: message, - tapBackDestination: .channel(channel), - isCurrentUser: currentUser - ) { - self.replyMessageId = message.messageId - self.messageFieldFocused = true - } - - if currentUser && message.canRetry { - RetryButton(message: message, destination: .channel(channel)) - } - } - - TapbackResponses(message: message) { - appState.unreadChannelMessages = myInfo.unreadMessages - context.refresh(myInfo, mergeChanges: true) - } - - HStack { - let ackErrorVal = RoutingError(rawValue: Int(message.ackError)) - if currentUser && message.receivedACK { - Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) - .foregroundStyle(ackErrorVal?.color ?? Color.red) - .font(.caption2) - } else if currentUser && message.ackError == 0 { - // Empty Error - Text("Waiting to be acknowledged. . .").font( - .caption2) - .foregroundColor(.orange) - } else if currentUser && !isDetectionSensorMessage { - Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) - .foregroundStyle(ackErrorVal?.color ?? Color.red) - .font(.caption2) - } + Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) + .padding(10) + .overlay( + RoundedRectangle(cornerRadius: 18) + .stroke(Color.blue, lineWidth: 0.5) + ) + Image(systemName: "arrowshape.turn.up.left.fill") + .symbolRenderingMode(.hierarchical) + .imageScale(.large).foregroundColor(.accentColor) + .padding(.trailing) } } - .padding(.bottom) - .id(channel.allPrivateMessages.firstIndex(of: message)) + HStack(alignment: .bottom) { + if currentUser { Spacer(minLength: 50) } + if !currentUser { + CircleText(text: message.fromUser?.shortName ?? "?", color: Color(UIColor(hex: UInt32(message.fromUser?.num ?? 0))), circleSize: 44) + .padding(.all, 5) + .offset(y: -7) + } - if !currentUser { - Spacer(minLength: 50) - } - } - .padding([.leading, .trailing]) - .frame(maxWidth: .infinity) - .id(message.messageId) - .onAppear { - if !message.read { - message.read = true - do { - for unreadMessage in channel.allPrivateMessages.filter({ !$0.read }) { - unreadMessage.read = true + VStack(alignment: currentUser ? .trailing : .leading) { + let isDetectionSensorMessage = message.portNum == Int32(PortNum.detectionSensorApp.rawValue) + + if !currentUser && message.fromUser != nil { + Text("\(message.fromUser?.longName ?? "unknown".localized ) (\(message.fromUser?.userId ?? "?"))") + .font(.caption) + .foregroundColor(.gray) + .offset(y: 8) + } + + HStack { + MessageText( + message: message, + tapBackDestination: .channel(channel), + isCurrentUser: currentUser + ) { + self.replyMessageId = message.messageId + self.messageFieldFocused = true + } + + if currentUser && message.canRetry { + RetryButton(message: message, destination: .channel(channel)) + } + } + + TapbackResponses(message: message) { + appState.unreadChannelMessages = myInfo.unreadMessages + context.refresh(myInfo, mergeChanges: true) + } + + HStack { + let ackErrorVal = RoutingError(rawValue: Int(message.ackError)) + if currentUser && message.receivedACK { + Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) + .foregroundStyle(ackErrorVal?.color ?? Color.red) + .font(.caption2) + } else if currentUser && message.ackError == 0 { + // Empty Error + Text("Waiting to be acknowledged. . .").font( + .caption2) + .foregroundColor(.orange) + } else if currentUser && !isDetectionSensorMessage { + Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) + .foregroundStyle(ackErrorVal?.color ?? Color.red) + .font(.caption2) + } + } + } + .padding(.bottom) + .id(channel.allPrivateMessages.firstIndex(of: message)) + + if !currentUser { + Spacer(minLength: 50) + } + } + .padding([.leading, .trailing]) + .frame(maxWidth: .infinity) + .id(message.messageId) + .onAppear { + if gotFirstUnreadMessage{ + if !message.read { + message.read = true + do { + for unreadMessage in channel.allPrivateMessages.filter({ !$0.read }) { + unreadMessage.read = true + } + try context.save() + Logger.data.info("📖 [App] Read message \(message.messageId, privacy: .public) ") + appState.unreadChannelMessages = myInfo.unreadMessages + context.refresh(myInfo, mergeChanges: true) + } catch { + Logger.data.error("Failed to read message \(message.messageId, privacy: .public): \(error.localizedDescription, privacy: .public)") + } + } + // Check if we've reached the bottom message + if message.messageId == channel.allPrivateMessages.last?.messageId { + hasReachedBottom = true + showScrollToBottomButton = false } - try context.save() - Logger.data.info("📖 [App] Read message \(message.messageId, privacy: .public) ") - appState.unreadChannelMessages = myInfo.unreadMessages - context.refresh(myInfo, mergeChanges: true) - } catch { - Logger.data.error("Failed to read message \(message.messageId, privacy: .public): \(error.localizedDescription, privacy: .public)") } } } + // Invisible spacer to detect reaching bottom + Color.clear + .frame(height: 1) + .id("bottomAnchor") + .onAppear { + hasReachedBottom = true + showScrollToBottomButton = false + } } } - } - .scrollDismissesKeyboard(.interactively) - .onFirstAppear { - withAnimation { - scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + .scrollDismissesKeyboard(.interactively) + .onFirstAppear { + // Find first unread message + if let firstUnreadMessageId = channel.allPrivateMessages.first(where: { !$0.read })?.messageId { + withAnimation { + scrollView.scrollTo(firstUnreadMessageId, anchor: .top) + showScrollToBottomButton = true + } + } else { + // If no unread messages, scroll to bottom + withAnimation { + scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + hasReachedBottom = true + } + } + gotFirstUnreadMessage = true } - } - .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardDidShowNotification)) { _ in - withAnimation { - scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardDidShowNotification)) { _ in + withAnimation { + scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + hasReachedBottom = true + showScrollToBottomButton = false + } } - } - .onChange(of: channel.allPrivateMessages) { - withAnimation { - scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + .onChange(of: channel.allPrivateMessages) { + if hasReachedBottom { + withAnimation { + scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + } + } else { + showScrollToBottomButton = true + } + } + + // Scroll to bottom button + if showScrollToBottomButton { + Button { + withAnimation { + scrollView.scrollTo("bottomAnchor", anchor: .bottom) + hasReachedBottom = true + showScrollToBottomButton = false + } + } label: { + ScrollToBottomButtonView() + } + .padding(.bottom, 8) + .padding(.trailing, 16) + .transition(.opacity) } } } diff --git a/Meshtastic/Views/Messages/UserMessageList.swift b/Meshtastic/Views/Messages/UserMessageList.swift index dea4586f..6f995756 100644 --- a/Meshtastic/Views/Messages/UserMessageList.swift +++ b/Meshtastic/Views/Messages/UserMessageList.swift @@ -20,115 +20,172 @@ struct UserMessageList: View { // View State Items @ObservedObject var user: UserEntity @State private var replyMessageId: Int64 = 0 + + // Scroll state + @State private var showScrollToBottomButton = false + @State private var hasReachedBottom = false + @State private var gotFirstUnreadMessage: Bool = false var body: some View { VStack { ScrollViewReader { scrollView in - ScrollView { - LazyVStack { - ForEach( user.messageList ) { (message: MessageEntity) in - if user.num != bleManager.connectedPeripheral?.num ?? -1 { - let currentUser: Bool = (Int64(UserDefaults.preferredPeripheralNum) == message.fromUser?.num ?? -1 ? true : false) + ZStack(alignment: .bottomTrailing) { + ScrollView { + LazyVStack { + ForEach( user.messageList ) { (message: MessageEntity) in + if user.num != bleManager.connectedPeripheral?.num ?? -1 { + let currentUser: Bool = (Int64(UserDefaults.preferredPeripheralNum) == message.fromUser?.num ?? -1 ? true : false) - if message.replyID > 0 { - let messageReply = user.messageList.first(where: { $0.messageId == message.replyID }) - HStack { - Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) - .padding(10) - .overlay( - RoundedRectangle(cornerRadius: 18) - .stroke(Color.blue, lineWidth: 0.5) - ) - Image(systemName: "arrowshape.turn.up.left.fill") - .symbolRenderingMode(.hierarchical) - .imageScale(.large).foregroundColor(.accentColor) - .padding(.trailing) + if message.replyID > 0 { + let messageReply = user.messageList.first(where: { $0.messageId == message.replyID }) + HStack { + Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) + .padding(10) + .overlay( + RoundedRectangle(cornerRadius: 18) + .stroke(Color.blue, lineWidth: 0.5) + ) + Image(systemName: "arrowshape.turn.up.left.fill") + .symbolRenderingMode(.hierarchical) + .imageScale(.large).foregroundColor(.accentColor) + .padding(.trailing) + } } - } - HStack(alignment: .top) { - if currentUser { Spacer(minLength: 50) } - VStack(alignment: currentUser ? .trailing : .leading) { - HStack { - MessageText( - message: message, - tapBackDestination: .user(user), - isCurrentUser: currentUser - ) { - self.replyMessageId = message.messageId - self.messageFieldFocused = true - } - - if currentUser && message.canRetry || (message.receivedACK && !message.realACK) { - RetryButton(message: message, destination: .user(user)) - } - } - - TapbackResponses(message: message) { - appState.unreadDirectMessages = user.unreadMessages - } - - HStack { - let ackErrorVal = RoutingError(rawValue: Int(message.ackError)) - if currentUser && message.receivedACK { - // Ack Received - if message.realACK { - Text("\(ackErrorVal?.display ?? "Empty Ack Error")") - .font(.caption2) - .foregroundStyle(ackErrorVal?.color ?? Color.secondary) - } else { - Text("Acknowledged by another node").font(.caption2).foregroundColor(.orange) + HStack(alignment: .top) { + if currentUser { Spacer(minLength: 50) } + VStack(alignment: currentUser ? .trailing : .leading) { + HStack { + MessageText( + message: message, + tapBackDestination: .user(user), + isCurrentUser: currentUser + ) { + self.replyMessageId = message.messageId + self.messageFieldFocused = true + } + + if currentUser && message.canRetry || (message.receivedACK && !message.realACK) { + RetryButton(message: message, destination: .user(user)) + } + } + + TapbackResponses(message: message) { + appState.unreadDirectMessages = user.unreadMessages + } + + HStack { + let ackErrorVal = RoutingError(rawValue: Int(message.ackError)) + if currentUser && message.receivedACK { + // Ack Received + if message.realACK { + Text("\(ackErrorVal?.display ?? "Empty Ack Error")") + .font(.caption2) + .foregroundStyle(ackErrorVal?.color ?? Color.secondary) + } else { + Text("Acknowledged by another node").font(.caption2).foregroundColor(.orange) + } + } else if currentUser && message.ackError == 0 { + // Empty Error + Text("Waiting to be acknowledged. . .").font(.caption2).foregroundColor(.yellow) + } else if currentUser && message.ackError > 0 { + Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) + .foregroundStyle(ackErrorVal?.color ?? Color.red) + .font(.caption2) } - } else if currentUser && message.ackError == 0 { - // Empty Error - Text("Waiting to be acknowledged. . .").font(.caption2).foregroundColor(.yellow) - } else if currentUser && message.ackError > 0 { - Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) - .foregroundStyle(ackErrorVal?.color ?? Color.red) - .font(.caption2) } } - } - .padding(.bottom) - .id(user.messageList.firstIndex(of: message)) + .padding(.bottom) + .id(user.messageList.firstIndex(of: message)) - if !currentUser { - Spacer(minLength: 50) + if !currentUser { + Spacer(minLength: 50) + } } - } - .padding([.leading, .trailing]) - .frame(maxWidth: .infinity) - .id(message.messageId) - .onAppear { - if !message.read { - message.read = true - do { - try context.save() - Logger.data.info("📖 [App] Read message \(message.messageId, privacy: .public) ") - appState.unreadDirectMessages = user.unreadMessages - - } catch { - Logger.data.error("Failed to read message \(message.messageId, privacy: .public): \(error.localizedDescription, privacy: .public)") + .padding([.leading, .trailing]) + .frame(maxWidth: .infinity) + .id(message.messageId) + .onAppear { + if gotFirstUnreadMessage { + if !message.read { + message.read = true + do { + for unreadMessage in user.messageList.filter({ !$0.read }) { + unreadMessage.read = true + } + try context.save() + Logger.data.info("📖 [App] Read message \(message.messageId, privacy: .public) ") + appState.unreadDirectMessages = user.unreadMessages + } catch { + Logger.data.error("Failed to read message \(message.messageId, privacy: .public): \(error.localizedDescription, privacy: .public)") + } + } + // Check if we've reached the bottom message + if message.messageId == user.messageList.last?.messageId { + hasReachedBottom = true + showScrollToBottomButton = false + } } } } } + // Invisible spacer to detect reaching bottom + Color.clear + .frame(height: 1) + .id("bottomAnchor") + .onAppear { + hasReachedBottom = true + showScrollToBottomButton = false + } } } - } - .scrollDismissesKeyboard(.interactively) - .onFirstAppear { - withAnimation { - scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) + .scrollDismissesKeyboard(.interactively) + .onFirstAppear { + // Find first unread message + if let firstUnreadMessageId = user.messageList.first(where: { !$0.read })?.messageId { + withAnimation { + scrollView.scrollTo(firstUnreadMessageId, anchor: .top) + showScrollToBottomButton = true + } + } else { + // If no unread messages, scroll to bottom + withAnimation { + scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) + hasReachedBottom = true + } + } + gotFirstUnreadMessage = true } - } - .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardDidShowNotification)) { _ in - withAnimation { - scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) + .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardDidShowNotification)) { _ in + withAnimation { + scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) + hasReachedBottom = true + showScrollToBottomButton = false + } } - } - .onChange(of: user.messageList) { - withAnimation { - scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) + .onChange(of: user.messageList) { + if hasReachedBottom { + withAnimation { + scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) + } + } else { + showScrollToBottomButton = true + } + } + + // Scroll to bottom button + if showScrollToBottomButton { + Button { + withAnimation { + scrollView.scrollTo("bottomAnchor", anchor: .bottom) + hasReachedBottom = true + showScrollToBottomButton = false + } + } label: { + ScrollToBottomButtonView() + } + .padding(.bottom, 8) + .padding(.trailing, 16) + .transition(.opacity) } } } From 23abed414eed10a3947d0df74d94eedbaa49b530 Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Fri, 4 Apr 2025 19:37:16 -0700 Subject: [PATCH 05/93] Made position popover icon clickable --- Meshtastic/Views/Helpers/CircleText.swift | 11 +++++---- .../Views/Messages/ChannelMessageList.swift | 4 ++-- .../Nodes/Helpers/Map/PositionPopover.swift | 24 +++++++++---------- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/Meshtastic/Views/Helpers/CircleText.swift b/Meshtastic/Views/Helpers/CircleText.swift index c48ed902..c7e490b7 100644 --- a/Meshtastic/Views/Helpers/CircleText.swift +++ b/Meshtastic/Views/Helpers/CircleText.swift @@ -13,14 +13,15 @@ struct CircleText: View { var node: NodeInfoEntity? = nil var body: some View { - NavigationStack{ if let node = node { - NavigationLink(destination: NodeDetail(node: node)) { - circleContent - } + NavigationStack{ + NavigationLink(destination: NodeDetail(node: node)) { + circleContent + } + } } else { circleContent - } + } } diff --git a/Meshtastic/Views/Messages/ChannelMessageList.swift b/Meshtastic/Views/Messages/ChannelMessageList.swift index 5a1a4fe2..4480b53b 100644 --- a/Meshtastic/Views/Messages/ChannelMessageList.swift +++ b/Meshtastic/Views/Messages/ChannelMessageList.swift @@ -160,8 +160,8 @@ struct ChannelMessageList: View { .toolbar { ToolbarItem(placement: .principal) { HStack { - CircleText(text: String(channel.index), color: .accentColor, circleSize: 44).fixedSize() - Text(String(channel.name ?? "unknown".localized).camelCaseToWords()).font(.headline) + CircleText(text: String(channel.index), color: .accentColor, circleSize: 44).fixedSize() + Text(String(channel.name ?? "unknown".localized).camelCaseToWords()).font(.headline) } } ToolbarItem(placement: .navigationBarTrailing) { diff --git a/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift b/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift index f68354c0..880a4074 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift @@ -23,10 +23,10 @@ struct PositionPopover: View { var body: some View { // Node Color from node.num let nodeColor = UIColor(hex: UInt32(position.nodePosition?.num ?? 0)) + NavigationStack{ VStack { HStack { ZStack { - if position.nodePosition?.isOnline ?? false { Circle() .fill(Color(nodeColor.lighter()).opacity(0.4).shadow(.drop(color: Color(nodeColor).isLight() ? .black : .white, radius: 5))) @@ -34,16 +34,15 @@ struct PositionPopover: View { .scaleEffect(scale) .animation( Animation.easeInOut(duration: 0.6) - .repeatForever().delay(delay), value: scale + .repeatForever().delay(delay), value: scale ) .onAppear { self.scale = 1 } .frame(width: 90, height: 90) } - CircleText(text: position.nodePosition?.user?.shortName ?? "?", color: Color(nodeColor), circleSize: 65) + CircleText(text: position.nodePosition?.user?.shortName ?? "?", color: Color(nodeColor), circleSize: 65, node: getNodeInfo(id: Int64(position.nodePosition?.user?.num ?? 0), context: context)) } - Text(position.nodePosition?.user?.longName ?? "Unknown") .font(.largeTitle) } @@ -106,7 +105,7 @@ struct PositionPopover: View { .foregroundColor(.primary) .font(idiom == .phone ? .callout : .body) } - + } icon: { Image(systemName: "mountain.2.fill") .symbolRenderingMode(.hierarchical) @@ -147,9 +146,9 @@ struct PositionPopover: View { Text("Heading: \(heading.formatted(.measurement(width: .narrow, numberFormatStyle: .number.precision(.fractionLength(0)))))") } icon: { Image(systemName: "location.north") - .symbolRenderingMode(.hierarchical) - .frame(width: 35) - .rotationEffect(degrees) + .symbolRenderingMode(.hierarchical) + .frame(width: 35) + .rotationEffect(degrees) } .padding(.bottom, 5) /// Distance @@ -181,15 +180,15 @@ struct PositionPopover: View { } .padding(.bottom, 5) if position.nodePosition?.viaMqtt ?? false { - + Label { Text("MQTT") .font(idiom == .phone ? .callout : .body) } icon: { Image(systemName: "network") - .symbolRenderingMode(.hierarchical) - .frame(width: 35) - .rotationEffect(degrees) + .symbolRenderingMode(.hierarchical) + .frame(width: 35) + .rotationEffect(degrees) } .padding(.bottom, 5) } @@ -244,6 +243,7 @@ struct PositionPopover: View { #endif } } + } .presentationDetents([.fraction(0.65), .large]) .presentationContentInteraction(.scrolls) .presentationDragIndicator(.visible) From 3bfdbd05f5a9ccf02ae7776502c9649ae1e96abd Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Fri, 4 Apr 2025 22:04:43 -0700 Subject: [PATCH 06/93] Fixed title --- Meshtastic/Views/Helpers/CircleText.swift | 3 +-- Meshtastic/Views/Nodes/Helpers/NodeDetail.swift | 1 + Meshtastic/Views/Nodes/NodeList.swift | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Meshtastic/Views/Helpers/CircleText.swift b/Meshtastic/Views/Helpers/CircleText.swift index c7e490b7..c9ee41c6 100644 --- a/Meshtastic/Views/Helpers/CircleText.swift +++ b/Meshtastic/Views/Helpers/CircleText.swift @@ -19,11 +19,10 @@ struct CircleText: View { circleContent } } + } else { circleContent - } - } var circleContent: some View { diff --git a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift index e48a9acc..10c0b569 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift @@ -520,6 +520,7 @@ struct NodeDetail: View { } } .listStyle(.insetGrouped) + .navigationBarTitle(String(node.user?.longName?.addingVariationSelectors ?? "unknown".localized), displayMode: .inline) } } } diff --git a/Meshtastic/Views/Nodes/NodeList.swift b/Meshtastic/Views/Nodes/NodeList.swift index 34dbd475..49b2d3a1 100644 --- a/Meshtastic/Views/Nodes/NodeList.swift +++ b/Meshtastic/Views/Nodes/NodeList.swift @@ -264,7 +264,6 @@ struct NodeList: View { columnVisibility: columnVisibility ) .edgesIgnoringSafeArea([.leading, .trailing]) - .navigationBarTitle(String(node.user?.longName?.addingVariationSelectors ?? "unknown".localized), displayMode: .inline) .navigationBarItems( trailing: ZStack { if UIDevice.current.userInterfaceIdiom != .phone { From f43d1e4cf58ec4754403accfea7b15a06e91b63e Mon Sep 17 00:00:00 2001 From: al31c0 <57990612+al31c0@users.noreply.github.com> Date: Sat, 5 Apr 2025 16:42:29 +0200 Subject: [PATCH 07/93] Added Italian translation Updated Localizable.xcstrings file with updated Italian translation. --- Localizable.xcstrings | 11167 +++++++++++++++++++++++++--------------- 1 file changed, 7023 insertions(+), 4144 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 08f7b2ae..1952e0af 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -1,11 +1,14 @@ { "sourceLanguage" : "en", "strings" : { - "" : { - "shouldTranslate" : false - }, "\t%@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22,6 +25,12 @@ }, " %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -37,10 +46,23 @@ } }, " %@%%" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@%%" + } + } + } }, ": %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : ": %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -57,6 +79,12 @@ }, ": %d" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : ": %d" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -73,6 +101,12 @@ }, "(Re)define PIN_GPS_EN for your board." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "(Ri)definire il PIN_GPS_EN per la propria scheda." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -89,6 +123,12 @@ }, "%@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -107,7 +147,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "%1$@ - %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "%1$@ - %2$@" } }, @@ -129,7 +175,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "%1$@ - %2$@ - %3$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "%1$@ - %2$@ - %3$@" } }, @@ -151,10 +203,16 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", "value" : "%1$@ - %2$@ Towards %3$@ Back" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ - %2$@ Verso %3$@ Indietro" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -177,6 +235,12 @@ "value" : "%@ - Keine Antwort" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ - Nessuna risposta" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -199,6 +263,12 @@ "value" : "%@ - Nicht gesendet" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ - Non inviato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -217,7 +287,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "%1$@ (%2$@)" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "%1$@ (%2$@)" } }, @@ -239,7 +315,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "%1$@ %2$@" } }, @@ -261,7 +343,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "%1$@ %2$lld" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "%1$@ %2$lld" } }, @@ -287,6 +375,12 @@ "value" : "%@ entfernt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ via" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -303,6 +397,12 @@ }, "%@ can be up to %@ bytes long." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ può essere lungo fino a %@ byte." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -319,6 +419,12 @@ }, "%@ Channels?" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ Canali?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -335,6 +441,12 @@ }, "%@ config data was requested over the admin channel but no response has been returned from the remote node." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "i dati di configurazione %@ sono stati richiesti attraverso il canale di amministrazione, ma non è stata fornita alcuna risposta dal nodo remoto." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -351,6 +463,12 @@ }, "%@ dB" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ dB" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -366,7 +484,6 @@ } }, "%@ Please try connecting again and check the PIN carefully." : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -386,18 +503,18 @@ "value" : "%@ בבקשה נסה שנית להתחבר למכשיר ובדוק את הקוד." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ Si prega di provare a connettersi nuovamente e di controllare attentamente il PIN." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "%@ Spróbuj połączyć się ponownie i dokładnie sprawdź PIN." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ Por favor, tente conectar novamente e verifique cuidadosamente o PIN." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -415,17 +532,10 @@ "state" : "translated", "value" : "%@ 请再次尝试连接并仔细检查 PIN 码。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ 請再次嘗試連接並仔細檢查 PIN 碼。" - } } } }, "%@ The app will automatically reconnect to the preferred radio if it comes back in range." : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -445,18 +555,18 @@ "value" : "%@ האפליקציה תנסה אוטומטית להתחבר מחדש למכשיר המועדף אם ייראה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ L'applicazione si riconnette automaticamente alla radio preferita se torna nel raggio d'azione." + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "%@ Aplikacja automatycznie ponownie połączy się z preferowanym radiem, jeśli wróci w zasięg." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@ O App vai reconetar automaticamente ao rádio preferido se ele voltar ao alcance." - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -474,17 +584,10 @@ "state" : "translated", "value" : "%@ 如果在默认电台的旁边,App 将会自动重连。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@ 如果在首選電台的旁邊,App 將會自動重連。" - } } } }, "%@ This error usually cannot be fixed without forgetting the device unders Settings > Bluetooth and re-connecting to the radio." : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -504,18 +607,18 @@ "value" : "%@ שגיאה זו בדרך כלל אינה ניתנת לתיקון ללא שכחחת המכשיר בהגדרות מכשיר > בלוטוס ואז להתחבר מחדש למכשיר." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ Questo errore di solito non può essere risolto senza dimenticare il dispositivo sotto Impostazioni > Bluetooth e riconnettersi alla radio." + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "%@ Ten błąd zwykle nie może być naprawiony bez zapomnienia urządzenia w Ustawienia > Bluetooth i ponownego połączenia z radiem." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@ Esse erro geralmente não pode ser corrigido sem esquecer o dispositivo em Configurações > Bluetooth e reconetar ao rádio." - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -533,12 +636,6 @@ "state" : "translated", "value" : "%@ 这个错误通常无法自动修复,你需要在系统设置的蓝牙选项中忽略该电台并重新配对。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@ 這個錯誤通常無法自動修復,你需要在系統設定的藍芽選項中忽略該電台並重新配對。" - } } } }, @@ -546,7 +643,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "%1$@, %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "%1$@, %2$@" } }, @@ -568,7 +671,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "%1$@: %2$lld / %3$lld" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "%1$@: %2$lld / %3$lld" } }, @@ -588,6 +697,12 @@ }, "%@%%" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@%%" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -604,6 +719,12 @@ }, "%@°F" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@°F" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -620,6 +741,12 @@ }, "%@mA" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@mA" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -630,6 +757,12 @@ }, "%@V" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@V" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -640,6 +773,12 @@ }, "%d" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -667,14 +806,32 @@ }, "other" : { "stringUnit" : { - "state" : "new", + "state" : "translated", "value" : "%d Hops" } - }, - "zero" : { + } + } + } + }, + "it" : { + "variations" : { + "plural" : { + "many" : { "stringUnit" : { "state" : "translated", - "value" : "Direct" + "value" : "%d Hop" + } + }, + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d Hop" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d Hop" } } } @@ -700,12 +857,6 @@ "state" : "translated", "value" : "%d скокова" } - }, - "zero" : { - "stringUnit" : { - "state" : "translated", - "value" : "Директно" - } } } } @@ -714,15 +865,9 @@ "variations" : { "plural" : { "other" : { - "stringUnit" : { - "state" : "new", - "value" : "%d Hops" - } - }, - "zero" : { "stringUnit" : { "state" : "translated", - "value" : "Direct" + "value" : "%d Hops" } } } @@ -732,6 +877,12 @@ }, "%d%%" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d%%" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -748,6 +899,12 @@ }, "%lf" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lf" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -764,6 +921,12 @@ }, "%lld" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -786,6 +949,12 @@ "value" : "%lld oder weniger Hops entfernt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld o meno hops di distanza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -796,6 +965,12 @@ }, "%lld Readings Total" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Letture Totale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -806,6 +981,12 @@ }, "%lld Total Detection Events" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Totale eventi di rilevamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -816,6 +997,12 @@ }, "%lld%%" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld%%" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -838,6 +1025,12 @@ "value" : "%llddb Übertragungsleistung" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%llddb Potenza di trasmissione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -860,6 +1053,12 @@ "value" : "%llddBm Übertragungsleistung" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%llddBm Potenza di trasmissione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -870,6 +1069,12 @@ }, "< 1%" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "< 1%" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -886,6 +1091,12 @@ }, "🦕 End of life Version 🦖 ☄️" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "🦕 Versione di fine vita 🦖 ☄️" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -896,6 +1107,12 @@ }, "1 byte" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 byte" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -912,6 +1129,12 @@ }, "1 hop away" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "a 1 salto di distanza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -927,8 +1150,13 @@ } }, "2.4 Ghz" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "2.4 Ghz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -939,6 +1167,12 @@ }, "7" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "7" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -955,6 +1189,12 @@ }, "8" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "8" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -971,6 +1211,12 @@ }, "25" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "25" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -987,6 +1233,12 @@ }, "50" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "50" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1003,6 +1255,12 @@ }, "75" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "75" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1019,6 +1277,12 @@ }, "100" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "100" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1035,6 +1299,12 @@ }, "128 bit" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "128 bit" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1051,6 +1321,12 @@ }, "256 bit" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "256 bit" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1067,6 +1343,12 @@ }, "A Trace Route was sent, no response has been received." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È stata inviata una rotta di tracciamento, ma non è stata ricevuta alcuna risposta." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1077,6 +1359,12 @@ }, "About" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Circa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1087,6 +1375,12 @@ }, "About Meshtastic" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Informazioni su Meshtastic" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1103,6 +1397,12 @@ "value" : "Genauigkeit %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Precisione %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1113,6 +1413,12 @@ }, "Ack SNR: %@ dB" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "SNR Ack: %@ dB" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1123,6 +1429,12 @@ }, "Ack Time: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempo di risposta: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1133,6 +1445,12 @@ }, "Acknowledged by another node" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riconosciuto da un altro nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1149,6 +1467,12 @@ "value" : "Aktionen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Azioni" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1165,6 +1489,12 @@ "value" : "Aktiv" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1181,6 +1511,12 @@ "value" : "Aktivität" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attività" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1197,6 +1533,12 @@ }, "Add Channel" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1207,6 +1549,12 @@ }, "Add Channels" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi canali" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1223,6 +1571,12 @@ "value" : "Zu Favoriten hinzufügen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi ai preferiti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1233,6 +1587,12 @@ }, "Additional help" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aiuto supplementare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1249,6 +1609,12 @@ }, "Address" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indirizzo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1271,6 +1637,12 @@ "value" : "Schlüssel für Administrator und Direktnachrichten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tasti amministratore e messaggi diretti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1287,6 +1659,12 @@ }, "Administration" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amministrazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1303,6 +1681,12 @@ }, "Advanced" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avanzato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1319,6 +1703,12 @@ }, "Advanced Device GPS" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo avanzato GPS" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1335,6 +1725,12 @@ }, "Advanced GPIO Options" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni GPIO avanzate" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1351,6 +1747,12 @@ }, "Advanced Position Flags" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Flags di posizione avanzati" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1367,7 +1769,6 @@ }, "ago" : { "comment" : "Three hours ago = Три сата пре", - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -1387,18 +1788,18 @@ "value" : "עברו" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "fa" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "temu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "há" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -1416,12 +1817,6 @@ "state" : "translated", "value" : "之前" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "ago" - } } } }, @@ -1445,18 +1840,18 @@ "value" : "זמן אוויר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ora d'aria" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Czas nadawania" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Tempo ao Ár" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -1474,17 +1869,17 @@ "state" : "translated", "value" : "广播时间" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "廣播時間" - } } } }, "Alert" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Allarme" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1495,6 +1890,12 @@ }, "Alert GPIO buzzer when receiving a bell" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avvisare il buzzer GPIO quando si riceve un campanello" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1511,6 +1912,12 @@ }, "Alert GPIO buzzer when receiving a message" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avvisare il cicalino GPIO quando si riceve un messaggio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1521,6 +1928,12 @@ }, "Alert GPIO vibra motor when receiving a bell" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avviso GPIO del motore a vibrazione quando si riceve una campana" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1537,6 +1950,12 @@ }, "Alert GPIO vibra motor when receiving a message" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avviso GPIO del motore vibrante alla ricezione di un messaggio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1547,6 +1966,12 @@ }, "Alert when receiving a bell" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avviso di ricezione di un campanello" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1563,6 +1988,12 @@ }, "Alert when receiving a message" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avviso di ricezione di un messaggio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1579,6 +2010,12 @@ "value" : "Alle" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tutti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1595,6 +2032,12 @@ }, "All device and app data will be deleted." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tutti i dati del dispositivo e delle app verranno eliminati." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1617,6 +2060,12 @@ "value" : "Erlaubt die eingehende Gerätesteuerung über den unsicheren Legacy-Admin-Kanal." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Consentire il controllo del dispositivo in entrata attraverso il canale di amministrazione legacy non sicuro." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1627,6 +2076,12 @@ }, "Allow Position Requests" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Consentire le richieste di posizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1637,6 +2092,12 @@ }, "Alt" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alt" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1653,6 +2114,12 @@ "value" : "Höhe" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Altitudine" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1669,6 +2136,12 @@ "value" : "Höhe %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Altitudine %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1679,6 +2152,12 @@ }, "Altitude Geoidal Separation" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Altitudine Separazione geoidale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1689,6 +2168,12 @@ }, "Altitude is Mean Sea Level" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'altitudine è il livello medio del mare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1698,7 +2183,6 @@ } }, "Always On" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -1718,18 +2202,18 @@ "value" : "תמיד דלוק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sempre acceso" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Zawsze włączone" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Sempre Ligado" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -1747,12 +2231,6 @@ "state" : "translated", "value" : "常亮" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "常亮" - } } } }, @@ -1764,6 +2242,12 @@ "value" : "Immer nach Norden zeigen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Punta sempre verso nord" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1792,18 +2276,18 @@ "value" : "תאורת סביבה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Illuminazione ambientale" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Ambient Lighting" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Iluminação Ambiental" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -1821,12 +2305,6 @@ "state" : "translated", "value" : "氛围灯" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "環境照明" - } } } }, @@ -1850,18 +2328,18 @@ "value" : "הגדרות תאורת סביבה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione dell'illuminazione ambientale" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Ambient Lighting Config" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Configuração Iluminação Ambiental" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -1879,12 +2357,6 @@ "state" : "translated", "value" : "氛围灯配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "環境照明設定" - } } } }, @@ -1896,6 +2368,12 @@ "value" : "Ein quelloffenes, netzunabhängiges, dezentrales Mesh-Netzwerk, das auf kostengünstigen, stromsparenden Funkgeräten läuft." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Una rete mesh open source, off-grid, decentralizzata, che funziona con radio a basso costo e a bassa potenza." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1912,6 +2390,12 @@ }, "Any missed messages will be delivered again." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I messaggi persi saranno consegnati nuovamente." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1928,6 +2412,12 @@ }, "App Data" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dati dell'applicazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1944,6 +2434,12 @@ }, "App Files" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "File dell'applicazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1960,6 +2456,12 @@ }, "App Settings" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impostazioni dell'app" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1976,6 +2478,12 @@ }, "Apple Apps" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Applicazioni Apple" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1998,6 +2506,12 @@ "value" : "Ungefährer Standort" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione approssimativa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2008,6 +2522,12 @@ }, "Are you sure you want to delete this message?" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sei sicuro di voler cancellare questo messaggio?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2030,6 +2550,12 @@ "value" : "Bist du sicher dass du den Knoten auf die Werkseinstellungen zurücksetzen willst?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Siete sicuri di voler resettare il nodo?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2064,18 +2590,18 @@ "value" : "האם אתה בטוח?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sei sicuro?" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Jesteś pewny?" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Tem a certeza?" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2093,18 +2619,17 @@ "state" : "translated", "value" : "是否确认?" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "是否確定?" - } } } }, "Australia / New Zealand" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Australia / Nuova Zelanda" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2115,6 +2640,12 @@ }, "Automatically toggles to the next page on the screen like a carousel, based the specified interval." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Passa automaticamente alla pagina successiva sullo schermo come un carosello, in base all'intervallo specificato." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2131,6 +2662,12 @@ }, "Available modem presets, default is Long Fast." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preimpostazioni modem disponibili, l'impostazione predefinita è Lungo veloce." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2165,18 +2702,18 @@ "value" : "מכשירים זמינים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radio disponibili" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Dostępne radia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Rádios Disponíveis" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2194,11 +2731,27 @@ "state" : "translated", "value" : "可以连接的电台" } - }, - "zh-Hant-TW" : { + } + } + }, + "Backup Database" : { + "localizations" : { + "it" : { "stringUnit" : { - "state" : "needs_review", - "value" : "可以連接的設備" + "state" : "translated", + "value" : "Database di backup" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Резервна база података" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "备份数据库" } } } @@ -2211,6 +2764,12 @@ "value" : "Bandbreite" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Larghezza di banda" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2227,6 +2786,12 @@ }, "Bar" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bar" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2243,6 +2808,12 @@ }, "Bar Series" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serie Bar" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2259,6 +2830,12 @@ }, "Barometric Pressure" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pressione barometrica" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2293,18 +2870,18 @@ "value" : "רמת סוללה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Livello della batteria" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Poziom naładowania baterii" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Nível de Bataria" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2322,17 +2899,17 @@ "state" : "translated", "value" : "电池电量" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "電池電量" - } } } }, "Battery Level %" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Livello della batteria %" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2349,6 +2926,12 @@ }, "Baud" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baud" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2383,18 +2966,18 @@ "value" : "שם בלוטוס" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome BLE" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Nazwa BLE" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Nome BLE" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2412,12 +2995,6 @@ "state" : "translated", "value" : "蓝牙名称" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "藍芽名稱" - } } } }, @@ -2441,18 +3018,18 @@ "value" : "קוד בלוטוס חייבת להיות בת 6 ספרות." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il pin BLE deve essere composto da 6 cifre." + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Pin BLE musi mieć długość 6 cyfr." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "O Pin do BLE deve ter 6 dígitos." - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2470,17 +3047,17 @@ "state" : "translated", "value" : "蓝牙 PIN 码必须是 6 位数字。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "藍芽 PIN 碼必須是 6 位數字。" - } } } }, "BLE RSSI: %lld" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "RSSI BLE: %lld" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2497,6 +3074,12 @@ }, "BLE: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "BLE: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2531,13 +3114,13 @@ "value" : "בלוטוס" } }, - "pl" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "Bluetooth" } }, - "pt-PT" : { + "pl" : { "stringUnit" : { "state" : "translated", "value" : "Bluetooth" @@ -2560,12 +3143,6 @@ "state" : "translated", "value" : "蓝牙" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "藍芽" - } } } }, @@ -2589,18 +3166,18 @@ "value" : "הגדרות בלוטוס" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione Bluetooth" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Konfiguracja Bluetooth" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Configuração Bluetooth" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2618,12 +3195,6 @@ "state" : "translated", "value" : "蓝牙配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "藍芽設置" - } } } }, @@ -2647,18 +3218,18 @@ "value" : "בלוטוס כבוי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il Bluetooth è spento" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Bluetooth jest wyłączony" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Bluetooth está desligado" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2676,17 +3247,17 @@ "state" : "translated", "value" : "蓝牙已关闭" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "藍芽已關閉" - } } } }, "Broadcast Interval" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo di trasmissione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2703,6 +3274,12 @@ }, "Button GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pulsante GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2719,6 +3296,12 @@ }, "Buy Complete Radios" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Acquistare radio complete" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2735,6 +3318,12 @@ }, "Buzzer GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buzzer GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2750,7 +3339,6 @@ } }, "Bytes" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -2770,18 +3358,18 @@ "value" : "בייטים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Byte" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Bajty" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Bytes" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2799,17 +3387,17 @@ "state" : "translated", "value" : "字节" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "位元組" - } } } }, "Call Sign" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Segnale di chiamata" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2826,6 +3414,12 @@ }, "Call Sign must not be empty" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il nominativo non deve essere vuoto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2860,18 +3454,18 @@ "value" : "בטל" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annullamento" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Anuluj" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Cancelar" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2889,12 +3483,6 @@ "state" : "translated", "value" : "取消" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "取消" - } } } }, @@ -2918,18 +3506,18 @@ "value" : "הודעות קבועות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi in scatola" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Gotowe wiadomości" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Mensagens Enlatados" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2947,12 +3535,6 @@ "state" : "translated", "value" : "快捷消息" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "罐頭訊息" - } } } }, @@ -2976,18 +3558,18 @@ "value" : "הגדרות הודעות קבועות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione dei messaggi in scatola" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Konfiguracja gotowych wiadomości" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Configuração dos Mensagens Enlatados" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -3005,17 +3587,10 @@ "state" : "translated", "value" : "快捷消息配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "通知設定" - } } } }, "canned.messages.preset.cardkb" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -3041,18 +3616,18 @@ "value" : "M5 Stack Card KB / RAK Keypad" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "M5 Stack Card KB / Tastiera RAK" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "M5 Stack Card KB / RAK Keypad" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "M5 Stack Card KB / Teclado RAK" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -3070,17 +3645,10 @@ "state" : "translated", "value" : "M5 Stack 卡片键盘 / RAK 键盘" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "M5Stack 卡片鍵盤 / RAK 鍵盤" - } } } }, "canned.messages.preset.manual" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -3106,18 +3674,18 @@ "value" : "הגדרה ידנית" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione manuale" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja ręczna" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração Manual" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -3135,17 +3703,10 @@ "state" : "translated", "value" : "手动配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "手動設定" - } } } }, "canned.messages.preset.rakrotary" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -3171,18 +3732,18 @@ "value" : "RAK Rotary Encoder Module" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modulo encoder rotativo RAK" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Moduł kodera obrotowego RAK" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Module Codificador do RAK Rotary" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -3200,17 +3761,17 @@ "state" : "translated", "value" : "RAK 编码器" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "RAK 旋轉編碼器" - } } } }, "Carousel Interval" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo del carosello" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3227,6 +3788,12 @@ "value" : "Kategorien" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Categorie" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3243,6 +3810,12 @@ }, "Ch1 Current" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corrente Ch1" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3253,6 +3826,12 @@ }, "Ch1 Voltage" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tensione Ch1" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3263,6 +3842,12 @@ }, "Ch2 Current" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corrente Ch2" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3273,6 +3858,12 @@ }, "Ch2 Voltage" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tensione Ch2" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3283,6 +3874,12 @@ }, "Ch3 Current" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corrente Ch3" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3293,6 +3890,12 @@ }, "Ch3 Voltage" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tensione Ch3" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3321,18 +3924,18 @@ "value" : "ערוץ" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Kanał" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Canal" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -3350,17 +3953,17 @@ "state" : "translated", "value" : "频道" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "頻道" - } } } }, "Channel 0 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 0 Incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3377,6 +3980,12 @@ }, "Channel 1" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 1" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3387,6 +3996,12 @@ }, "Channel 1 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 1 Incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3403,6 +4018,12 @@ }, "Channel 2" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 2" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3413,6 +4034,12 @@ }, "Channel 2 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 2 incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3429,6 +4056,12 @@ }, "Channel 3" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 3" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3439,6 +4072,12 @@ }, "Channel 3 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 3 incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3455,6 +4094,12 @@ }, "Channel 4 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 4 Incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3471,6 +4116,12 @@ }, "Channel 5 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 5 Incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3487,6 +4138,12 @@ }, "Channel 6 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 6 Incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3503,6 +4160,12 @@ }, "Channel 7 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 7 Incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3519,6 +4182,12 @@ }, "channel details" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "dettagli del canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3535,6 +4204,12 @@ }, "Channel Name" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome del canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3551,6 +4226,12 @@ }, "Channel number must be between 0 and 7." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il numero del canale deve essere compreso tra 0 e 7." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3567,6 +4248,12 @@ }, "Channel Role" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ruolo del canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3583,6 +4270,12 @@ }, "Channel URL" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "URL del canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3592,10 +4285,16 @@ } }, "Channel Utilization %@%%" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizzo del canale %@%%" + } + } + } }, "channel.role.disabled" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -3621,18 +4320,18 @@ "value" : "כבוי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disattivato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wyłączony" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desativado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -3650,17 +4349,10 @@ "state" : "translated", "value" : "禁用" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "關閉" - } } } }, "channel.role.primary" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -3686,18 +4378,18 @@ "value" : "עיקרי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Primario" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Podstawowy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Primário" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -3715,17 +4407,10 @@ "state" : "translated", "value" : "主要" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "主要" - } } } }, "channel.role.secondary" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -3751,18 +4436,18 @@ "value" : "משני" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Secondario" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wtórny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Secundária" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -3780,12 +4465,6 @@ "state" : "translated", "value" : "次要" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "次要" - } } } }, @@ -3815,18 +4494,18 @@ "value" : "שימוש ערוץ" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizzo del canale" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wykorzystanie kanału" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Utilização do Canal" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -3844,12 +4523,6 @@ "state" : "translated", "value" : "频道利用率" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "頻道利用率" - } } } }, @@ -3879,18 +4552,18 @@ "value" : "ערוצים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canali" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Kanały" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canais" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -3908,17 +4581,17 @@ "state" : "translated", "value" : "频道" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "頻道" - } } } }, "Channels being added from the QR code did not save. When adding channels the names must be unique." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I canali aggiunti dal codice QR non venivano salvati. Quando si aggiungono canali, i nomi devono essere unici." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3935,6 +4608,12 @@ }, "Chart" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Grafico" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3951,6 +4630,12 @@ }, "CHG" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "CHG" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3960,8 +4645,13 @@ } }, "China" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cina" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3972,6 +4662,12 @@ }, "Clear" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Libero" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3988,6 +4684,12 @@ }, "Clear Log" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancella registro" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4022,18 +4724,18 @@ "value" : "אפס הגדרות אפליקציה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancella i dati dell'app" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wyczyść dane aplikacji" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apagar os dados do App" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4051,17 +4753,17 @@ "state" : "translated", "value" : "清除 App 数据" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "清除 App 資料" - } } } }, "Client" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cliente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4078,6 +4780,12 @@ }, "Client History" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Storia del cliente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4094,6 +4802,12 @@ }, "Client History Request Sent" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Richiesta di cronologia clienti inviata" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4110,6 +4824,12 @@ }, "Client options" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni del cliente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4126,6 +4846,12 @@ }, "Clockwise Rotary Event" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Evento rotariano in senso orario" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4166,18 +4892,18 @@ "value" : "סגור" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiudere" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zamknij" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fechar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4195,17 +4921,17 @@ "state" : "translated", "value" : "关闭" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "關閉" - } } } }, "Coding Rate" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tasso di codifica" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4228,6 +4954,12 @@ "value" : "Farbe" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Colore" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4244,6 +4976,12 @@ }, "Communicating" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Comunicare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4253,10 +4991,23 @@ } }, "Community Support" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supporto alla community" + } + } + } }, "Config" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4291,18 +5042,18 @@ "value" : "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quando è abilitato, il modulo PAX Counter conta il numero di persone che passano utilizzando il WiFi e il Bluetooth. Per il funzionamento del contatore PAX, sia il WiFI che il Bluetooth devono essere disattivati." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quando ativado, o módulo de Contador de PAX conta o número de pessoas que passam usando Wi-Fi e Bluetooth. Tanto o Wi-Fi quanto o Bluetooth devem estar desativados para que o contador de PAX funcione." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4320,12 +5071,6 @@ "state" : "translated", "value" : "启用 PAX 计数器模块时,通过使用 WiFi 和蓝牙来计算经过的人数。为了使 PAX 计数器正常工作,必须将 WiFi 和蓝牙都禁用。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "啟用後,人流計數器模組將透過 WiFi 和藍牙計算經過的人數。必須停用 WiFi 和藍牙才能讓 PAX 計數器正常工作。" - } } } }, @@ -4349,18 +5094,18 @@ "value" : "PAX Counter" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Contatore PAX" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "PAX Counter" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contador de PAX" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4378,12 +5123,6 @@ "state" : "translated", "value" : "PAX 计数器" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "人流計數器" - } } } }, @@ -4407,18 +5146,18 @@ "value" : "PAX Counter Config" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del contatore PAX" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "PAX Counter Config" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do Contador de PAX" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4436,12 +5175,6 @@ "state" : "translated", "value" : "PAX 计数器配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "人流計數器設定" - } } } }, @@ -4465,18 +5198,18 @@ "value" : "Update Interval" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo di aggiornamento" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Update Interval" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervalo de Atualização" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4494,12 +5227,6 @@ "state" : "translated", "value" : "更新间隔" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "更新時間間隔" - } } } }, @@ -4523,18 +5250,18 @@ "value" : "How often we can send a message to the mesh when people are detected." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quanto spesso possiamo inviare un messaggio alla rete quando le persone vengono rilevate." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "How often we can send a message to the mesh when people are detected." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Com que frequência podemos enviar uma mensagem para a malha quando as pessoas são detectadas." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4552,12 +5279,6 @@ "state" : "translated", "value" : "检测到人员时,我们可以隔多久发送一条消息到 Mesh" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "當檢測到人員時,我們可以多久發送一次訊息到網狀網路。" - } } } }, @@ -4581,18 +5302,18 @@ "value" : "Multiplier" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Moltiplicatore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Multiplier" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Multiplicador" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4604,12 +5325,6 @@ "state" : "translated", "value" : "Мултипликатор" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "修正倍數" - } } } }, @@ -4633,18 +5348,18 @@ "value" : "ADC Override" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Override ADC" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "ADC Override" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Substituir ADC" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4656,17 +5371,10 @@ "state" : "translated", "value" : "Преписивање ADC-а" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "ADC校正" - } } } }, "config.power.ls.secs" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -4680,18 +5388,18 @@ "value" : "Light Sleep Interval" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo di sospensione leggera" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Light Sleep Interval" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervalo de Dormir Leve" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4709,17 +5417,10 @@ "state" : "translated", "value" : "轻度睡眠间隔" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "輕度休眠間隔" - } } } }, "config.power.min.wake.secs" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -4733,18 +5434,18 @@ "value" : "Minimum Wake Interval" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo minimo di risveglio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Minimum Wake Interval" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervalo Mínimo de Despertar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4762,12 +5463,6 @@ "state" : "translated", "value" : "最小唤醒间隔" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "最小的喚醒間隔時間" - } } } }, @@ -4791,18 +5486,18 @@ "value" : "Power Saving" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Risparmio energetico" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Power Saving" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Poupar a Energia" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4820,12 +5515,6 @@ "state" : "translated", "value" : "省电模式" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "省電模式" - } } } }, @@ -4843,18 +5532,18 @@ "value" : "Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sospenderà tutto il più possibile, per il ruolo di tracker e sensore questo includerà anche la radio lora. Non utilizzare questa impostazione se si desidera utilizzare il dispositivo con le applicazioni del telefono o se si utilizza un dispositivo senza pulsante utente." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vai por dormir o máximo possível, para o papel do rastreador e o papel do sensor isso incluirá também o rádio lora. Não use essa configuração se deseja usar seu dispositivo com os aplicativos do telefone ou está usando um dispositivo sem um botão do usuário." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4872,12 +5561,6 @@ "state" : "translated", "value" : "尽可能让所有设备处于睡眠状态,对于跟踪器和传感器来说,这也包括 LoRa 无线电。如果您想将电台与手机 App 一起使用,或使用没有用户按钮的电台,请不要使用此设置。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "為了追蹤器和感測器的角色,這將包括將 LoRa 無線電設備盡可能地進入睡眠模式。如果您想要使用手機應用程式操作您的設備,或者使用沒有用戶按鈕的設備,請不要使用此設定。" - } } } }, @@ -4901,18 +5584,18 @@ "value" : "Battery" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Batteria" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Battery" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bataria" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4930,17 +5613,10 @@ "state" : "translated", "value" : "电池" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電池" - } } } }, "config.power.section.sleep" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -4960,18 +5636,18 @@ "value" : "Sleep" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sospensione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Sleep" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dormir" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4989,12 +5665,6 @@ "state" : "translated", "value" : "休眠" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "休眠" - } } } }, @@ -5018,18 +5688,18 @@ "value" : "Power" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Potenza" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Power" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Energia" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5047,12 +5717,6 @@ "state" : "translated", "value" : "电源" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電源" - } } } }, @@ -5076,18 +5740,18 @@ "value" : "After" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dopo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "After" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Após" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5099,12 +5763,6 @@ "state" : "translated", "value" : "Након" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "之後" - } } } }, @@ -5128,18 +5786,18 @@ "value" : "Shutdown on Power Loss" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spegnimento in caso di perdita di alimentazione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Shutdown on Power Loss" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desligar em caso de Perda de Energia" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5157,12 +5815,6 @@ "state" : "translated", "value" : "断电时关机" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "失去電源後關機" - } } } }, @@ -5186,18 +5838,18 @@ "value" : "Power Config" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione dell'alimentazione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Power Config" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de Energia" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5215,17 +5867,10 @@ "state" : "translated", "value" : "电源配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電源設定" - } } } }, "config.power.wait.bluetooth.secs" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -5245,18 +5890,18 @@ "value" : "Bluetooth Off After" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth spento dopo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Bluetooth Off After" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desligar o Bluetooth Após" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5274,17 +5919,10 @@ "state" : "translated", "value" : "蓝牙关闭 After" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "等待藍芽" - } } } }, "config.ringtone" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -5304,18 +5942,18 @@ "value" : "RTTTL Ringtone" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suoneria RTTTL" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "RTTTL Ringtone" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toque RTTTL" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5333,12 +5971,6 @@ "state" : "translated", "value" : "RTTTL 铃声" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL 鈴聲" - } } } }, @@ -5356,18 +5988,18 @@ "value" : "Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ringtone Transfer Language(RTTTL) Stringa di suoneria utilizzata dai cicalini supportati nelle notifiche esterne." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Idioma de Transferência de Toque (RTTTL) Sequência de Toque usada por campainhas suportadas em notificações externas." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5385,12 +6017,6 @@ "state" : "translated", "value" : "支持外部通知中使用的铃声传输语言 (RTTTL) 铃声字符串。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL 鈴聲字串(Ringtone Transfer Language)被用於外部通知中支援的蜂鳴器。" - } } } }, @@ -5408,18 +6034,18 @@ "value" : "Ringtone Transfer Language" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lingua di trasferimento della suoneria" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Ringtone Transfer Language" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Idioma de Transferência de Toque" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5437,12 +6063,6 @@ "state" : "translated", "value" : "铃声传输语言" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "鈴聲傳輸語言(RTTTL)" - } } } }, @@ -5466,18 +6086,18 @@ "value" : "Ringtone Config" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della suoneria" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Ringtone Config" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de Toque" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5495,12 +6115,6 @@ "state" : "translated", "value" : "铃声配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "鈴聲" - } } } }, @@ -5530,18 +6144,18 @@ "value" : "לאחר שמירת הגדרות המכשיר יתחיל מחדש." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dopo il salvataggio dei valori di configurazione, il nodo si riavvia." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Po zapisaniu wartości konfiguracji węzeł zostanie zrestartowany." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Após salvar os valores de configuração, o nó reiniciará" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5559,12 +6173,6 @@ "state" : "translated", "value" : "节点将会在保存配置后重启。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電台將會在設定儲存後重啟。" - } } } }, @@ -5576,6 +6184,12 @@ "value" : "Konfiguration für: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione per: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -5586,6 +6200,12 @@ }, "Configuration Presets" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preset di configurazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -5608,6 +6228,12 @@ "value" : "Konfigurieren" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -5617,7 +6243,14 @@ } }, "Confirm" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conferma" + } + } + } }, "Connect to a Node" : { "localizations" : { @@ -5627,6 +6260,12 @@ "value" : "Verbunden mit einem Knoten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Collegarsi a un nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -5636,7 +6275,14 @@ } }, "Connect to new radio?" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Collegare alla nuova radio?" + } + } + } }, "connected" : { "localizations" : { @@ -5664,18 +6310,18 @@ "value" : "מחובר בבלוטוס" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth collegato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Podłączony" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth Connectado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5693,12 +6339,6 @@ "state" : "translated", "value" : "蓝牙已连接" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "已連接" - } } } }, @@ -5710,6 +6350,12 @@ "value" : "Verbunden mit Knoten %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodo collegato %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -5719,7 +6365,14 @@ } }, "Connected Radio" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radio connessa" + } + } + } }, "connected.radio" : { "localizations" : { @@ -5747,18 +6400,18 @@ "value" : "מכשיר מחובר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radio connessa" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Podłączone radio" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rádio Conectado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5776,12 +6429,6 @@ "state" : "translated", "value" : "电台已连接" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "已連接的電台" - } } } }, @@ -5811,18 +6458,18 @@ "value" : "מתחבר . ." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Collegamento. ." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Łączenie . ." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Conectando . ." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5840,17 +6487,18 @@ "state" : "translated", "value" : "连接中..." } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "連接中..." - } } } }, "Connecting to a new radio will clear all app data on the phone." : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La connessione a una nuova radio cancellerà tutti i dati delle app sul telefono." + } + } + } }, "Connection Attempt %lld of 10" : { "localizations" : { @@ -5860,6 +6508,12 @@ "value" : "Verbindungsversuch %lld von 10" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tentativo di connessione %lld di 10" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -5875,7 +6529,6 @@ } }, "Connection failed after %d attempts to connect to %@. You may need to forget your device under Settings > Bluetooth." : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -5901,18 +6554,18 @@ "value" : "התחברות נכשלה לאחר %d נסיונות להתחבר ל%@. יתכן ויש צורך 'לשכוח' את המכשיר בהגדרות מכשיר > בלוטוס." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Connessione fallita dopo %d tentativi di connessione a %@. Potrebbe essere necessario disaccoppiare il tuo dispositivo in Impostazioni > Bluetooth." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Połączenie nie powiodło się po %d próbach połączenia z %@. Zapomnij o urządzeniu w Ustawienia > Bluetooth." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Falha de conexão após %d tentativas de conectar a %@. Você pode precisar esquecer seu dispositivo em Configurações > Bluetooth." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5930,17 +6583,10 @@ "state" : "translated", "value" : "尝试连接%d失败,你可能需要在系统设置的蓝牙选项中忽略该设备。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "嘗試連接%d失敗,你可能需要在系统設定的藍芽選項中忽略該電台。" - } } } }, "contacts" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -5966,18 +6612,18 @@ "value" : "אנשי קשר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Contatti" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Kontakty" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contactos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5995,17 +6641,10 @@ "state" : "translated", "value" : "联系人" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "聯絡人" - } } } }, "contacts %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -6031,18 +6670,18 @@ "value" : "אנשי קשר (%@)" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Contatti (%@)" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Kontakty (%@)" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contactos (%@)" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6060,17 +6699,17 @@ "state" : "translated", "value" : "联系人 (%@)" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "聯絡人 (%@)" - } } } }, "Control Type" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tipo di controllo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6087,6 +6726,12 @@ }, "Controls the blinking LED on the device. For most devices this will control one of the up to 4 LEDS, the charger and GPS LEDs are not controllable." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controlla il LED lampeggiante del dispositivo. Per la maggior parte dei dispositivi controlla uno dei 4 LED, mentre i LED del caricatore e del GPS non sono controllabili." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6109,6 +6754,12 @@ "value" : "Konvexe Hülle" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scafo convesso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6125,6 +6776,12 @@ "value" : "Koordinate" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Coordinare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6141,6 +6798,12 @@ "value" : "Koordinate %1$@, %2$@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Coordinate %@, %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6163,6 +6826,12 @@ "value" : "Koordinaten:" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Coordinate:" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6191,18 +6860,18 @@ "value" : "העתק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copia" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Kopiuj" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Copiar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6220,12 +6889,6 @@ "state" : "translated", "value" : "复制" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "複製" - } } } }, @@ -6237,6 +6900,12 @@ "value" : "Knoten nicht gefunden" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile trovare il nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6253,6 +6922,12 @@ }, "Counter Clockwise Rotary Event" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Evento rotativo antiorario" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6269,6 +6944,12 @@ "value" : "Wegpunkt erstellen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Creare un waypoint" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6285,6 +6966,12 @@ "value" : "Erstellt: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Creato: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6295,6 +6982,12 @@ }, "Current" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attuale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6311,6 +7004,12 @@ "value" : "Aktuelle Firmware Version: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versione attuale del firmware: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6333,6 +7032,12 @@ "value" : "Aktuelle Firmware Version: %1$@, neuste Firmware Version %2$@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versione attuale del firmware: %@, Ultima versione del firmware: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6355,6 +7060,12 @@ "value" : "Aktuell: %lld" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corrente: %lld" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6364,10 +7075,23 @@ } }, "Currently showing modules that may not be supported by this node." : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attualmente mostra i moduli che potrebbero non essere supportati da questo nodo." + } + } + } }, "Currently the recommended way to update ESP32 devices is using the web flasher on a desktop computer from a chrome based browser. It does not work on mobile devices or over BLE." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attualmente il modo consigliato per aggiornare i dispositivi ESP32 è quello di utilizzare il flasher web su un computer desktop da un browser basato su chrome. Non funziona su dispositivi mobili o tramite BLE." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6390,6 +7114,12 @@ "value" : "Datum" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Data" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6400,6 +7130,12 @@ }, "Debug" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Debug" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6422,6 +7158,12 @@ "value" : "Fehlersuchprotokolle" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registri di debug" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6432,6 +7174,12 @@ }, "Debug Logs%@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registri di debug%@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6441,7 +7189,6 @@ } }, "default" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -6467,18 +7214,18 @@ "value" : "ברירת מחדל" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predefinito" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Domyślny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Padrão" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6496,12 +7243,6 @@ "state" : "translated", "value" : "默认" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "預設" - } } } }, @@ -6513,6 +7254,12 @@ "value" : "Standard" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predefinito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6522,7 +7269,6 @@ } }, "default.128x64.screen.layout" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -6530,6 +7276,12 @@ "value" : "Default 128x64 screen layout" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Layout dello schermo 128x64 predefinito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6570,18 +7322,18 @@ "value" : "מחק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Usuń" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apagar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6599,17 +7351,17 @@ "state" : "translated", "value" : "删除" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "刪除" - } } } }, "Delete all environment metrics?" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare tutte le metriche dell'ambiente?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6626,6 +7378,12 @@ }, "Delete all map tiles?" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare tutte le tessere della mappa?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6642,6 +7400,12 @@ }, "Delete all positions?" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare tutte le posizioni?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6652,6 +7416,12 @@ }, "Delete Message" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare il messaggio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6662,6 +7432,12 @@ }, "Delete Messages" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare i messaggi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6678,6 +7454,12 @@ "value" : "Knoten löschen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare il nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6694,6 +7476,12 @@ "value" : "Knoten löschen?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare il nodo?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6704,6 +7492,12 @@ }, "Delete Power metrics?" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare le metriche di potenza?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6714,6 +7508,12 @@ }, "Description" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Descrizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6724,6 +7524,12 @@ }, "Description must be less than 100 bytes" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La descrizione deve essere inferiore a 100 byte" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6740,6 +7546,12 @@ }, "Detection" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rilevamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6750,6 +7562,12 @@ }, "Detection event" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Evento di rilevamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6760,6 +7578,12 @@ }, "Detection Sensor Log" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro del sensore di rilevamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6770,6 +7594,12 @@ }, "Detection sensor messages are received as text messages. If you enable notifications you will recieve a notification for each detection message received and a corresponding unread message badge." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I messaggi del sensore di rilevamento vengono ricevuti come messaggi di testo. Se si attivano le notifiche, si riceverà una notifica per ogni messaggio di rilevamento ricevuto e un badge per il messaggio non letto corrispondente." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6810,18 +7640,18 @@ "value" : "חיישן זיהוי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sensore di rilevamento" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Detection Sensor" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sensor de Detecção" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6839,12 +7669,6 @@ "state" : "translated", "value" : "检测传感器" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "檢測感測器" - } } } }, @@ -6868,10 +7692,10 @@ "value" : "הגדרות חיישן זיהוי" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Configuração do Sensor de Detecção" + "value" : "Configurazione del sensore di rilevamento" } }, "se" : { @@ -6914,10 +7738,10 @@ "value" : "יומן חיישן זיהוי" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Log Sensor de Detecção" + "value" : "Registro del sensore di rilevamento" } }, "se" : { @@ -6942,6 +7766,12 @@ }, "Developers" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sviluppatori" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6982,18 +7812,18 @@ "value" : "מכשיר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Urządzenie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dispositivo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -7011,12 +7841,6 @@ "state" : "translated", "value" : "设备" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "設備" - } } } }, @@ -7028,6 +7852,12 @@ "value" : "Geräte-GPS" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo GPS" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7044,6 +7874,12 @@ }, "Device is managed by a mesh administrator, the user is unable to access any of the device settings." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il dispositivo è gestito da un amministratore di rete, ma l'utente non può accedere alle impostazioni del dispositivo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7060,6 +7896,12 @@ }, "Device Metrics" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metriche del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7076,6 +7918,12 @@ }, "Device Metrics Log" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro delle metriche del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7098,6 +7946,12 @@ "value" : "Gerätemodell: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modello dispositivo: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7114,6 +7968,12 @@ }, "Device Role" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ruolo del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7130,6 +7990,12 @@ }, "Device Screen" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schermata del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7170,18 +8036,18 @@ "value" : "הגדרות מכשיר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del dispositivo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja urządzenia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do Dispositivo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -7199,12 +8065,6 @@ "state" : "translated", "value" : "设备配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電台設定" - } } } }, @@ -7228,18 +8088,18 @@ "value" : "Device Configuration" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del dispositivo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Device Configuration" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do Dispositivo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -7257,12 +8117,6 @@ "state" : "translated", "value" : "设备配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "設備設定" - } } } }, @@ -7286,18 +8140,18 @@ "value" : "נקה יומן מכשיר?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare tutte le metriche del dispositivo?" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Usunąć wszystkie metryki urządzenia?" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apagar todas as métricas do dispositivo?" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -7315,12 +8169,6 @@ "state" : "translated", "value" : "删除所有设备指标?" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "刪除所有電台指標??" - } } } }, @@ -7350,18 +8198,18 @@ "value" : "יומן מכשיר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro delle metriche del dispositivo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dziennik metryk urządzenia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Log g de Métricas do Dispositivo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -7379,17 +8227,10 @@ "state" : "translated", "value" : "设备指标日志" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電台指標紀錄檔" - } } } }, "device.role.client" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -7415,18 +8256,18 @@ "value" : "אפליקציה מחוברת או מכשיר תקשורת עצמאי." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo di messaggistica collegato all'app o indipendente." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Klient (domyślnie) - Klient połączony z aplikacją." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dispositivo conectado ao App ou independente para mensagens." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -7444,17 +8285,10 @@ "state" : "translated", "value" : "连接 App 或独立的消息发送设备。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "標準模式 - App 可以連接到電台進行收發操作,並且會自動轉發 Mesh 網路中其他中繼點的消息。" - } } } }, "device.role.clienthidden" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -7480,18 +8314,18 @@ "value" : "מכשיר שרק משדר לפי צורך בכדי לחסוך בחשמל או לשמור על חשאיות." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo che trasmette solo quando è necessario, per non dare nell'occhio o per risparmiare energia." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : " Used for nodes that \"only speak when spoken to\" Turns all of the routine broadcasts but allows for ad-hoc communication. Still rebroadcasts, but with local only rebroadcast mode (known meshes only). Can be used for private operation or to dramatically reduce airtime / power consumption." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dispositivo que apenas transmite conforme necessário em modo furtivo ou economia de energia." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -7509,17 +8343,10 @@ "state" : "translated", "value" : "只在需要时才广播的设备,以达到隐蔽或省电的目的。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "隱藏模式 - 用於那些\"只在被問到時才回答\"的節點,關閉所有常規廣播,但允許臨時通訊。依然會進行轉播,但只在本地轉播模式下進行(僅限已知的網狀網路)。可以用於私密操作或顯著減少空中時間/功耗。" - } } } }, "device.role.clientmute" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -7545,18 +8372,18 @@ "value" : "מכשיר שאינו מעביר הודעות ממכשירים אחרים הלאה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo che non inoltra pacchetti da altri dispositivi." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wyciszenie klienta - To samo, co klient, z wyjątkiem pakietów, które nie przeskakują przez ten węzeł, nie przyczynia się do routingu pakietów dla siatki." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dispositivo que não encaminha pacotes de outros dispositivos." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -7574,17 +8401,10 @@ "state" : "translated", "value" : "不转发其他设备数据包的设备。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "靜音模式 - 與標準模式類似,App 可以連接到電台進行收發操作,但不會轉發 Mesh 網路中其他中繼點的消息。" - } } } }, "device.role.lostandfound" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -7610,18 +8430,18 @@ "value" : "משדר מיקום כהודעה לערוץ ברירת מחדל לעיתים קבועות בכדי לסייע במציאת המכשיר." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmette regolarmente la posizione come messaggio al canale predefinito per assistere il recupero del dispositivo." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Broadcasts location as message to default channel regularly for to assist with device recovery." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Transmite a localização como mensagem para o canal padrão regularmente para auxiliar na recuperação do dispositivo." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -7639,17 +8459,10 @@ "state" : "translated", "value" : "定期向默认信道发送位置信息,以协助设备恢复。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "遺失物模式 - 用於自動頻繁地向網狀網路發送一條包含設備當前位置的短信:\"I'm lost! Position: lat / long\"" - } } } }, "device.role.name.client" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -7663,6 +8476,12 @@ "value" : "Client" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cliente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7678,7 +8497,6 @@ } }, "device.role.name.clientHidden" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -7692,6 +8510,12 @@ "value" : "Client Hidden" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cliente Nascosto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7707,7 +8531,6 @@ } }, "device.role.name.clientMute" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -7715,6 +8538,12 @@ "value" : "Client Mute" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cliente Muto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7730,7 +8559,6 @@ } }, "device.role.name.lostAndFound" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -7744,6 +8572,12 @@ "value" : "Lost and Found" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oggetti smarriti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7759,7 +8593,6 @@ } }, "device.role.name.repeater" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -7773,6 +8606,12 @@ "value" : "Repeater" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ripetitore" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7788,7 +8627,6 @@ } }, "device.role.name.router" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -7802,6 +8640,12 @@ "value" : "Router" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7817,7 +8661,6 @@ } }, "device.role.name.routerClient" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -7831,6 +8674,12 @@ "value" : "Router & Client" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router & Client" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7846,7 +8695,6 @@ } }, "device.role.name.routerlate" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -7860,6 +8708,12 @@ "value" : "Router Late" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router tardivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7869,7 +8723,6 @@ } }, "device.role.name.sensor" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -7883,6 +8736,12 @@ "value" : "Sensor" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sensore" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7898,7 +8757,6 @@ } }, "device.role.name.tak" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -7912,6 +8770,12 @@ "value" : "TAK" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "TAK" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7927,7 +8791,6 @@ } }, "device.role.name.takTracker" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -7941,6 +8804,12 @@ "value" : "TAK Tracker" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tracker TAK" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7956,7 +8825,6 @@ } }, "device.role.name.tracker" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -7970,6 +8838,12 @@ "value" : "Tracker" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tracker" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7985,7 +8859,6 @@ } }, "device.role.repeater" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -8011,18 +8884,18 @@ "value" : "מכשיר תשתית להרחבת המש על ידי העברת הודעות עם דאטה נוסף מינימלי." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodo infrastrutturale solo su una torre o sulla cima di una montagna. Non deve essere utilizzato per tetti o nodi mobili. Trasmette i messaggi con un overhead minimo. Non visibile nell'elenco dei nodi." + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Przekaźnik - Pakiety siatki będą preferować trasowanie przez ten węzeł. Ta rola eliminuje niepotrzebny nadmiar, taki jak NodeInfo, DeviceTelemetry i inne pakiety siatki, skutkując tym, że urządzenie nie będzie widoczne jako część sieci. Proszę zobaczyć tryb Rebroadcast dla dodatkowych ustawień specyficznych dla tej roli." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Nó de infraestrutura para ampliar a cobertura da rede transmitindo mensagens com sobrecarga mínima. Não visível na lista de Nós." - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -8040,17 +8913,10 @@ "state" : "translated", "value" : "仅用于塔顶或山顶的基础设施节点。 不得用于屋顶或移动节点。以最小的开销中继信息。在节点列表中不可见。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "中繼模式 - Mesh 網路數據包將優先通過此中繼點路由。此模式可消除不必要的開銷,如 NodeInfo、DeviceTelemetry 和任何其他 Mesh 數據包,從而使設備不顯示為 Mesh 網路的一部分。有關此角色的其他特定設置,請參閱轉播模式。" - } } } }, "device.role.router" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -8076,18 +8942,18 @@ "value" : "מכשיר תשתית להרחבת המש על ידי העברת הודעות. מופיע ברשימת מכשירים." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodo infrastrutturale solo su una torre o sulla cima di una montagna. Non deve essere utilizzato per tetti o nodi mobili. Necessita di una copertura eccezionale. Visibile nell'elenco dei nodi." + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Router - Pakiety siatki będą preferować trasowanie przez ten węzeł. Zakłada, że urządzenie będzie działać samodzielnie, umieszczone w miejscu z przewagą zasięgu. UWAGA: Radia BLE/Wi-Fi i ekran OLED zostaną uśpione." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Nó de infraestrutura para ampliar a cobertura da rede transmitindo mensagens. Visível na lista de Nós." - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -8105,17 +8971,10 @@ "state" : "translated", "value" : "仅用于塔顶或山顶的基础设施节点。 不得用于屋顶或移动节点。 需要特殊的覆盖范围。在节点列表中可见。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "纯路由模式 - 自動轉發 Mesh 網路中其他中繼點的消息,中繼模式下螢幕會熄滅,Wi-Fi 和藍芽將會進入睡眠模式,App 將無法連接到電台進行收發操作。" - } } } }, "device.role.routerclient" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -8141,18 +9000,18 @@ "value" : "קומבינציה של ROUTER וCLIENT. לא למכשירים ניידים." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ruolo deprecato utilizzare il client." + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Router Client - Hybryda ról klienta i routera. Podobnie jak w przypadku routera, z tym że Router Client może być używany zarówno jako router, jak i klient połączony z aplikacją. Radia BLE/Wi-Fi i ekran OLED nie zostaną uśpione." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Combinação de ROTEADOR e CLIENTE. Não para dispositivos móveis." - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -8170,17 +9029,10 @@ "state" : "translated", "value" : "已废弃的角色,使用客户端。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "路由客户端模式 - 優先轉發 Mesh 網路中其他中繼點的消息,App 也可以連接到電台進行收發操作。" - } } } }, "device.role.routerlate" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -8194,6 +9046,12 @@ "value" : "Infrastructure node that always rebroadcasts packets once but only after all other modes, ensuring additional coverage for local clusters. Visible in Nodes list." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodo infrastruttura che ritrasmette sempre i pacchetti una volta, ma solo dopo tutte le altre modalità, garantendo una copertura aggiuntiva per i cluster locali. Visibile nell'elenco dei nodi." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8203,7 +9061,6 @@ } }, "device.role.sensor" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -8229,18 +9086,18 @@ "value" : "משדר טלמטריה בעדיפות גבוהה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmette i pacchetti di telemetria come priorità." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Broadcasts telemetry packets as priority." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Transmite pacotes de telemetria como prioridade." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8258,17 +9115,10 @@ "state" : "translated", "value" : "将遥测数据包优先广播。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "傳感器模式 - 優先廣播傳感器數據包" - } } } }, "device.role.tak" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -8294,18 +9144,18 @@ "value" : "מותאם למערכת ATAK, מקטין תקשורת קבועה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ottimizzato per la comunicazione del sistema ATAK, riduce le trasmissioni di routine." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Optimized for ATAK system communication, reduces routine broadcasts." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otimizado para comunicação do sistema ATAK, reduz transmissões rotineiras." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8323,17 +9173,10 @@ "state" : "translated", "value" : "针对 ATAK 系统通信进行优化,减少常规广播。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "TAK模式 - 優化了 ATAK 系統通訊,減少常規廣播。" - } } } }, "device.role.taktracker" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -8359,18 +9202,18 @@ "value" : "Enables automatic TAK PLI broadcasts and reduces routine broadcasts." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilita le trasmissioni automatiche di TAK PLI e riduce le trasmissioni di routine." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Enables automatic TAK PLI broadcasts and reduces routine broadcasts." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Permite transmissões automáticas de TAK PLI e reduz transmissões rotineiras." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8388,17 +9231,10 @@ "state" : "translated", "value" : "启用自动 TAK PLI(Position Location Information)广播,并减少常规广播。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "TAK TRACKER追蹤器 - 啟用自動 TAK PLI 廣播並減少常規廣播。" - } } } }, "device.role.tracker" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -8424,18 +9260,18 @@ "value" : "משדר מיקום GPS בעדיפות גבוהה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmette i pacchetti di posizione GPS come priorità." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Tracker - Do użytku z urządzeniami przeznaczonymi jako śledzenie GPS. Pakiety pozycyjne wysyłane z tego urządzenia będą miały wyższy priorytet, z nadawaniem pozycji co dwie minuty. Inteligentna transmisja pozycji będzie domyślnie wyłączona." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Transmite pacotes de posição GPS como prioridade." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8453,17 +9289,17 @@ "state" : "translated", "value" : "定位模式 - 用于作为 GPS 跟踪器。从该设备发送的定位数据包优先级较高,每两分钟广播一次。智能位置广播默认为关闭。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "追蹤模式 - 用於作為 GPS 追蹤器。從該設備發送的定位數據包優先級較高,每兩分鐘廣播一次。智能位置廣播預設為關閉。" - } } } }, "Dilution of precision (DOP) PDOP used by default" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diluizione della precisione (DOP) PDOP utilizzato per impostazione predefinita" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8480,6 +9316,12 @@ "value" : "Direkt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diretto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8496,6 +9338,12 @@ }, "Direct Message Help" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aiuto per i messaggi diretti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8512,6 +9360,12 @@ }, "Direct messages are using the new public key infrastructure for encryption. Requires firmware version 2.5 or greater." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I messaggi diretti utilizzano la nuova infrastruttura a chiave pubblica per la crittografia. Richiede la versione firmware 2.5 o superiore." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8528,6 +9382,12 @@ }, "Direct messages are using the shared key for the channel." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I messaggi diretti utilizzano la chiave condivisa del canale." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8568,18 +9428,18 @@ "value" : "הודעה פרטית" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi diretti" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Bezpośrednie Wiadomości" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagens Directas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8597,12 +9457,6 @@ "state" : "translated", "value" : "私聊" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "聊天" - } } } }, @@ -8614,6 +9468,12 @@ "value" : "Ausgeschaltet" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disabili" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8654,18 +9514,18 @@ "value" : "התנתק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disconnessione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Rozłącz" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desconectar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8683,12 +9543,6 @@ "state" : "translated", "value" : "断开连接" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "斷開連接" - } } } }, @@ -8718,18 +9572,18 @@ "value" : "סגור מקלדת" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sospendere" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zamknij" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dispensar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8747,12 +9601,6 @@ "state" : "translated", "value" : "收起键盘" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "隱藏鍵盤" - } } } }, @@ -8782,18 +9630,18 @@ "value" : "צג מכשיר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Display" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wyświetlacz (Ekran Urządzenia)" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Icrã" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8811,17 +9659,17 @@ "state" : "translated", "value" : "显示" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "螢幕(電台螢幕)" - } } } }, "Display Fahrenheit" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Display Fahrenheit" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8838,6 +9686,12 @@ }, "Display Mode" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modalità di visualizzazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8854,6 +9708,12 @@ }, "Display Units" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unità di visualizzazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8888,18 +9748,18 @@ "value" : "הגדרות צג" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del display" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja Wyświetlacza" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do Icrãn" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8917,17 +9777,10 @@ "state" : "translated", "value" : "屏幕配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "螢幕設定" - } } } }, "distance" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -8953,18 +9806,18 @@ "value" : "מרחק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Distanza" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odległość" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Distância" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8982,12 +9835,6 @@ "state" : "translated", "value" : "距离" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "距離" - } } } }, @@ -8999,6 +9846,12 @@ "value" : "Distanz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Distanza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9015,6 +9868,12 @@ }, "Documentation" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Documentazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9031,6 +9890,12 @@ }, "Double Tap as Button" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doppio tocco come pulsante" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9047,6 +9912,12 @@ }, "Downlink Enabled" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Downlink abilitato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9063,6 +9934,12 @@ }, "Drag & Drop Firmware Update" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornamento del firmware con il drag & drop" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9079,6 +9956,12 @@ }, "Drag & Drop Firmware Update Documentation" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Documentazione sull'aggiornamento del firmware con il drag & drop" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9095,6 +9978,12 @@ }, "Drag & Drop is the recommended way to update firmware for NRF devices. If your iPhone or iPad is USB-C it will work with your regular USB-C charging cable, for lightning devices you need the Apple Lightning to USB camera adaptor." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il Drag & Drop è il metodo consigliato per aggiornare il firmware dei dispositivi NRF. Se l'iPhone o l'iPad è USB-C funzionerà con il normale cavo di ricarica USB-C, mentre per i dispositivi lightning è necessario l'adattatore Apple Lightning to USB camera." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9111,6 +10000,12 @@ }, "Drop Pin in Maps" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spillo in Mappe" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9145,18 +10040,18 @@ "value" : "הד" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eco" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Echo" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eco" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -9174,17 +10069,17 @@ "state" : "translated", "value" : "回声" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "echo" - } } } }, "Editing Waypoint" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modifica di Waypoint" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9195,6 +10090,12 @@ }, "Elev. Gain" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elev. Guadagno" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9204,7 +10105,6 @@ } }, "email.address" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -9230,18 +10130,18 @@ "value" : "כתובת דואר אלקטרוני" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indirizzo e-mail" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Adres Email" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Endereço de Email" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -9259,17 +10159,17 @@ "state" : "translated", "value" : "邮件地址" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電子信箱" - } } } }, "Emoji" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Emoji" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9286,6 +10186,12 @@ }, "Empty" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vuoto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9301,10 +10207,23 @@ } }, "Enable broadcasting packets via UDP over the local network." : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilita la trasmissione di pacchetti via UDP sulla rete locale." + } + } + } }, "Enable Notifications" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilita le notifiche" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9320,7 +10239,14 @@ } }, "Enable this device as a Store and Forward server. Requires an ESP32 device with PSRAM." : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilita questo dispositivo come server Store and Forward. Richiede un dispositivo ESP32 con PSRAM." + } + } + } }, "enabled" : { "localizations" : { @@ -9348,18 +10274,18 @@ "value" : "מופעל" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilitato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Włączony" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -9377,17 +10303,17 @@ "state" : "translated", "value" : "启用" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "啟用" - } } } }, "Enables devices with native I2S audio output to use the RTTTL over speaker like a buzzer. T-Watch S3 and T-Deck for example have this capability." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Consente ai dispositivi con uscita audio I2S nativa di utilizzare l'RTTTL tramite altoparlante come un cicalino. T-Watch S3 e T-Deck, ad esempio, dispongono di questa funzionalità." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9404,6 +10330,12 @@ }, "Enables the detection sensor module, it needs to be enabled on both the node with the sensor, and any nodes that you want to receive detection sensor text messages or view the detection sensor log and chart." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilita il modulo del sensore di rilevamento; deve essere abilitato sia sul nodo con il sensore, sia su tutti i nodi che si desidera ricevere messaggi di testo del sensore di rilevamento o visualizzare il registro e il grafico del sensore di rilevamento." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9418,11 +10350,36 @@ } } }, - "Enables the store and forward module." : { - + "Enables the store and forward module. Store and forward must be enabled on both client and router devices." : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilita il modulo store and forward. Store and forward deve essere abilitato su entrambi i dispositivi client e router." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Омогућава модул за чување и пренос. Чување и пренос мора бити омогућено на оба уређаја, клијенту и рутеру." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用存储和转发模块。客户端和路由器设备都必须启用存储和转发功能。" + } + } + } }, "Enabling Ethernet will disable the bluetooth connection to the app." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilitando l'Ethernet si disabilita la connessione bluetooth all'applicazione." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9439,6 +10396,12 @@ }, "Enabling WiFi will disable the bluetooth connection to the app." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'attivazione del WiFi disabilita la connessione bluetooth all'applicazione." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9455,6 +10418,12 @@ }, "Encoder Press Event" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Evento di pressione dell'encoder" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9489,18 +10458,18 @@ "value" : "מוצפן" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crittografato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zaszyfrowany" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Encriptado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -9518,12 +10487,6 @@ "state" : "translated", "value" : "加密" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "加密" - } } } }, @@ -9535,6 +10498,12 @@ "value" : "Verschlüsselt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crittografato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9551,6 +10520,12 @@ }, "Encryption Enabled" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crittografia abilitata" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9573,6 +10548,12 @@ "value" : "DFÜ-Modus aktivieren" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entrare in modalità DFU" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9589,6 +10570,12 @@ }, "environment" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "ambiente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9611,6 +10598,12 @@ "value" : "Umgebung" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ambiente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9627,6 +10620,12 @@ }, "Environment Metrics Log" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro delle metriche ambientali" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9649,6 +10648,12 @@ "value" : "Alle App-Daten löschen?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare tutti i dati delle app?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9671,6 +10676,12 @@ "value" : "Alle Geräte- und App-Daten löschen?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare tutti i dati del dispositivo e delle app?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9687,6 +10698,12 @@ }, "Error: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Errore: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9703,6 +10720,12 @@ }, "ESP 32 OTA update is a work in progress, click the button below to send your device a reboot into ota admin message." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'aggiornamento OTA di ESP 32 è in corso, fare clic sul pulsante qui sotto per inviare al dispositivo un messaggio di riavvio in amministrazione ota." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9719,6 +10742,12 @@ }, "ESP32 Device Firmware Update" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornamento del firmware del dispositivo ESP32" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9735,6 +10764,12 @@ }, "Ethernet Options" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni Ethernet" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9744,7 +10779,6 @@ } }, "European Union 433MHz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -9752,6 +10786,12 @@ "value" : "European Union 433MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unione Europea 433MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9761,7 +10801,6 @@ } }, "European Union 868MHz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -9769,6 +10808,12 @@ "value" : "European Union 868MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unione Europea 868MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9779,6 +10824,12 @@ }, "Exchange Positions" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scambio di posizioni" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9789,6 +10840,12 @@ }, "Expire" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scadenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9799,6 +10856,12 @@ }, "Expires" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scadenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9809,6 +10872,12 @@ }, "Expires: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scadenza: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9843,18 +10912,18 @@ "value" : "Export" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esportazione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Export" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Exportar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -9872,12 +10941,6 @@ "state" : "translated", "value" : "Export" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "匯出" - } } } }, @@ -9907,18 +10970,18 @@ "value" : "נוטיפיקציה חיצונית" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notifica esterna" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zewnętrzne Powiadomienie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notificação Externa" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -9936,12 +10999,6 @@ "state" : "translated", "value" : "外部通知" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "外部通知" - } } } }, @@ -9971,18 +11028,18 @@ "value" : "הגדרות נוטיפיקציה חיצונית" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della notifica esterna" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja Zewnętrznego Powiadomienia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de Notificação Externa" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10000,12 +11057,6 @@ "state" : "translated", "value" : "外部通知配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "外部通知設定" - } } } }, @@ -10017,6 +11068,12 @@ "value" : "Werkseinstellungen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reset di fabbrica" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10033,6 +11090,12 @@ "value" : "Gerät und App auf Werkseinstellungen zurücksetzen?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resettare il dispositivo e l'applicazione? " + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10043,6 +11106,12 @@ }, "Failed to encode message content" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile codificare il contenuto del messaggio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10053,6 +11122,12 @@ }, "Failed to get a valid position to exchange" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile ottenere una posizione valida per lo scambio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10063,6 +11138,12 @@ }, "Failed to get a valid position to exchange." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile ottenere una posizione valida per lo scambio." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10079,6 +11160,12 @@ "value" : "Favorit" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preferito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10095,6 +11182,12 @@ "value" : "Favoriten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preferiti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10105,6 +11198,12 @@ }, "Favorites and nodes with recent messages show up at the top of the contact list." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I preferiti e i nodi con messaggi recenti appaiono in cima all'elenco dei contatti." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10127,6 +11226,12 @@ "value" : "Letzte Position eines Knotens holen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Recuperare l'ultima posizione di un nodo cetaneo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10137,6 +11242,12 @@ }, "Fifteen Minutes" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quindici minuti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10147,6 +11258,12 @@ }, "File Storage" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Archiviazione dei file" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10163,6 +11280,12 @@ "value" : "Kontakt suchen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trova un contatto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10179,6 +11302,12 @@ "value" : "Einen Knoten finden" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trovare un nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10213,18 +11342,18 @@ "value" : "סיים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fine" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Finish" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Terminar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10242,12 +11371,6 @@ "state" : "translated", "value" : "Finish" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "完成" - } } } }, @@ -10259,6 +11382,12 @@ "value" : "Firmware" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Firmware" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10275,6 +11404,12 @@ }, "Firmware update docs" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Documentazione sull'aggiornamento del firmware" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10297,6 +11432,12 @@ "value" : "Firmwareaktualisierungen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornamenti del firmware" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10337,18 +11478,18 @@ "value" : "גרסת קושחה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versione del firmware" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wersja Oprogramowania" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Versão do Firmware" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10366,17 +11507,10 @@ "state" : "translated", "value" : "固件版本" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "韌體版本" - } } } }, "firmware.version.unsupported" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -10402,18 +11536,18 @@ "value" : "גרסת קושחה אינה נתמכת, לא ניתן להתחבר למכשיר." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rilevata versione firmware non supportata, impossibile connettersi al dispositivo." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wykryto nieobsługiwany wersję oprogramowania, brak możliwości połączenia z urządzeniem." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Versão de Firmware não suportada detetada, impossível conectar ao dispositivo." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10431,17 +11565,17 @@ "state" : "translated", "value" : "检测到不支持的固件版本,无法连接到设备。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "檢測到不支援的韌體版本,無法連接到電台。" - } } } }, "First heard" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sentito per la prima volta" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10458,6 +11592,12 @@ "value" : "Fünf Minuten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cinque minuti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10492,18 +11632,18 @@ "value" : "קוד קבוע" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "PIN fisso" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Stały PIN" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "PIN fixo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10521,17 +11661,17 @@ "state" : "translated", "value" : "固定 PIN 码" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "固定 PIN 碼" - } } } }, "Fixed Position" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione fissa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10542,6 +11682,12 @@ }, "Flip Screen" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schermo ribaltabile" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10552,6 +11698,12 @@ }, "Flip screen vertically" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Capovolgere lo schermo in verticale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10562,6 +11714,12 @@ }, "For all Mqtt functionality other than the map report you must also set uplink and downlink for each channel you want to bridge over Mqtt." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per tutte le funzionalità Mqtt diverse dal rapporto sulle mappe, è necessario impostare anche l'uplink e il downlink per ogni canale che si desidera collegare tramite Mqtt." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10584,6 +11742,12 @@ "value" : "Für alle" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per tutti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10600,6 +11764,12 @@ "value" : "Für mich" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per me" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10616,6 +11786,12 @@ "value" : "Frequenz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Frequenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10626,6 +11802,12 @@ }, "Frequency Override" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Override di frequenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10636,6 +11818,12 @@ }, "Frequency Slot" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slot di frequenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10646,6 +11834,12 @@ }, "Friendly name" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome amichevole" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10662,6 +11856,12 @@ }, "Friendly name used to format message sent to mesh. Example: A name \"Motion\" would result in a message \"Motion detected\"" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome amichevole usato per formattare il messaggio inviato alla rete. Esempio: Il nome \"Movimento\" si tradurrebbe nel messaggio \"Movimento rilevato\"" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10677,10 +11877,16 @@ } }, "Full Support" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supporto completo" + } + } + } }, "gas" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -10706,18 +11912,18 @@ "value" : "דלק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gas" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Gaz" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10735,17 +11941,10 @@ "state" : "translated", "value" : "气体" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas" - } } } }, "gas.resistance" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -10765,18 +11964,18 @@ "value" : "Gas Resistance" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resistenza ai gas" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odporność na Gaz" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Resistência ao Gas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10794,12 +11993,6 @@ "state" : "translated", "value" : "气体阻抗" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas Resistance" - } } } }, @@ -10829,18 +12022,18 @@ "value" : "צור קוד QR" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Generare un codice QR" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Generuj Kod QR" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerar Código QR" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10858,17 +12051,17 @@ "state" : "translated", "value" : "生成二维码" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "生成QRcode" - } } } }, "Get custom waterproof solar and detection sensor router nodes, aluminium desktop nodes and rugged handsets." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodi router con sensori solari e di rilevamento personalizzati e impermeabili, nodi da tavolo in alluminio e portatili robusti." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10885,6 +12078,12 @@ "value" : "Knotenposition ermitteln" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ottenere la posizione del nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10901,6 +12100,12 @@ }, "Get NRF DFU from the App Store" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scarica NRF DFU dall'App Store" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10917,6 +12122,12 @@ }, "Get the latest alpha firmware" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ottenere l'ultimo firmware alfa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10933,6 +12144,12 @@ }, "Get the latest stable firmware" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ottenere l'ultimo firmware stabile" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10949,6 +12166,12 @@ }, "GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10965,6 +12188,12 @@ }, "GPIO Output Duration" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Durata dell'uscita GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10975,6 +12204,12 @@ }, "GPIO pin for rotary encoder A port." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin GPIO per la porta A dell'encoder rotativo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10985,6 +12220,12 @@ }, "GPIO pin for rotary encoder B port." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin GPIO per la porta B dell'encoder rotativo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10995,6 +12236,12 @@ }, "GPIO pin for rotary encoder Press port." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin GPIO per encoder rotativo Porta di stampa." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11005,6 +12252,12 @@ }, "GPIO Pin to monitor" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin GPIO da monitorare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11015,6 +12268,12 @@ }, "GPS EN GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "GPS IT GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11031,6 +12290,12 @@ }, "GPS Format" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Formato GPS" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11047,6 +12312,12 @@ }, "GPS Receive GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ricezione GPS GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11063,6 +12334,12 @@ }, "GPS Transmit GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmissione GPS GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11078,7 +12355,6 @@ } }, "gpsformat.dec" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -11104,18 +12380,18 @@ "value" : "פורמט קואורדינטות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Formato dei gradi decimali" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Format Dziesiętny Stopni" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Formato de Graus Decimais" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -11133,17 +12409,10 @@ "state" : "translated", "value" : "十进制" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "十進制" - } } } }, "gpsformat.dms" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -11169,18 +12438,18 @@ "value" : "מעלות דקות שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gradi Minuti Secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Stopnie Minuty Sekundy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Graus Minutos Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -11198,17 +12467,10 @@ "state" : "translated", "value" : "度分秒" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "度分秒" - } } } }, "gpsformat.mgrs" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -11234,18 +12496,18 @@ "value" : "Military Grid Reference System" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sistema di riferimento della griglia militare" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wojskowa siatka odniesienia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sistema de Referência de Grelha Militar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -11263,17 +12525,10 @@ "state" : "translated", "value" : "军事网格参考系统" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "軍事網格參考系統" - } } } }, "gpsformat.olc" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -11299,18 +12554,18 @@ "value" : "Open Location Code (aka Plus Codes)" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Codice di localizzazione aperto (alias Codice Plus)" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otwarty Kod Lokalizacji (tzw. Plus Kody)" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Código de Localização Aberto (também conhecido como Plus Codes)" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -11328,17 +12583,10 @@ "state" : "translated", "value" : "开放的位置代码(又称加码)" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "開放位置代碼" - } } } }, "gpsformat.osgr" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -11364,18 +12612,18 @@ "value" : "Ordnance Survey Grid Reference" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riferimento di griglia Ordnance Survey" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brytyjski Układ Odniesienia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Referência de Grelha da Ordnance Survey" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -11393,17 +12641,10 @@ "state" : "translated", "value" : "英国国土测量局网格参考" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "英國國土測量局網格參考系統" - } } } }, "gpsformat.utm" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -11429,18 +12670,18 @@ "value" : "Universal Transverse Mercator" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mercatore Universale Trasverso" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Uniwersalny Układ Transwersalny Mercatora" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Universal Transverse Mercator" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -11458,17 +12699,10 @@ "state" : "translated", "value" : "通用横轴墨卡托投影" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "通用橫軸墨卡托投影" - } } } }, "gpsmode.disabled" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -11494,10 +12728,10 @@ "value" : "כבוי" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Desativado" + "value" : "Disabili" } }, "se" : { @@ -11521,7 +12755,6 @@ } }, "gpsmode.enabled" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -11547,10 +12780,10 @@ "value" : "מופעל" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Ativado" + "value" : "Abilitato" } }, "se" : { @@ -11574,7 +12807,6 @@ } }, "gpsmode.notPresent" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -11594,10 +12826,10 @@ "value" : "לא קיים" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Não Presente" + "value" : "Non presente" } }, "se" : { @@ -11628,6 +12860,12 @@ "value" : "Gruppennachricht" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio di gruppo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11644,6 +12882,12 @@ }, "Gusts %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Raffiche %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11654,6 +12898,12 @@ }, "Hardware" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hardware" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11670,6 +12920,12 @@ }, "Heading" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intestazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11680,6 +12936,12 @@ }, "Heading: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intestazione: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11689,7 +12951,6 @@ } }, "heard" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -11715,18 +12976,18 @@ "value" : "נשמע" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ascoltato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Usłyszano" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ouvido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -11744,17 +13005,10 @@ "state" : "translated", "value" : "收到" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到" - } } } }, "heard.last" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -11780,18 +13034,18 @@ "value" : "נשמע לאחרונה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ultimo ascolto" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Ostatnio Słyszane" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Último Ouvido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -11809,17 +13063,17 @@ "state" : "translated", "value" : "最后收到" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "最後收到" - } } } }, "Help with App Development" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aiuto per lo sviluppo di app" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11836,6 +13090,12 @@ }, "Hide alerts" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nascondere gli avvisi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11846,6 +13106,12 @@ }, "Hide Alerts" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nascondi avvisi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11862,6 +13128,12 @@ "value" : "HOCH" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "ALTO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11878,6 +13150,12 @@ }, "History Return Max" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Storia Rendimento Max" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11888,6 +13166,12 @@ }, "History Return Window" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Finestra di restituzione della cronologia" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11904,6 +13188,12 @@ "value" : "Hops Entfernt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Via il luppolo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11920,6 +13210,12 @@ "value" : "Hops Entfernt %d" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Luppolo lontano %d" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11936,6 +13232,12 @@ "value" : "Hops Entfernt:" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Via il luppolo:" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11952,6 +13254,12 @@ "value" : "Hops Entfernt: %d" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Luppolo in partenza: %d" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11968,6 +13276,12 @@ "value" : "Stunde" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ora" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11984,6 +13298,12 @@ }, "Hourly Duty Cycle" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ciclo di lavoro orario" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11994,6 +13314,12 @@ }, "How long the screen remains on after the user button is pressed or messages are received." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per quanto tempo lo schermo rimane acceso dopo la pressione del tasto utente o la ricezione di messaggi." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12010,6 +13336,12 @@ }, "How often device metrics are sent out over the mesh. Default is 30 minutes." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con quale frequenza vengono inviate le metriche del dispositivo attraverso la rete. L'impostazione predefinita è 30 minuti." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12026,6 +13358,12 @@ }, "How often power metrics are sent out over the mesh. Default is 30 minutes." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con quale frequenza vengono inviate le metriche di potenza attraverso la rete. L'impostazione predefinita è 30 minuti." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12042,6 +13380,12 @@ }, "How often sensor metrics are sent out over the mesh. Default is 30 minutes." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con quale frequenza vengono inviate le metriche dei sensori sulla rete. L'impostazione predefinita è 30 minuti." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12058,6 +13402,12 @@ }, "How often should we try to get a GPS position." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con quale frequenza dobbiamo cercare di ottenere una posizione GPS." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12074,6 +13424,12 @@ }, "How often to send detection sensor state to mesh regardless of detection. Default is Never." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con quale frequenza inviare lo stato del sensore di rilevamento alla rete, indipendentemente dal rilevamento. L'impostazione predefinita è Mai." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12096,6 +13452,12 @@ "value" : "Wie wird die Firmware aktualisiert" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Come aggiornare il firmware" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12112,6 +13474,12 @@ }, "Hum" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Um" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12128,6 +13496,12 @@ "value" : "Luftfeuchtigkeit" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Umidità" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12136,8 +13510,29 @@ } } }, + "HUMIDITY" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "LUFTFEUCHTIGKEIT" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "UMIDITÀ" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ВЛАЖНОСТ" + } + } + } + }, "hybrid" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -12163,18 +13558,18 @@ "value" : "היברידי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ibrido" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Hybrydowy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Híbrido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -12192,17 +13587,10 @@ "state" : "translated", "value" : "混合" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "混合" - } } } }, "hybrid.flyover" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -12228,18 +13616,18 @@ "value" : "היברידי מלמעלה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Flyover ibrido" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Hybrydowy Przelot" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Híbrido o de Sobrevoo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -12257,17 +13645,17 @@ "state" : "translated", "value" : "混合视图" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "混合視圖" - } } } }, "IAQ" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "IAQ" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12284,6 +13672,12 @@ }, "IAQ " : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "IAQ " + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12300,6 +13694,12 @@ }, "IAQ %lld" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "IAQ %lld" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12316,6 +13716,12 @@ }, "Icon" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Icona" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12332,6 +13738,12 @@ }, "If DOP is set, use HDOP / VDOP values instead of PDOP" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se è impostato DOP, utilizzare i valori HDOP / VDOP invece di PDOP" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12348,6 +13760,12 @@ }, "If enabled, the 'output' Pin will be pulled active high, disabled means active low." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se abilitato, il pin di 'uscita' sarà tirato attivo alto, mentre se disabilitato significa attivo basso." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12364,6 +13782,12 @@ }, "If it is hard to access your device's reset button enter DFU mode here." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se è difficile accedere al pulsante di ripristino del dispositivo, accedere alla modalità DFU." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12380,6 +13804,12 @@ }, "If set, any packets you send will be echoed back to your device." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se è impostata, i pacchetti inviati saranno ritrasmessi al dispositivo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12396,6 +13826,12 @@ }, "If the default region topic is too busy you can choose a more local topic." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se l'argomento predefinito della regione è troppo frequentato, è possibile scegliere un argomento più locale." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12412,6 +13848,12 @@ }, "Ignore MQTT" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ignorare MQTT" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12428,6 +13870,12 @@ }, "Ignore Node" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ignorare il nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12444,6 +13892,12 @@ }, "Ignored" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ignorato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12460,6 +13914,12 @@ }, "Import Route" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Percorso di importazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12500,18 +13960,18 @@ "value" : "כלול" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Includere" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dołącz" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Incluir" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -12529,17 +13989,10 @@ "state" : "translated", "value" : "包含" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "包含" - } } } }, "incomplete" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -12565,6 +14018,12 @@ "value" : "Incomplete" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Incompleto" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -12588,17 +14047,10 @@ "state" : "translated", "value" : "Incomplete" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Incomplete" - } } } }, "India" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -12606,6 +14058,12 @@ "value" : "India" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "India" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12616,6 +14074,12 @@ }, "Indoor Air Quality" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Qualità dell'aria interna" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12632,6 +14096,12 @@ }, "Indoor Air Quality (IAQ)" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Qualità dell'aria interna (IAQ)" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12647,7 +14117,6 @@ } }, "inputevent.back" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -12673,18 +14142,18 @@ "value" : "אחרוה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indietro" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wstecz" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voltar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -12702,17 +14171,10 @@ "state" : "translated", "value" : "后退" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "返回" - } } } }, "inputevent.cancel" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -12738,18 +14200,18 @@ "value" : "בטל" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annullamento" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Anuluj" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancelar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -12767,17 +14229,10 @@ "state" : "translated", "value" : "取消" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "取消" - } } } }, "inputevent.down" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -12803,18 +14258,18 @@ "value" : "למטה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In basso" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "W Dół" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Para Baixo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -12832,17 +14287,10 @@ "state" : "translated", "value" : "下" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "下" - } } } }, "inputevent.left" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -12868,18 +14316,18 @@ "value" : "שמאלה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "A sinistra" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "W Lewo" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Esquerda" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -12897,17 +14345,10 @@ "state" : "translated", "value" : "左" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "左" - } } } }, "inputevent.none" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -12933,18 +14374,18 @@ "value" : "ללא" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuno" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhum" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -12962,17 +14403,10 @@ "state" : "translated", "value" : "无" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "無" - } } } }, "inputevent.right" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -12998,18 +14432,18 @@ "value" : "ימינה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diritto" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "W Prawo" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Direita" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13027,17 +14461,10 @@ "state" : "translated", "value" : "右" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "右" - } } } }, "inputevent.select" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13063,18 +14490,18 @@ "value" : "בחר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wybierz" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecionar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13092,17 +14519,10 @@ "state" : "translated", "value" : "选择" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "選擇" - } } } }, "inputevent.up" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13128,18 +14548,18 @@ "value" : "למעלה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Su" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "W Górę" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Para Cima" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13157,17 +14577,17 @@ "state" : "translated", "value" : "上" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "上" - } } } }, "Inputs" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingressi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13183,7 +14603,6 @@ } }, "interval.eighteen.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13209,18 +14628,18 @@ "value" : "שמונה עשר שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diciotto ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Osiemnaście Godzin" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dezoito Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13238,18 +14657,17 @@ "state" : "translated", "value" : "十八小时" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "十八小時" - } } } }, "interval.eventytwo.hours" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "intervallo.eventodue.ore" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13261,17 +14679,10 @@ "state" : "translated", "value" : "七十二小时" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "七十二小時" - } } } }, "interval.fifteen.minutes" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13297,18 +14708,18 @@ "value" : "חמש עשרה דקות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quindici minuti" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Piętnaście Minut" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quinze Minutos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13326,17 +14737,10 @@ "state" : "translated", "value" : "十五分钟" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "十五分鐘" - } } } }, "interval.fifteen.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13362,18 +14766,18 @@ "value" : "חמש עשרה שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quindici secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Piętnaście Sekund" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quinze Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13391,17 +14795,10 @@ "state" : "translated", "value" : "十五秒" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "十五秒" - } } } }, "interval.five.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13427,18 +14824,18 @@ "value" : "חמש שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cinque ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Pięć Godzin" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cinco Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13456,17 +14853,10 @@ "state" : "translated", "value" : "五小时" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "五小時" - } } } }, "interval.five.minutes" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13492,18 +14882,18 @@ "value" : "חמש דקות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cinque minuti" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Pięć Minut" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cinco Minutos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13521,17 +14911,10 @@ "state" : "translated", "value" : "五分钟" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "五分鐘" - } } } }, "interval.five.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13557,18 +14940,18 @@ "value" : "חמש שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cinque secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Pięć Sekund" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cinco Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13586,17 +14969,10 @@ "state" : "translated", "value" : "五秒" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "五秒" - } } } }, "interval.fortyeight.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13622,18 +14998,18 @@ "value" : "ארבעים ושמונה שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quarantotto ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Czterdzieści Osiem Godzin" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quarenta e Oito Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13655,7 +15031,6 @@ } }, "interval.fortyfive.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13681,18 +15056,18 @@ "value" : "ארבעים וחמש שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quarantacinque secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Czterdzieści Pięć Sekund" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quarenta e Cinco Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13710,17 +15085,10 @@ "state" : "translated", "value" : "四十五秒" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "四十五秒" - } } } }, "interval.four.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13746,18 +15114,18 @@ "value" : "ארבע שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quattro ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Cztery Godziny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quatro Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13775,17 +15143,10 @@ "state" : "translated", "value" : "四小时" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "四小時" - } } } }, "interval.four.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13811,18 +15172,18 @@ "value" : "ארבע שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quattro secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Cztery Sekundy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quatro Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13840,17 +15201,10 @@ "state" : "translated", "value" : "四秒" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "四秒" - } } } }, "interval.one.hour" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13876,18 +15230,18 @@ "value" : "שעה אחת" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un'ora" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Jedna Godzina" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uma Hora" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13905,17 +15259,10 @@ "state" : "translated", "value" : "一小时" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "一小時" - } } } }, "interval.one.minute" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13941,18 +15288,18 @@ "value" : "דקה אחת" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un minuto" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Jedna Minuta" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Um Minuto" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13970,17 +15317,10 @@ "state" : "translated", "value" : "一分钟" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "一分鐘" - } } } }, "interval.one.second" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14006,18 +15346,18 @@ "value" : "שניה אחת" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un secondo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Jedna Sekunda" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Um Segundo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14035,17 +15375,10 @@ "state" : "translated", "value" : "一秒" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "一秒" - } } } }, "interval.seventytwo.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14071,18 +15404,18 @@ "value" : "שבעים ושתיים שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Settantadue ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Siedemdziesiąt Dwie Godziny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Setenta e Duas Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14104,7 +15437,6 @@ } }, "interval.six.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14130,18 +15462,18 @@ "value" : "שש שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sei ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Sześć Godzin" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seis Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14159,17 +15491,10 @@ "state" : "translated", "value" : "六小时" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "六小時" - } } } }, "interval.ten.minutes" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14195,18 +15520,18 @@ "value" : "עשר דקות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dieci minuti" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dziesięć Minut" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dez Minutos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14224,17 +15549,10 @@ "state" : "translated", "value" : "十分钟" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "十分鐘" - } } } }, "interval.ten.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14260,18 +15578,18 @@ "value" : "עשר שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dieci secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dziesięć Sekund" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dez Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14289,17 +15607,10 @@ "state" : "translated", "value" : "十秒" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "十秒" - } } } }, "interval.thirty.minutes" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14325,18 +15636,18 @@ "value" : "שלושים דקות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trenta minuti" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Trzydzieści Minut" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trinta Minutos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14354,17 +15665,10 @@ "state" : "translated", "value" : "三十分钟" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "三十分鐘" - } } } }, "interval.thirty.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14390,18 +15694,18 @@ "value" : "שלושים שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trenta secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Trzydzieści Sekund" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trinta Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14419,17 +15723,10 @@ "state" : "translated", "value" : "三十秒" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "三十秒" - } } } }, "interval.thirtysix.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14455,18 +15752,18 @@ "value" : "שלושים ושש שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trentasei ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Trzydzieści Sześć Godzin" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trinta e Seis Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14484,17 +15781,10 @@ "state" : "translated", "value" : "三十六小时" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "三十六小時" - } } } }, "interval.three.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14520,18 +15810,18 @@ "value" : "שלוש שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tre ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Trzy Godziny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Três Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14549,17 +15839,10 @@ "state" : "translated", "value" : "三小时" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "三小時" - } } } }, "interval.three.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14585,18 +15868,18 @@ "value" : "שלוש שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tre secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Trzy Sekundy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Três Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14614,17 +15897,10 @@ "state" : "translated", "value" : "三秒" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "三秒" - } } } }, "interval.twelve.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14650,18 +15926,18 @@ "value" : "שניים עשר שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dodici ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dwanaście Godzin" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Doze Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14679,17 +15955,10 @@ "state" : "translated", "value" : "十二小时" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "十二小時" - } } } }, "interval.twenty.seconds" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -14715,18 +15984,18 @@ "value" : "עשרים שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Venti secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dwadzieścia Sekund" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vinte Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14744,17 +16013,10 @@ "state" : "translated", "value" : "二十秒" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "二十秒" - } } } }, "interval.twentyfive.seconds" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -14780,18 +16042,18 @@ "value" : "עשרים וחמש שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Venticinque secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dwadzieścia Pięć Sekund" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vinte e Cinco Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14809,17 +16071,10 @@ "state" : "translated", "value" : "二十五秒" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "二十五秒" - } } } }, "interval.twentyfour.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14845,18 +16100,18 @@ "value" : "עשרים וארבע שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ventiquattro ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dwadzieścia Cztery Godziny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vinte e Quatro Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14874,17 +16129,10 @@ "state" : "translated", "value" : "二十四小时" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "二十四小時" - } } } }, "interval.two.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14910,18 +16158,18 @@ "value" : "שעתיים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Due ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dwie Godziny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Duas Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14939,17 +16187,10 @@ "state" : "translated", "value" : "两小时" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "兩小時" - } } } }, "interval.two.minutes" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14975,18 +16216,18 @@ "value" : "שתי דקות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Due minuti" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dwie Minuty" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dois Minutos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15004,17 +16245,10 @@ "state" : "translated", "value" : "两分钟" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "兩分鐘" - } } } }, "interval.two.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15040,18 +16274,18 @@ "value" : "שתי שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Due secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dwie Sekundy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dois Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15069,17 +16303,10 @@ "state" : "translated", "value" : "两秒" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "兩秒" - } } } }, "inverted.top.bar.for.2.color.display" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -15087,6 +16314,12 @@ "value" : "Inverted top bar for 2 Color display" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Barra superiore invertita per la visualizzazione a 2 colori" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15102,7 +16335,6 @@ } }, "Japan" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -15110,6 +16342,12 @@ "value" : "Japan" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Giappone" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15120,6 +16358,12 @@ }, "JSON Enabled" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "JSON abilitato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15136,6 +16380,12 @@ }, "JSON mode is a limited, unencrypted MQTT output for locally integrating with home assistant" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La modalità JSON è un output MQTT limitato e non criptato per l'integrazione locale con l'assistente domestico" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15158,6 +16408,12 @@ "value" : "Schlüssel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15174,6 +16430,12 @@ }, "Key Mapping" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mappatura delle chiavi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15190,6 +16452,12 @@ "value" : "Schlüsselgröße" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dimensione della chiave" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15199,7 +16467,6 @@ } }, "keyboard.type" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -15225,18 +16492,18 @@ "value" : "סוג מקלדת" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tipo di tastiera" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Typ Klawiatury" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo de Teclado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15254,17 +16521,10 @@ "state" : "translated", "value" : "键盘类型" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "鍵盤類型" - } } } }, "Korea" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -15272,6 +16532,12 @@ "value" : "Korea" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corea" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15288,6 +16554,12 @@ "value" : "Zuletzt gehört" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'ultima volta che si è sentito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15310,6 +16582,12 @@ "value" : "Breitengrad" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Latitudine" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15326,6 +16604,12 @@ }, "LED Heartbeat" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Battito cardiaco a LED" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15342,6 +16626,12 @@ }, "LED State" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stato del LED" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15364,6 +16654,12 @@ "value" : "Alte Administrationsart" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amministrazione del patrimonio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15374,6 +16670,12 @@ }, "Licensed Operator" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Operatore con licenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15390,6 +16692,12 @@ }, "Limit all periodic broadcast intervals especially telemetry and position. If you need to increase hops, do it on nodes at the edges, not the ones in the middle. MQTT is not advised when you are duty cycle restricted because the gateway node is then doing all the work." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Limitare tutti gli intervalli di trasmissione periodica, in particolare la telemetria e la posizione. Se è necessario aumentare gli hop, farlo sui nodi ai margini, non su quelli al centro. MQTT è sconsigliato quando il ciclo di lavoro è limitato, perché è il nodo gateway a svolgere tutto il lavoro." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15406,6 +16714,12 @@ }, "Line Series" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serie di linee" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15416,6 +16730,12 @@ }, "Loading Logs. . ." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Caricamento dei log. . ." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15438,6 +16758,12 @@ "value" : "Standort" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15460,6 +16786,12 @@ "value" : "Standrot:" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione:" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15482,6 +16814,12 @@ "value" : "Gesperrt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bloccato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15498,6 +16836,12 @@ }, "Log Levels" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Livelli del registro" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15538,6 +16882,12 @@ "value" : "Category" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Categoria" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -15561,12 +16911,6 @@ "state" : "translated", "value" : "Category" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Category" - } } } }, @@ -15596,6 +16940,12 @@ "value" : "Level" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Livello" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -15619,12 +16969,6 @@ "state" : "translated", "value" : "Level" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Level" - } } } }, @@ -15654,6 +16998,12 @@ "value" : "Message" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -15677,17 +17027,10 @@ "state" : "translated", "value" : "Message" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message" - } } } }, "log.process" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15713,6 +17056,12 @@ "value" : "Process" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Processo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -15736,17 +17085,10 @@ "state" : "translated", "value" : "Process" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Process" - } } } }, "log.subsystem" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15772,6 +17114,12 @@ "value" : "Subsystem" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sottosistema" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -15795,12 +17143,6 @@ "state" : "translated", "value" : "Subsystem" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Subsystem" - } } } }, @@ -15830,6 +17172,12 @@ "value" : "Time" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -15853,12 +17201,6 @@ "state" : "translated", "value" : "Time" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Time" - } } } }, @@ -15888,18 +17230,18 @@ "value" : "רישום" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registrazione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Rejestracja" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Registo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15917,17 +17259,17 @@ "state" : "translated", "value" : "加载中" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "加載中" - } } } }, "Logs" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registri" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15944,6 +17286,12 @@ }, "Logs:" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registri:" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15966,6 +17314,12 @@ "value" : "Langer Name" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome lungo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15988,6 +17342,12 @@ "value" : "Langer Name: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome lungo: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16004,6 +17364,12 @@ }, "Long press to favorite or mute the contact or delete a conversation." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Premere a lungo per privilegiare o silenziare il contatto o eliminare una conversazione." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16019,7 +17385,6 @@ } }, "long.range.fast" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -16027,6 +17392,12 @@ "value" : "Long Range - Fast" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "A lungo raggio - Veloce" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16036,7 +17407,6 @@ } }, "long.range.moderate" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -16044,6 +17414,12 @@ "value" : "Long Range - Moderate" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lungo raggio - Moderato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16053,7 +17429,6 @@ } }, "long.range.slow" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -16061,6 +17436,12 @@ "value" : "Long Range - Slow" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lungo raggio - Lento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16077,6 +17458,12 @@ "value" : "Längengrad" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Longitudine" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16117,13 +17504,13 @@ "value" : "לורה" } }, - "pl" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "LoRa" } }, - "pt-PT" : { + "pl" : { "stringUnit" : { "state" : "translated", "value" : "LoRa" @@ -16146,12 +17533,6 @@ "state" : "translated", "value" : "LoRa" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "LoRa" - } } } }, @@ -16181,18 +17562,18 @@ "value" : "הגדרות לורה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione LoRa" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja LoRa" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração LoRa" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16210,17 +17591,10 @@ "state" : "translated", "value" : "LoRa 配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "LoRa 設定" - } } } }, "lora.signal.strength.bad" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -16234,6 +17608,12 @@ "value" : "Bad" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pessimo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16243,7 +17623,6 @@ } }, "lora.signal.strength.fair" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -16257,6 +17636,12 @@ "value" : "Fair" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiera" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16266,7 +17651,6 @@ } }, "lora.signal.strength.good" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -16280,6 +17664,12 @@ "value" : "Good" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buono" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16289,7 +17679,6 @@ } }, "lora.signal.strength.none" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -16303,6 +17692,12 @@ "value" : "None" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuno" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16313,6 +17708,12 @@ }, "LOW" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "BASSO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16322,7 +17723,6 @@ } }, "Malaysia 433mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -16330,6 +17730,12 @@ "value" : "Malaysia 433MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Malesia 433MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16339,7 +17745,6 @@ } }, "Malaysia 919mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -16347,6 +17752,12 @@ "value" : "Malaysia 919MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Malesia 919MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16357,6 +17768,12 @@ }, "Managed Device" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo gestito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16397,18 +17814,18 @@ "value" : "מפת מש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mappa della mesh" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Mapa Sieci" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mapa do Mesh" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16426,12 +17843,6 @@ "state" : "translated", "value" : "Mesh 地图" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mesh 地圖" - } } } }, @@ -16443,6 +17854,12 @@ "value" : "Kartenoptionen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni mappa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16459,6 +17876,12 @@ }, "Map Publish Interval" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo di pubblicazione della mappa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16475,6 +17898,12 @@ }, "Map Report" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rapporto sulla mappa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16491,6 +17920,12 @@ }, "Map Tile Data" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dati delle piastrelle della mappa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16506,7 +17941,6 @@ } }, "map.centering" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -16526,18 +17960,18 @@ "value" : "מכשיר במרכז" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modalità di centratura" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Tryb Wyśrodkowania" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modo de Centralização" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16555,17 +17989,10 @@ "state" : "translated", "value" : "居中" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "置中" - } } } }, "map.tiles.delete" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -16585,18 +18012,18 @@ "value" : "מחק כל חלקי מפה שמורים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare tutte le tessere della mappa" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Usuń Wszystkie Kafle Mapy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apagar Todas as Imagens da Mapa" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16614,17 +18041,10 @@ "state" : "translated", "value" : "删除所有瓦片地图" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "刪除已緩存的地圖區塊" - } } } }, "map.type" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -16650,18 +18070,18 @@ "value" : "סוג ברירת מחדל" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tipo predefinito" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Domyślny Typ" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo Padrão" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16679,17 +18099,10 @@ "state" : "translated", "value" : "地图类型" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "地圖類型" - } } } }, "map.use.legacy" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -16715,18 +18128,18 @@ "value" : "השתמש במפה מדור קודם" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usare la mappa mesh legacy" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Use Legacy Mesh Map" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Utilizar Mapa do Mesh Antigo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16744,17 +18157,10 @@ "state" : "translated", "value" : "使用传统网状地图" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "使用傳統Mesh地圖" - } } } }, "map.usertrackingmode" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -16780,18 +18186,18 @@ "value" : "מצב מעקב אחר משתמש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modalità di tracciamento dell'utente" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Tryb śledzenia użytkownika" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modo de Rastreamento do Utilizador" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16809,17 +18215,10 @@ "state" : "translated", "value" : "用户跟随模式" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "使用者跟隨模式" - } } } }, "map.usertrackingmode.follow" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16845,18 +18244,18 @@ "value" : "עקוב" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seguire" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Śledź" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seguir" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16874,17 +18273,10 @@ "state" : "translated", "value" : "跟随" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "跟隨" - } } } }, "map.usertrackingmode.followwithheading" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16910,18 +18302,18 @@ "value" : "עקוב עם כיוון" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seguire con l'intestazione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Śledź z kierunkiem" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seguir com Direção" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16939,17 +18331,10 @@ "state" : "translated", "value" : "跟随航向" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "跟隨與方向" - } } } }, "map.usertrackingmode.none" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16975,18 +18360,18 @@ "value" : "ללא" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuno" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhum" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17004,17 +18389,10 @@ "state" : "translated", "value" : "无" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "無" - } } } }, "medium.range.fast" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -17022,6 +18400,12 @@ "value" : "Medium Range - Fast" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medio raggio - Veloce" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17031,7 +18415,6 @@ } }, "medium.range.slow" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -17039,6 +18422,12 @@ "value" : "Medium Range - Slow" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medio raggio - Lento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17049,6 +18438,12 @@ }, "Mesh activity update" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornamento dell'attività di rete" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17083,18 +18478,18 @@ "value" : "פעילות מש חיה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rete Attività live" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Aktywność na Żywo" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Atividade Ao Vivo do Mesh" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17112,17 +18507,68 @@ "state" : "translated", "value" : "Mesh 实时活动" } - }, - "zh-Hant-TW" : { + } + } + }, + "mesh.log" : { + "localizations" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Mesh 即時活動" + "value" : "Mesh Log" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mesh Log" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Journal du maillage" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "יומן מש" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro di mesh" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dziennik Sieci" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mesh-logg" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Логови мреже" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mesh 日志" } } } }, "mesh.log.ambientlighting.config %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -17142,18 +18588,18 @@ "value" : "הגדרות מודולת תאורת סביבה התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo di illuminazione ambientale ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Ambient Lighting module config received: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo de Iluminação Ambiente recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17171,17 +18617,10 @@ "state" : "translated", "value" : "Ambient Lighting module config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ambient Lighting module config received: %@" - } } } }, "mesh.log.bluetooth.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -17207,18 +18646,18 @@ "value" : "הגדרות בלוטוס התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione Bluetooth ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano konfigurację Bluetooth: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração Bluetooth recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17236,17 +18675,10 @@ "state" : "translated", "value" : "Bluetooth config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth config received: %@" - } } } }, "mesh.log.cannedmessage.config %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -17266,18 +18698,18 @@ "value" : "הגדרות מודולת תגובות שמורות התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo Canned Message ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano konfigurację modułu wiadomości gotowych: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo de Mensagens Padrão recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17295,17 +18727,10 @@ "state" : "translated", "value" : "Canned Message module config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canned Message module config received: %@" - } } } }, "mesh.log.cannedmessages.messages.get %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -17325,18 +18750,18 @@ "value" : "התבקשו הודעות מודולת הודעות שמורות עבור מכשיר: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi in scatola richiesti Messaggi del modulo per il nodo: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zażądano Wiadomości z Modułu Wiadomości Gotowych dla węzła: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagens Padrão solicitadas para o módulo de mensagens para o nó: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17354,17 +18779,10 @@ "state" : "translated", "value" : "Requested Canned Messages Module Messages for node: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requested Canned Messages Module Messages for node: %@" - } } } }, "mesh.log.cannedmessages.messages.received %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -17384,18 +18802,18 @@ "value" : "הודעות עבור הודעות שמורות התקבלו מ-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi in scatola Messaggi ricevuti per: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano Wiadomości Gotowe Dla: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagens Padrão recebidas para: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17413,17 +18831,10 @@ "state" : "translated", "value" : "Canned Messages Messages Received For: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canned Messages Messages Received For: %@" - } } } }, "mesh.log.channel.sent %@ %d" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -17443,18 +18854,18 @@ "value" : "נשלח ערוץ עבור: %@ אינדקס ערוצים %d" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato un canale per: %@ Canale Indice %d" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wysłano kanał dla: %@ Indeks kanału %d" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Um Canal Enviado para: %@ Índice do Canal %d" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17472,17 +18883,10 @@ "state" : "translated", "value" : "Sent a Channel for: %@ Channel Index %d" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a Channel for: %@ Channel Index %d" - } } } }, "mesh.log.detectionsensor.config %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -17502,18 +18906,18 @@ "value" : "הגדרות מודולת חיישן זיהוי התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo sensore di rilevamento ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Detection Sensor module config received: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo de sensor de detecção recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17531,17 +18935,10 @@ "state" : "translated", "value" : "Detection Sensor module config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到偵測感應器模組配置:%@" - } } } }, "mesh.log.device.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -17567,18 +18964,18 @@ "value" : "הגדרות מכשיר התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione dispositivo ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano konfigurację urządzenia: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do dispositivo recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17596,17 +18993,10 @@ "state" : "translated", "value" : "Device config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到裝置設定: %@" - } } } }, "mesh.log.device.metadata.received %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -17632,18 +19022,18 @@ "value" : "מטא-דאטה של מכשיר התקבל מ-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metadati del dispositivo ricevuti da: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano metadane urządzenia od: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Os Metadados do dispositivo recebidos de: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17661,17 +19051,10 @@ "state" : "translated", "value" : "Device Metadata admin message received from: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "從 %@ 收到設備元數據管理消息" - } } } }, "mesh.log.devicemetadata %@" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -17697,18 +19080,18 @@ "value" : "מבקש מטא-דאטה עבור %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Richiesta dei metadati del dispositivo per %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Żądanie metadanych urządzenia dla %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Solicitando os Metadados do Dispositivo para %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17726,17 +19109,10 @@ "state" : "translated", "value" : "Requesting Device Metadata for %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "請求設備元數據:%@" - } } } }, "mesh.log.display.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -17762,18 +19138,18 @@ "value" : "הגדרות תצוגה התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Visualizzazione della configurazione ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano konfigurację wyświetlacza: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do icrãn recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17791,17 +19167,10 @@ "state" : "translated", "value" : "Display config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到顯示模組設定: %@" - } } } }, "mesh.log.externalnotification.config %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -17821,18 +19190,18 @@ "value" : "הגדרות מודולת נוטיפיקציה חיצונית התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo di notifica esterno ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano konfigurację modułu zewnętrznych powiadomień: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo de notificação externa recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17850,17 +19219,10 @@ "state" : "translated", "value" : "External Notification module config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到外部通知模組配置:%@" - } } } }, "mesh.log.lora.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -17886,18 +19248,18 @@ "value" : "הגדרות לורה התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione LoRa ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano konfigurację LoRa: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração LoRa recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17915,17 +19277,10 @@ "state" : "translated", "value" : "LoRa config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到LoRa設定: %@" - } } } }, "mesh.log.lora.config.sent %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -17951,18 +19306,18 @@ "value" : "נשלחו הגדרות לורה עבור: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato un LoRa.Config per: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wysłano konfigurację LoRa dla: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do LoRa Enviado para: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17980,17 +19335,10 @@ "state" : "translated", "value" : "Sent a LoRa.Config for: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "發送LoRa配置給:%@" - } } } }, "mesh.log.mqtt.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -18016,18 +19364,18 @@ "value" : "הגדרות מודולת MQTT התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo MQTT ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano konfigurację modułu MQTT: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo MQTT recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18045,17 +19393,10 @@ "state" : "translated", "value" : "收到 MQTT 模块配置:%@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到MQTT模組配置:%@" - } } } }, "mesh.log.myinfo %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -18081,18 +19422,18 @@ "value" : "MyInfo התקבל: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "MyInfo ricevuto: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano Moje Informacje: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "MyInfo recebido: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18110,17 +19451,10 @@ "state" : "translated", "value" : "MyInfo received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到我的資訊:%@" - } } } }, "mesh.log.network.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -18146,18 +19480,18 @@ "value" : "הגדרות רשת התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione di rete ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano konfigurację sieci: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de rede recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18175,17 +19509,10 @@ "state" : "translated", "value" : "Network config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到網路設定: %@" - } } } }, "mesh.log.nodeinfo.received %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -18211,18 +19538,18 @@ "value" : "מידע אודות מכשיר התקבל: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ricevute informazioni sul nodo per: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano informacje o węźle dla: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informações do nó recebidas para: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18240,17 +19567,10 @@ "state" : "translated", "value" : "Node info received for: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到中繼點訊息: %@" - } } } }, "mesh.log.paxcounter %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -18270,18 +19590,18 @@ "value" : "PAX Counter packet received for: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio del contatore PAX ricevuto da: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "PAX Counter packet received for: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagem do Contador PAX recebida de: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18299,17 +19619,10 @@ "state" : "translated", "value" : "PAX Counter message received for: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "為 %@ 收到PAX計數器消息" - } } } }, "mesh.log.paxcounter.config %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -18317,10 +19630,10 @@ "value" : "PAX Counter config received: %@" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Configuração do Contador PAX recebida: %@" + "value" : "Configurazione del contatore PAX ricevuta: %@" } }, "se" : { @@ -18338,7 +19651,6 @@ } }, "mesh.log.position.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -18364,18 +19676,18 @@ "value" : "הגדרות מיקום התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della posizione ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano konfigurację pozycji: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de posição recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18393,17 +19705,10 @@ "state" : "translated", "value" : "Positon config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到位置配置:%@" - } } } }, "mesh.log.position.received %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -18429,18 +19734,18 @@ "value" : "הודעת מיקום התקבלו מ-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione Pacchetto ricevuto dal nodo: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano pakiet pozycji od węzła: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pacote de posição recebido do nó: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18458,17 +19763,10 @@ "state" : "translated", "value" : "Position Packet received from node: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "從中繼點接收到定位封包: %@" - } } } }, "mesh.log.power.config %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -18476,10 +19774,10 @@ "value" : "Power config received: %@" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Configuração de energia recebida: %@" + "value" : "Configurazione dell'alimentazione ricevuta: %@" } }, "se" : { @@ -18497,7 +19795,6 @@ } }, "mesh.log.rangetest.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -18523,18 +19820,18 @@ "value" : "הגדרות מודולת בדיקת טווח התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo Range Test ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano konfigurację modułu testu zasięgu: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo de teste de alcance recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18552,17 +19849,10 @@ "state" : "translated", "value" : "收到范围测试模块配置: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到拉距測試模組設定: %@" - } } } }, "mesh.log.ringtone.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -18588,18 +19878,18 @@ "value" : "הגדרות RTTTL רינגטון התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "RTTTL Configurazione suoneria ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano konfigurację dzwonka RTTTL: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de toque RTTTL recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18617,17 +19907,10 @@ "state" : "translated", "value" : "RTTTL Ringtone config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到RTTTL鈴聲配置:%@" - } } } }, "mesh.log.routing.message %@ %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -18653,18 +19936,18 @@ "value" : "התקבל מסלול עבור בקשה: %@ מצב שליחה: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Routing ricevuto per RequestID: %@ Ack Status: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano trasowanie dla RequestID: %@ Ack Status: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Roteamento recebido para RequestID: %@ Estado de Ack: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18682,17 +19965,10 @@ "state" : "translated", "value" : "Routing received for RequestID: %@ Ack Status: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "為請求ID: %@ 收到路由 Ack狀態: %@" - } } } }, "mesh.log.serial.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -18718,18 +19994,18 @@ "value" : "הגדרות מודולת תקשורת סיריאלית התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione modulo seriale ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano konfigurację modułu szeregowego: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo serial recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18747,17 +20023,10 @@ "state" : "translated", "value" : "Serial module config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到串列模組配置:%@" - } } } }, "mesh.log.sharelocation %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -18783,18 +20052,18 @@ "value" : "נשלח מיקום ממכשיר האפל למכשיר המשטסטיק: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato un pacchetto di posizione dal GPS del dispositivo Apple al nodo: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wysłano pakiet pozycji z GPS urządzenia Apple do węzła: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enviado um Pacote de Posição do GPS do dispositivo Apple para o nó: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18812,17 +20081,10 @@ "state" : "translated", "value" : "Sent a Position Packet from the Apple device GPS to node: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "傳送iOS裝置的GPS定位封包到中繼點上: %@" - } } } }, "mesh.log.storeforward.config %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -18842,18 +20104,18 @@ "value" : "הגדרות מודולת שמירה ושליחה התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo Store & Forward ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Store & Forward module config received: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo Store & Forward recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18871,17 +20133,10 @@ "state" : "translated", "value" : "Store & Forward module config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到儲存與轉發模組配置:%@" - } } } }, "mesh.log.telemetry.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -18907,18 +20162,18 @@ "value" : "הגדרות מודולת טלמטריה התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo di telemetria ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano konfigurację modułu telemetrii: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo de telemetria recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18936,17 +20191,10 @@ "state" : "translated", "value" : "Telemetry module config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到遠測模組設定: %@" - } } } }, "mesh.log.telemetry.received %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -18972,18 +20220,18 @@ "value" : "התקבל טלמטריה עבור: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telemetria ricevuta per: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Telemetria odebrana dla: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetria recebida para: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19001,17 +20249,10 @@ "state" : "translated", "value" : "Telemetry received for: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到遠測資料: %@" - } } } }, "mesh.log.textmessage.received" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -19037,18 +20278,18 @@ "value" : "הודעת טקסט התקבלה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio ricevuto dall'app messaggi di testo." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wiadomość odebrana z aplikacji do wysyłania wiadomości tekstowych." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagem recebida do App de mensagem de texto." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19066,17 +20307,10 @@ "state" : "translated", "value" : "Message received from the text message app." } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "從文字消息應用程序收到消息。" - } } } }, "mesh.log.textmessage.send.failed %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -19102,18 +20336,18 @@ "value" : "שליחת הודעה נכשלה, אין חיבוריות ל-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invio messaggio fallito, connessione non corretta a %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Nieudane wysłanie wiadomości, brak prawidłowego połączenia z %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Falha no envio da mensagem, não conectado corretamente a %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19131,17 +20365,10 @@ "state" : "translated", "value" : "Message Send Failed, not properly connected to %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "訊息傳送失敗, 沒有正確連接到 %@" - } } } }, "mesh.log.textmessage.sent %@ %@ %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -19167,18 +20394,18 @@ "value" : "נשלחה הודעה %@ מ-%@ ל-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato messaggio %@ da %@ a %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wysłano wiadomość %@ od %@ do %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagem enviada %@ de %@ para %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19196,17 +20423,10 @@ "state" : "translated", "value" : "Sent message %@ from %@ to %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "傳送訊息 %@ 從 %@ 到 %@" - } } } }, "mesh.log.traceroute.received.direct %@" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -19232,18 +20452,18 @@ "value" : "בקשת בדיקת מסלול נשלחה למכשיר: %@ התקבל ישירות." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trace La richiesta di rotta inviata al nodo: %@ è stata ricevuta direttamente." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Żądanie śledzenia trasy wysłane do węzła: %@ zostało odebrane bezpośrednio." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Solicitação de Rastreamento enviada para o nó: %@\" foi recebida diretamente." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19261,17 +20481,10 @@ "state" : "translated", "value" : "Trace Route request sent to node: %@ was recieived directly." } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "直接收到發送至節點的追蹤路由請求:%@" - } } } }, "mesh.log.traceroute.received.route %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -19297,18 +20510,18 @@ "value" : "בקשת בדיקת מסלול הצליחה: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Traccia Richiesta di rotta restituita: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Żądanie śledzenia trasy zwrócone: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Solicitação de Rastreamento retornada: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19326,17 +20539,10 @@ "state" : "translated", "value" : "Trace Route request returned: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "返回的追蹤路由請求:%@" - } } } }, "mesh.log.traceroute.sent %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -19362,18 +20568,18 @@ "value" : "נשלחה בקשת בדיקת מסלול למכשיר: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ha inviato una richiesta di tracciamento della rotta al nodo: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wysłano żądanie śledzenia trasy do węzła: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enviei uma solicitação de Rastreamento para o nó: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19391,17 +20597,10 @@ "state" : "translated", "value" : "Sent a Trace Route Request to node: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "發送追蹤路由請求至節點:%@" - } } } }, "mesh.log.wantconfig %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -19421,18 +20620,18 @@ "value" : "שולח בקשת הגדרות ל-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Emissione di Want Config a %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wydawanie Want Config to %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Emitindo Configuração Desejada para %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19450,17 +20649,10 @@ "state" : "translated", "value" : "Issuing Want Config to %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "對 %@ 發出配置請求" - } } } }, "mesh.log.waypoint.received %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -19486,18 +20678,18 @@ "value" : "נקודת ציון התקבלה מ-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pacchetto Waypoint ricevuto dal nodo: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano pakiet punktu orientacyjnego od węzła: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pacote de Ponto de Referência recebido do nó: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19515,17 +20707,10 @@ "state" : "translated", "value" : "Waypoint Packet received from node: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "從節點收到航點封包:%@" - } } } }, "mesh.log.waypoint.sent %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -19551,18 +20736,18 @@ "value" : "נשלחה נקודת ציון מ-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato un pacchetto Waypoint da: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wysłano pakiet punktu orientacyjnego z: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enviado um Pacote de Ponto de Referência de: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19580,12 +20765,6 @@ "state" : "translated", "value" : "Sent a Waypoint Packet from: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "從 %@ 發送航點封包" - } } } }, @@ -19597,6 +20776,12 @@ "value" : "Meshtastic Knoten %@ hat Kanäle mit dir geteilt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il Nodo Meshtastic %@ ha condiviso i canali con voi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -19607,6 +20792,12 @@ }, "Meshtastic® Copyright Meshtastic LLC" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meshtastic® Copyright Meshtastic LLC" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -19641,18 +20832,18 @@ "value" : "הודעה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wiadomość" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagem" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19670,12 +20861,6 @@ "state" : "translated", "value" : "消息" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "訊息" - } } } }, @@ -19687,6 +20872,12 @@ "value" : "Nachricht" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -19703,6 +20894,12 @@ "value" : "Nachrichteninhalt überschreitet 200 Bytes." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il contenuto del messaggio supera i 200 byte." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -19713,6 +20910,12 @@ }, "Message Status Options" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni di stato del messaggio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -19747,18 +20950,18 @@ "value" : "פרטי הודעה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dettagli del messaggio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Szczegóły wiadomości" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dados de Mensagem" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19776,12 +20979,6 @@ "state" : "translated", "value" : "消息详情" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "詳細訊息" - } } } }, @@ -19811,18 +21008,18 @@ "value" : "הודעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wiadomości" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagens" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19840,12 +21037,6 @@ "state" : "translated", "value" : "消息" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "訊息" - } } } }, @@ -19857,6 +21048,12 @@ "value" : "Nachrichten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -19873,6 +21070,12 @@ "value" : "Nachrichten getrennt mit |" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I messaggi sono separati da |" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -19883,6 +21086,12 @@ }, "Metric" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metrico" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -19899,6 +21108,12 @@ "value" : "Minimum Distanz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Distanza minima" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -19915,6 +21130,12 @@ "value" : "Minimum Intervall" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo minimo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -19925,6 +21146,12 @@ }, "Minimum time between detection broadcasts" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempo minimo tra le trasmissioni di rilevamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -19935,6 +21162,12 @@ }, "Mininum time between detection broadcasts. Default is 45 seconds." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempo minimo tra le trasmissioni di rilevamento. L'impostazione predefinita è 45 secondi." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -19969,18 +21202,18 @@ "value" : "מצב" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modalità" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Tryb" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19998,17 +21231,17 @@ "state" : "translated", "value" : "模式" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "模式" - } } } }, "Model" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modello" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20049,18 +21282,18 @@ "value" : "הגדרות מודולה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja modułu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do Módulo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20078,12 +21311,6 @@ "state" : "translated", "value" : "模块配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "模塊設定" - } } } }, @@ -20113,13 +21340,13 @@ "value" : "MQTT" } }, - "pl" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "MQTT" } }, - "pt-PT" : { + "pl" : { "stringUnit" : { "state" : "translated", "value" : "MQTT" @@ -20142,17 +21369,17 @@ "state" : "translated", "value" : "MQTT" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT" - } } } }, "MQTT" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "MQTT" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20193,18 +21420,18 @@ "value" : "MQTT Client Proxy" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Proxy client MQTT" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Klient Proxy MQTT" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proxy do Cliente MQTT" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20222,12 +21449,6 @@ "state" : "translated", "value" : "MQTT 客户端代理" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT 客户端代理" - } } } }, @@ -20257,18 +21478,18 @@ "value" : "הגדרות MQTT" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione MQTT" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja MQTT" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração MQTT" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20286,17 +21507,10 @@ "state" : "translated", "value" : "MQTT 配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT 設定" - } } } }, "mqtt.connect" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20322,18 +21536,18 @@ "value" : "התחבר ל-MQTT" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Connettersi a MQTT" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Connect to MQTT" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Conectar ao MQTT" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20351,17 +21565,10 @@ "state" : "translated", "value" : "连接至 MQTT" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "連線到 MQTT" - } } } }, "mqtt.disconnect" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20387,18 +21594,18 @@ "value" : "התנתק מ-MQTT" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disconnessione da MQTT" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Disconnect from MQTT" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desconectar do MQTT" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20416,12 +21623,6 @@ "state" : "translated", "value" : "断开 MQTT 连接" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "是否與 MQTT 連接" - } } } }, @@ -20451,18 +21652,18 @@ "value" : "שם משתמש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome utente" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Nazwa użytkownika" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome de Utilizador" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20480,17 +21681,17 @@ "state" : "translated", "value" : "用户名称" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "用戶名稱" - } } } }, "Must be a single emoji" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deve essere una singola emoji" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20501,6 +21702,12 @@ }, "Nag timeout" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Timeout di Nag" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20535,18 +21742,18 @@ "value" : "שם" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Nazwa" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20564,12 +21771,6 @@ "state" : "translated", "value" : "名称" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "名稱" - } } } }, @@ -20581,6 +21782,12 @@ "value" : "Name" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20603,6 +21810,12 @@ "value" : "Name muss kürzer als 30 Bytes sein" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il nome deve essere inferiore a 30 byte" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20619,6 +21832,12 @@ }, "Navigate to node" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spostarsi sul nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20629,6 +21848,12 @@ }, "Nearby Topics" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Argomenti vicini" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20663,18 +21888,18 @@ "value" : "רשת" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rete" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Sieć" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rede" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20692,17 +21917,17 @@ "state" : "translated", "value" : "网络" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "網路" - } } } }, "Network Status Orange" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stato della rete Arancione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20719,6 +21944,12 @@ }, "Network Status Red" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stato della rete Rosso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20759,18 +21990,18 @@ "value" : "הגדרות רשת" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della rete" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja sieci" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de Rede" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20788,12 +22019,6 @@ "state" : "translated", "value" : "网络配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "網路設定" - } } } }, @@ -20805,6 +22030,12 @@ "value" : "Nie" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mai" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20814,8 +22045,13 @@ } }, "New Node" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nuovo nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20825,8 +22061,13 @@ } }, "New Node has been discovered" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È stato scoperto un nuovo nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20836,7 +22077,6 @@ } }, "New Node Notifications" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -20862,18 +22102,18 @@ "value" : "New Node Notifications" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notifiche di nuovi nodi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "New Node Notifications" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notificações de Nó Novo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20891,17 +22131,10 @@ "state" : "translated", "value" : "新节点通知" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "新節點通知" - } } } }, "New Zealand 865mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -20909,6 +22142,12 @@ "value" : "New Zealand 865MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nuova Zelanda 865MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20925,6 +22164,12 @@ "value" : "Neuere Firmware ist verfügbar" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È disponibile un firmware più recente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20947,6 +22192,12 @@ "value" : "Kein verbundener Knoten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun nodo collegato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20957,6 +22208,12 @@ }, "No Device Metrics" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuna metrica del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20967,6 +22224,12 @@ }, "No Environment Metrics" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuna metrica ambientale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -20982,7 +22245,6 @@ } }, "No PIN (Just Works)" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21008,18 +22270,18 @@ "value" : "ללא קוד (פשוט עובד)" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun PIN (funziona e basta)" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak PINu (po prostu działa)" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem PIN (Simplesmente Funciona)" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21037,12 +22299,6 @@ "state" : "translated", "value" : "不使用 PIN 码(直接配对)" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "不使用 PIN 碼(直接配對)" - } } } }, @@ -21054,6 +22310,12 @@ "value" : "Keine Positionen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuna posizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21064,6 +22326,12 @@ }, "No Power Metrics" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuna metrica di potenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21073,7 +22341,6 @@ } }, "no.nodes" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -21099,18 +22366,18 @@ "value" : "לא נמצאו מכשירי משטסטיק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun nodo Meshtastic trovato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Nie znaleziono węzłów Meshtastic" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhum Nó Meshtastic Encontrado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21128,12 +22395,6 @@ "state" : "translated", "value" : "未找到 Meshtastic 节点" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "未找到 Meshtastic 中繼點" - } } } }, @@ -21145,6 +22406,12 @@ "value" : "Knoten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21157,10 +22424,16 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", "value" : "Node Core Data Backup %1$@/%2$@ - %3$@ - %4$@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Backup dei dati del nucleo del nodo %1$@/%2$@ - %3$@ - %4$@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21183,6 +22456,12 @@ "value" : "Knoten hat keine Position" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il nodo non ha posizioni" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21199,6 +22478,12 @@ "value" : "Knoten Historie" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Storia del nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21209,6 +22494,12 @@ }, "Node Info Broadcast Interval" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo di trasmissione delle informazioni sul nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21225,6 +22516,12 @@ "value" : "Knotenkarte" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mappa dei nodi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21241,6 +22538,12 @@ "value" : "Knotennummer" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Numero di nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21250,7 +22553,6 @@ } }, "nodelist.filter.distance %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21276,18 +22578,18 @@ "value" : "up to %@ away" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "fino a %@ di distanza" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "up to %@ away" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "até %@ de distância" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21305,12 +22607,6 @@ "state" : "translated", "value" : "最远距离 %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "距離達 %@ 以內" - } } } }, @@ -21340,10 +22636,10 @@ "value" : "מכשירים" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Nós" + "value" : "Nodi" } }, "se" : { @@ -21363,17 +22659,10 @@ "state" : "translated", "value" : "节点" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "中繼點" - } } } }, "nodes %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21399,18 +22688,18 @@ "value" : "מכשירים (%@)" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodi (%@)" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Węzły (%@)" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nós (%@)" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21428,17 +22717,17 @@ "state" : "translated", "value" : "节点 (%@)" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "中繼點 (%@)" - } } } }, "Not a valid route file" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non è un file di percorso valido" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21473,18 +22762,18 @@ "value" : "אין מכשיר מחובר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun dispositivo collegato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak podłączonych urządzeń" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhum dispositivo conectado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21502,12 +22791,6 @@ "state" : "translated", "value" : "设备未连接" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "未連接到電台" - } } } }, @@ -21519,6 +22802,12 @@ "value" : "Knoten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Note" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21535,6 +22824,12 @@ "value" : "Anzahl: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Num: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21551,6 +22846,12 @@ "value" : "Anzahl Hops" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Numero di hop" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21567,6 +22868,12 @@ "value" : "Anzahl Einträge" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Numero di record" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21583,6 +22890,12 @@ "value" : "Anzahl Satelliten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Numero di satelliti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21592,7 +22905,6 @@ } }, "numbers.punctuation" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -21618,18 +22930,18 @@ "value" : "מספרים וסימני פיסוק " } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Numeri e punteggiatura" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Cyfry i interpunkcja" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Números e Pontuação" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21647,17 +22959,10 @@ "state" : "translated", "value" : "数字和标点符号" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "數字和標點符號" - } } } }, "off" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21683,18 +22988,18 @@ "value" : "כבוי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spento" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wyłączony" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desligado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21712,17 +23017,10 @@ "state" : "translated", "value" : "关闭" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "關閉" - } } } }, "offline" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -21748,13 +23046,13 @@ "value" : "מנותק" } }, - "pl" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Offline" + "value" : "Non in linea" } }, - "pt-PT" : { + "pl" : { "stringUnit" : { "state" : "translated", "value" : "Offline" @@ -21777,12 +23075,6 @@ "state" : "translated", "value" : "离线" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "離線" - } } } }, @@ -21794,6 +23086,12 @@ "value" : "Ok" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21804,6 +23102,12 @@ }, "Ok to MQTT" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ok a MQTT" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21826,6 +23130,12 @@ "value" : "OLED Typ" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tipo OLED" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21841,7 +23151,6 @@ } }, "on.boot" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21867,18 +23176,18 @@ "value" : "רק בעת הדלקה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Solo all'avvio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Tylko przy uruchomieniu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "No arranque" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21896,17 +23205,17 @@ "state" : "translated", "value" : "仅在启动时" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "只在啟動時" - } } } }, "Onboarding for licensed operators requires firmware 2.0.20 or greater. Make sure to refer to your local regulations and contact the local amateur frequency coordinators with questions." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per l'attivazione degli operatori con licenza è necessario il firmware 2.0.20 o superiore. Assicuratevi di consultare le normative locali e di contattare i coordinatori delle frequenze amatoriali locali per eventuali domande." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21929,6 +23238,12 @@ "value" : "Eine Stunde" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un'ora" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21945,6 +23260,12 @@ "value" : "Eine Minute" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un minuto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21961,6 +23282,12 @@ "value" : "Online" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In linea" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21977,6 +23304,12 @@ "value" : "Einstellungen öffnen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aprire le impostazioni" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21992,7 +23325,6 @@ } }, "optimized.for.2.color.displays" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -22000,6 +23332,12 @@ "value" : "Optimized for 2 color displays" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ottimizzato per i display a 2 colori" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22010,6 +23348,12 @@ }, "Optional fields to include when assembling position messages. the more fields are included, the larger the message will be - leading to longer airtime and a higher risk of packet loss" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Campi opzionali da includere quando si assemblano i messaggi di posizione. Più campi sono inclusi, più grande sarà il messaggio, con conseguente allungamento dei tempi di trasmissione e un maggiore rischio di perdita di pacchetti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22026,6 +23370,12 @@ }, "Optional GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "GPIO opzionale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22060,18 +23410,18 @@ "value" : "הגדרות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Opcje" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Opções" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22089,12 +23439,6 @@ "state" : "translated", "value" : "选项" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "選項" - } } } }, @@ -22106,6 +23450,12 @@ "value" : "Optionen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22122,6 +23472,12 @@ }, "OS Log Entry Details" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dettagli della voce del registro OS" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22131,10 +23487,35 @@ } }, "OTA Updates are not supported on this NRF Device." : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gli aggiornamenti OTA non sono supportati da questo dispositivo NRF." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ОТА ажурирања нису подржана на овом NRF уређају." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "OTA 更新不支持 NRF 设备" + } + } + } }, "OTA Updates are not supported on your platform." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gli aggiornamenti OTA non sono supportati dalla vostra piattaforma." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22151,6 +23532,12 @@ }, "Other data sources" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Altre fonti di dati" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22167,6 +23554,12 @@ "value" : "Ausgabe von Echtzeit-Fehlersuchprotokollen über die serielle Schnittstelle, Anzeige und Export von positionskorrigierten Geräteprotokollen über Bluetooth." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Emissione di registrazioni di debug in tempo reale via seriale, visualizzazione ed esportazione di registri del dispositivo con correzione della posizione via Bluetooth." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22177,6 +23570,12 @@ }, "Output pin buzzer GPIO " : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin di uscita cicalino GPIO " + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22187,6 +23586,12 @@ }, "Output pin GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin di uscita GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22197,6 +23602,12 @@ }, "Output pin vibra GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin di uscita vibra GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22207,6 +23618,12 @@ }, "Override automatic OLED screen detection." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annulla il rilevamento automatico dello schermo OLED." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22241,18 +23658,18 @@ "value" : "מצב הצמדה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modalità di accoppiamento" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Tryb parowania" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modo Pairing" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22270,12 +23687,6 @@ "state" : "translated", "value" : "配对模式" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "配對模式" - } } } }, @@ -22305,18 +23716,18 @@ "value" : "סיסמא" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Password" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Hasło" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Senha" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22334,12 +23745,6 @@ "state" : "translated", "value" : "密码" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "密碼" - } } } }, @@ -22369,18 +23774,18 @@ "value" : "הפסק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pausa" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Pause" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pausa" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22398,12 +23803,6 @@ "state" : "translated", "value" : "暂停" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "暫停" - } } } }, @@ -22415,7 +23814,7 @@ "value" : "BLE" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "BLE" @@ -22443,10 +23842,10 @@ "value" : "No PAX Counter Logs" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Nenhum Log do Contador PAX Disponível" + "value" : "Nessun registro del contatore PAX" } }, "se" : { @@ -22471,10 +23870,10 @@ "value" : "Delete all pax data?" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Apagar todos os dados de pax?" + "value" : "Cancellare tutti i dati dei passeggeri?" } }, "se" : { @@ -22499,10 +23898,10 @@ "value" : "PAX Counter Log" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Log do Contador PAX" + "value" : "Registro del contatore PAX" } }, "se" : { @@ -22527,10 +23926,10 @@ "value" : "Total PAX" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Total de PAX" + "value" : "Totale PAX" } }, "se" : { @@ -22555,7 +23954,7 @@ "value" : "WiFi" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "WiFi" @@ -22583,6 +23982,12 @@ "value" : "Verbundenen Knoten auf Werkseinstellungen zurücksetzen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eseguire un reset di fabbrica sul nodo a cui si è connessi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22592,7 +23997,6 @@ } }, "Philippines 433mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -22600,6 +24004,12 @@ "value" : "Philippines 433MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filippine 433MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22609,7 +24019,6 @@ } }, "Philippines 868mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -22617,6 +24026,12 @@ "value" : "Philippines 868MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filippine 868MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22626,7 +24041,6 @@ } }, "Philippines 915mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -22634,6 +24048,12 @@ "value" : "Philippines 915MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filippine 915MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22668,18 +24088,18 @@ "value" : "GPS מהטלפון" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telefono GPS" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "GPS telefonu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "GPS do Telefone" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22697,17 +24117,10 @@ "state" : "translated", "value" : "手机 GPS" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "手機 GPS" - } } } }, "phone.gps.interval.description" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -22733,18 +24146,18 @@ "value" : "כל כמה זמן מכשיר הטלפון ישלח את מיקומך למכשיר המשטסטיק. עדכוני מיקום למש מנוהלות על ידי המכשיר." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La frequenza con cui il telefono invia la posizione al dispositivo, gli aggiornamenti della posizione alla rete sono gestiti dal dispositivo." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Jak często Twój telefon będzie wysyłał swoją lokalizację do urządzenia, aktualizacje lokalizacji w sieci są zarządzane przez urządzenie." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Com que frequência seu telefone enviará sua localização para o dispositivo, as atualizações de localização no mesh são geridas pelo dispositivo." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22762,17 +24175,17 @@ "state" : "translated", "value" : "电台通过手机获取定位的时间间隔,但是向 Mesh 网络中发送定位的时间间隔由电台控制。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電台通過手機獲得定位的時間間隔,但是向 Mesh 網路中更新定位的時間間隔由電台控制。" - } } } }, "Pin %lld" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin %lld" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22783,6 +24196,12 @@ }, "Pin A" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin A" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22793,6 +24212,12 @@ }, "Pin B" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin B" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22809,6 +24234,12 @@ "value" : "PKI-basierte Knotenadministration, benötigt Firmware Version 2.5+" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amministrazione dei nodi basata su PKI, richiede la versione firmware 2.5+" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22825,6 +24256,12 @@ }, "Please connect to a radio to configure settings." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Collegarsi a una radio per configurare le impostazioni." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22840,7 +24277,6 @@ } }, "Please set a region" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -22848,6 +24284,12 @@ "value" : "Please set a region" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impostare una regione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22858,6 +24300,12 @@ }, "Points of Interest" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Punti di interesse" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22892,18 +24340,18 @@ "value" : "מיקום" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Pozycja" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Posição" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22921,17 +24369,17 @@ "state" : "translated", "value" : "定位" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "定位" - } } } }, "Position Exchange Failed" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scambio di posizioni non riuscito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22942,6 +24390,12 @@ }, "Position Exchange Requested" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scambio di posizioni richiesto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22952,6 +24406,12 @@ }, "Position Flags" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bandiere di posizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22962,6 +24422,12 @@ }, "Position Log" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diario di posizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22972,6 +24438,12 @@ }, "Position Log %lld Points" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione Log %lld Punti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22982,6 +24454,12 @@ }, "Position Packet" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pacchetto posizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22998,6 +24476,12 @@ "value" : "Position gesendet" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione inviata" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23032,18 +24516,18 @@ "value" : "הגדרות מיקום" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della posizione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja pozycji" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de Posição" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -23061,17 +24545,10 @@ "state" : "translated", "value" : "定位配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "定位設定" - } } } }, "position.precision %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -23085,10 +24562,10 @@ "value" : "Within %@" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Dentro de %@" + "value" : "Entro il %@" } }, "se" : { @@ -23107,6 +24584,12 @@ }, "Positions Enabled" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizioni abilitate" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23123,6 +24606,12 @@ }, "Positions will be provided by your device GPS, if you select disabled or not present you can set a fixed position." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le posizioni saranno fornite dal GPS del dispositivo; se si seleziona disabilitato o non presente, è possibile impostare una posizione fissa." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23139,6 +24628,12 @@ }, "Power" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Potenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23149,6 +24644,12 @@ }, "Power Metrics" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metriche di potenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23159,6 +24660,12 @@ }, "Power Metrics Log" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro delle metriche di potenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23169,6 +24676,12 @@ }, "Power Metrics Log}" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro delle metriche di potenza}" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23179,6 +24692,12 @@ }, "Power Off" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spegnimento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23189,6 +24708,12 @@ }, "Power Options" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni di alimentazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23199,6 +24724,12 @@ }, "Power Screen" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schermo di alimentazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23208,7 +24739,6 @@ } }, "power.metrics.delete" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -23216,6 +24746,12 @@ "value" : "Delete all power metrics?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare tutte le metriche di potenza?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23225,7 +24761,6 @@ } }, "power.metrics.log" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -23233,6 +24768,12 @@ "value" : "Power Metrics Log" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro delle metriche di potenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23249,6 +24790,12 @@ "value" : "Angeschaltet" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Potenziato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23265,6 +24812,12 @@ "value" : "Genaue Position" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione precisa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23274,7 +24827,6 @@ } }, "preferred.radio" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -23300,18 +24852,18 @@ "value" : "רדיו מועדף" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radio preferita" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Preferowane radio" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rádio Preferido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -23329,17 +24881,17 @@ "state" : "translated", "value" : "默认电台" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "首選電台" - } } } }, "Presets" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preimpostazioni" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23356,6 +24908,12 @@ }, "Press Pin" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin a pressione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23365,10 +24923,23 @@ } }, "Pressure" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pressione" + } + } + } }, "Primary" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Primario" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23385,6 +24956,12 @@ "value" : "Erster Admin-Schlüssel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave amministrativa primaria" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23401,6 +24978,12 @@ }, "Primary GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "GPIO primario" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23417,6 +25000,12 @@ "value" : "Privater Schlüssel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave privata" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23433,6 +25022,12 @@ }, "Project information" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Informazioni sul progetto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23455,6 +25050,12 @@ "value" : "Öffentlicher Schlüssel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave pubblica" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23471,6 +25072,12 @@ }, "Public Key Encryption" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crittografia a chiave pubblica" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23487,6 +25094,12 @@ }, "Public Key Mismatch" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mancata corrispondenza della chiave pubblica" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23503,6 +25116,12 @@ }, "PWD" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "DIPARTIMENTO DELLA DIFESA" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23512,11 +25131,23 @@ } }, "Radiation" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radiazioni" + } + } + } }, "Radio Disconnected" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radio scollegata" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23551,18 +25182,18 @@ "value" : "הגדרות רדיו" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione radio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja radia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de Rádio" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -23580,17 +25211,10 @@ "state" : "translated", "value" : "电台配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電台設定" - } } } }, "Random PIN" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -23616,18 +25240,18 @@ "value" : "קוד אקראי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "PIN casuale" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Losowy PIN" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "PIN Aleatório" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -23645,12 +25269,6 @@ "state" : "translated", "value" : "随机 PIN 码" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "隨機 PIN 碼" - } } } }, @@ -23680,18 +25298,18 @@ "value" : "בדיקת טווח" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Test della gamma" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Test zasięgu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Teste de Alcance" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -23709,17 +25327,10 @@ "state" : "translated", "value" : "拉距测试" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "拉距測試" - } } } }, "range.test.blocked" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -23745,18 +25356,18 @@ "value" : "חסום בדיקות טווח" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Test di portata del blocco" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Block Range Test" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bloquear Teste de Alcance" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -23774,12 +25385,6 @@ "state" : "translated", "value" : "区块范围测试" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "區塊範圍測試" - } } } }, @@ -23809,18 +25414,18 @@ "value" : "הגדרות בדיקת טווח" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del test di portata" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja testu zasięgu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do teste de Alcance" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -23838,12 +25443,6 @@ "state" : "translated", "value" : "拉距测试配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "拉距測試設定" - } } } }, @@ -23873,18 +25472,18 @@ "value" : "התחל מחדש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riavvio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Uruchom ponownie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reiniciar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -23902,12 +25501,6 @@ "state" : "translated", "value" : "重启" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "重新啟動" - } } } }, @@ -23919,6 +25512,12 @@ "value" : "Knoten neustarten?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riavviare il nodo?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23953,18 +25552,18 @@ "value" : "התחל מכשיר מחדש??" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riavviare il nodo?" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Uruchomić ponownie węzeł?" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reiniciar nó?" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -23982,17 +25581,17 @@ "state" : "translated", "value" : "重启节点?" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "重啟中繼點" - } } } }, "Rebroadcast Mode" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modalità di ritrasmissione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24009,6 +25608,12 @@ }, "Receive data (rxd) GPIO pin" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dati di ricezione (rxd) Pin GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24043,18 +25648,18 @@ "value" : "התקבל אישור מסירה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ricevuto Ack" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano potwierdzenie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ack Recebido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -24072,12 +25677,6 @@ "state" : "translated", "value" : "收到确认" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到確認" - } } } }, @@ -24107,18 +25706,18 @@ "value" : "התקבל אישור מסירה מהנמען" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Destinatario Ack" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odbiorca potwierdzenia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ack do Destinário" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -24136,12 +25735,6 @@ "state" : "translated", "value" : "收件人确认" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收件人確認" - } } } }, @@ -24153,6 +25746,12 @@ "value" : "Route aufzeichnen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Percorso di registrazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24163,6 +25762,12 @@ }, "Refresh device metadata" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornare i metadati del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24179,6 +25784,12 @@ "value" : "Region" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Regione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24194,7 +25805,6 @@ } }, "relativetimeofday.afternoon" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -24208,10 +25818,10 @@ "value" : "Afternoon" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Tarde" + "value" : "Pomeriggio" } }, "sr" : { @@ -24223,7 +25833,6 @@ } }, "relativetimeofday.evening" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -24237,10 +25846,10 @@ "value" : "Evening" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Noite" + "value" : "Sera" } }, "sr" : { @@ -24252,7 +25861,6 @@ } }, "relativetimeofday.midday" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -24266,10 +25874,10 @@ "value" : "Midday" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Meio-dia" + "value" : "Mezzogiorno" } }, "sr" : { @@ -24281,7 +25889,6 @@ } }, "relativetimeofday.morning" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -24295,10 +25902,10 @@ "value" : "Morning" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Manhã" + "value" : "Mattina" } }, "sr" : { @@ -24310,7 +25917,6 @@ } }, "relativetimeofday.nighttime" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -24324,10 +25930,10 @@ "value" : "Nighttime" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Noite" + "value" : "Notte" } }, "sr" : { @@ -24340,6 +25946,12 @@ }, "Release Notes" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Note di rilascio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24350,6 +25962,12 @@ }, "Remote administration for: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amministrazione remota per: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24360,6 +25978,12 @@ }, "Remote Legacy Admin: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amministratore legacy remoto: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24370,6 +25994,12 @@ }, "Remote PKI Admin: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amministratore PKI remoto: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24386,6 +26016,12 @@ "value" : "Entfernen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rimuovere" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24402,6 +26038,12 @@ "value" : "Von Favoriten entfernen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rimuovi dai preferiti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24412,6 +26054,12 @@ }, "Remove from ignored" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rimuovere da ignorato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24428,6 +26076,12 @@ }, "Replace Channels" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sostituire i canali" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24462,18 +26116,18 @@ "value" : "תגובה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Risposta" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odpowiedz" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Responder" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -24491,17 +26145,17 @@ "state" : "translated", "value" : "回复" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "回復" - } } } }, "Request Legacy Admin: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Richiesta amministratore legacy: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24512,6 +26166,12 @@ }, "Request PKI Admin: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Richiesta PKI Admin: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24522,6 +26182,12 @@ }, "Requires that there be an accelerometer on your device." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Richiede la presenza di un accelerometro sul dispositivo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24538,6 +26204,12 @@ "value" : "App-Einstellungen zurücksetzen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ripristino delle impostazioni dell'app" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24560,6 +26232,12 @@ "value" : "Knotendatenbank zurücksetzen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Azzeramento di NodeDB" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24576,6 +26254,12 @@ "value" : "Neustarten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riavvio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24592,6 +26276,12 @@ "value" : "Verbundenen Knoten neustarten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riavviare al nodo a cui si è collegati" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24600,6 +26290,28 @@ } } }, + "restore" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wiederherstellen" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "ripristinare" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Обнова" + } + } + } + }, "resume" : { "localizations" : { "de" : { @@ -24626,18 +26338,18 @@ "value" : "החל מחדש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il curriculum" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Resume" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -24655,12 +26367,6 @@ "state" : "translated", "value" : "恢复" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "恢復" - } } } }, @@ -24672,6 +26378,12 @@ "value" : "App bewerten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esaminare l'applicazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24712,18 +26424,18 @@ "value" : "רינגטון" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suoneria" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dzwonek" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toque" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -24741,17 +26453,10 @@ "state" : "translated", "value" : "铃声" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "鈴聲" - } } } }, "ringtone.config" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -24777,18 +26482,18 @@ "value" : "הגדרות רינגטון" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della suoneria" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja dzwonka" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de Toque" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -24806,12 +26511,6 @@ "state" : "translated", "value" : "铃声设置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "鈴聲設定" - } } } }, @@ -24823,6 +26522,12 @@ "value" : "Rolle" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ruolo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24839,6 +26544,12 @@ "value" : "Rolle: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ruolo: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24855,6 +26566,12 @@ "value" : "Rollen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ruoli" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24865,6 +26582,12 @@ }, "Root Topic" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Argomento radice" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24875,6 +26598,12 @@ }, "Rotary 1" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rotary 1" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24891,6 +26620,12 @@ }, "Route Back: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Percorso di ritorno: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24901,6 +26636,12 @@ }, "Route Lines" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Linee di percorso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24911,6 +26652,12 @@ }, "Route Recorder" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registratore di percorso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24921,6 +26668,12 @@ }, "Route recording paused" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registrazione del percorso in pausa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24937,6 +26690,12 @@ "value" : "Route: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Percorso: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24945,8 +26704,46 @@ } } }, + "Router" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Рутер" + } + } + } + }, + "Router Options" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni del router" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Опције рутера" + } + } + } + }, "Routes" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Percorsi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24956,7 +26753,6 @@ } }, "routes.activitytype.biking" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -24970,10 +26766,10 @@ "value" : "Biking" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Passeio de Bicicleta" + "value" : "In bicicletta" } }, "sr" : { @@ -24991,7 +26787,6 @@ } }, "routes.activitytype.driving" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25005,10 +26800,10 @@ "value" : "Driving" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Conduzir" + "value" : "Guida" } }, "sr" : { @@ -25026,7 +26821,6 @@ } }, "routes.activitytype.filename.biking" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25040,10 +26834,10 @@ "value" : "bike tour" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Passeio de Bicicleta" + "value" : "tour in bicicletta" } }, "sr" : { @@ -25061,7 +26855,6 @@ } }, "routes.activitytype.filename.driving" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25075,10 +26868,10 @@ "value" : "drive" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Conduzir" + "value" : "guida" } }, "sr" : { @@ -25096,7 +26889,6 @@ } }, "routes.activitytype.filename.hiking" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25110,10 +26902,10 @@ "value" : "hike" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Caminhar na Montanha" + "value" : "escursione" } }, "sr" : { @@ -25131,7 +26923,6 @@ } }, "routes.activitytype.filename.overlanding" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -25139,10 +26930,10 @@ "value" : "overland drive" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Caminhar overland" + "value" : "overland drive" } }, "sr" : { @@ -25160,7 +26951,6 @@ } }, "routes.activitytype.filename.skiing" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25174,10 +26964,10 @@ "value" : "ski tour" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Passeio de esqui" + "value" : "tour sciistico" } }, "sr" : { @@ -25195,7 +26985,6 @@ } }, "routes.activitytype.filename.walking" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25209,10 +26998,10 @@ "value" : "walk" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Caminhar" + "value" : "passeggiata" } }, "sr" : { @@ -25230,7 +27019,6 @@ } }, "routes.activitytype.hiking" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25244,10 +27032,10 @@ "value" : "Hiking" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Caminhada na Montanha" + "value" : "Escursioni" } }, "sr" : { @@ -25265,7 +27053,6 @@ } }, "routes.activitytype.overlanding" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -25273,7 +27060,7 @@ "value" : "Overlanding" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "Overlanding" @@ -25294,7 +27081,6 @@ } }, "routes.activitytype.skiing" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25308,10 +27094,10 @@ "value" : "Skiing" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Esqui" + "value" : "Sci" } }, "sr" : { @@ -25329,7 +27115,6 @@ } }, "routes.activitytype.walking" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25343,10 +27128,10 @@ "value" : "Walking" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Caminhada" + "value" : "Camminare" } }, "sr" : { @@ -25364,7 +27149,6 @@ } }, "routing.acknowledged" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25390,18 +27174,18 @@ "value" : "מאשר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riconosciuto" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Potwierdzono" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reconhecido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -25419,17 +27203,10 @@ "state" : "translated", "value" : "确认" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "確認" - } } } }, "routing.badRequest" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25455,18 +27232,18 @@ "value" : "בקשה לא תקינה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Richiesta negativa" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Złe żądanie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pedido Ruim" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -25484,17 +27261,10 @@ "state" : "translated", "value" : "错误请求" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "錯誤請求" - } } } }, "routing.dutycyclelimit" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25520,18 +27290,18 @@ "value" : "הגיע למקסימום שימוש אזורי לשעה זו" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Raggiunto il limite del ciclo di lavoro regionale" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Osiągnięto regionalny limit cyklu pracy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "O limite do Regional Duty Cycle foi abrangido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -25549,17 +27319,10 @@ "state" : "translated", "value" : "已达到当前区域循环周期发射上限" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "已達到頻道占用循環週期發射上限" - } } } }, "routing.gotnak" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25585,18 +27348,18 @@ "value" : "התקבל אישור מסירה שלילי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ricevuto un riscontro negativo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano negatywne potwierdzenie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Recebido um reconhecimento negativo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -25614,17 +27377,10 @@ "state" : "translated", "value" : "收到否认" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到否認" - } } } }, "routing.maxretransmit" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25650,18 +27406,18 @@ "value" : "הגיע למקסימום השליחות מדש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Raggiunta la massima ritrasmissione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Osiągnięto limit retransmisji" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Máximo de Retransmissão Alcançado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -25679,17 +27435,10 @@ "state" : "translated", "value" : "已达到最大重试次数" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "已達到最大重試次數" - } } } }, "routing.nochannel" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25715,18 +27464,18 @@ "value" : "אין ערוץ" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun canale" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak kanału" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem Canal" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -25744,17 +27493,10 @@ "state" : "translated", "value" : "没有频道" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "没有頻道" - } } } }, "routing.nointerface" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25780,18 +27522,18 @@ "value" : "אין ממשק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuna interfaccia" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak interfejsu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem Interface" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -25809,17 +27551,10 @@ "state" : "translated", "value" : "无连接" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "無連接" - } } } }, "routing.noresponse" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25845,18 +27580,18 @@ "value" : "אין תגובה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuna risposta" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak odpowiedzi" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem Resposta" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -25874,17 +27609,10 @@ "state" : "translated", "value" : "无响应" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "無回應" - } } } }, "routing.noroute" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25910,18 +27638,18 @@ "value" : "אין מסלול" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun percorso" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak trasy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem Rota" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -25939,17 +27667,10 @@ "state" : "translated", "value" : "找不到目标" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "找不到目標" - } } } }, "routing.notauthorized" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25975,18 +27696,18 @@ "value" : "לא מאושר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non autorizzato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Nieautoryzowany" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Não Autorizado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26004,17 +27725,10 @@ "state" : "translated", "value" : "未授权" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "未授權" - } } } }, "routing.pkifailed" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -26028,6 +27742,12 @@ "value" : "Encrypted Send Failed" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invio crittografato fallito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26037,7 +27757,6 @@ } }, "routing.pkiunknownpubkey" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -26051,6 +27770,12 @@ "value" : "Unknown Public Key" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave pubblica sconosciuta" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26066,7 +27791,6 @@ } }, "routing.timeout" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -26092,18 +27816,18 @@ "value" : "נגמר הזמן" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Timeout" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Limit czasu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tempo Esgotado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26121,17 +27845,10 @@ "state" : "translated", "value" : "超时" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "逾時" - } } } }, "routing.toolarge" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -26157,18 +27874,18 @@ "value" : "ההודעה ארוכה/גדולה מידי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il pacchetto è troppo grande" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Pakiet jest zbyt duży" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "O pacote é grande de mais" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26186,17 +27903,17 @@ "state" : "translated", "value" : "数据包过大" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "數據包過大" - } } } }, "RSSI %@ dBm" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "RSSI %@ dBm" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26207,6 +27924,12 @@ }, "RSSI %ddB" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "RSSI %ddB" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26217,6 +27940,12 @@ }, "RSSI %llddB" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "RSSI %llddB" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26226,7 +27955,6 @@ } }, "Russia" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -26234,6 +27962,12 @@ "value" : "Russia" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Russia" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26244,6 +27978,12 @@ }, "RX Boosted Gain" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Guadagno potenziato RX" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26253,7 +27993,6 @@ } }, "satellite" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -26279,18 +28018,18 @@ "value" : "לווין" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Satellite" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Satelita" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Satéllite" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26308,17 +28047,10 @@ "state" : "translated", "value" : "卫星" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "衛星" - } } } }, "satellite.flyover" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -26344,18 +28076,18 @@ "value" : "לווין בשמיים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sorvolo satellitare" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Przelot satelity" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passagem de Satélite" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26373,12 +28105,6 @@ "state" : "translated", "value" : "卫星视图" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "衛星識圖" - } } } }, @@ -26390,6 +28116,12 @@ "value" : "Satelliten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sats" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26406,6 +28138,12 @@ "value" : "Satelliten Schätzung %lld" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stima Sats %lld" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26422,6 +28160,12 @@ "value" : "Satelliten in Sicht: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Saturazione in vista: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26456,18 +28200,18 @@ "value" : "שמור" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Risparmiare" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zapisz" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Salvar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26485,12 +28229,6 @@ "state" : "translated", "value" : "保存" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "儲存" - } } } }, @@ -26502,6 +28240,12 @@ "value" : "Speichern" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Risparmiare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26512,6 +28256,12 @@ }, "Save Channel Settings" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Salvare le impostazioni del canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26528,6 +28278,12 @@ "value" : "Benutzerkonfiguration nach %@ speichern?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Salvare la configurazione utente in %@?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26543,7 +28299,6 @@ } }, "save.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -26569,18 +28324,18 @@ "value" : "שמור הגדרות עבור %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Salva la configurazione per %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zapisz konfigurację dla %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Salvar a Configuração para %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26598,17 +28353,17 @@ "state" : "translated", "value" : "保存%@的配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "儲存%@的設定" - } } } }, "Saves a CSV with the range test message details, currently only available on ESP32 devices with a web server." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Salva un CSV con i dettagli del messaggio di test di portata, attualmente disponibile solo sui dispositivi ESP32 con un server web." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26625,6 +28380,12 @@ }, "Screen on for" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schermo acceso per" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26641,6 +28402,12 @@ "value" : "Suchen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ricerca" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26651,6 +28418,12 @@ }, "Second" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Secondo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26661,6 +28434,12 @@ }, "Secondary" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Secondario" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26677,6 +28456,12 @@ "value" : "Zweiter Admin-Schlüssel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave amministrativa secondaria" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26699,6 +28484,12 @@ "value" : "Sicherheit" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sicurezza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26721,6 +28512,12 @@ "value" : "Sicherheitskonfiguration" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della sicurezza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26743,6 +28540,12 @@ "value" : "Sicherheitskonfigurationseinstellungen erfordern eine Firmware mit Version 2.5 oder höher" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le impostazioni di configurazione della sicurezza richiedono una versione del firmware 2.5+" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26765,6 +28568,12 @@ "value" : "Kanal wählen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare un canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26775,6 +28584,12 @@ }, "Select a conversation" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare una conversazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26785,6 +28600,12 @@ }, "Select a conversation type" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare un tipo di conversazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26795,6 +28616,12 @@ }, "Select a Trace Route" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare un percorso di tracciamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26805,6 +28632,12 @@ }, "Select Channel" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare il canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26814,7 +28647,6 @@ } }, "select.contact" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -26840,18 +28672,18 @@ "value" : "בחר איש קשר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare un contatto" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wybierz kontakt" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleciona a Contacto" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26869,12 +28701,6 @@ "state" : "translated", "value" : "选择一名联系人" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "選擇聯絡人" - } } } }, @@ -26904,18 +28730,18 @@ "value" : "בחר מכשיר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare un nodo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wybierz węzeł" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleciona a Nó" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26933,12 +28759,6 @@ "state" : "translated", "value" : "选择一个节点" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "選擇中繼點" - } } } }, @@ -26950,6 +28770,12 @@ "value" : "Senden" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26966,6 +28792,12 @@ "value" : "Sende ${messageContent} an ${channelNumber}" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invia ${messaggioContenuto} a ${canaleNumero}" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26976,6 +28808,12 @@ }, "Send ${messageContent} to ${nodeNumber}" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invia ${messaggioContenuto} a ${nodoNumero}" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26986,6 +28824,12 @@ }, "Send a Direct Message" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare un messaggio diretto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27002,6 +28846,12 @@ "value" : "Gruppennachricht senden" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare un messaggio di gruppo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27011,10 +28861,23 @@ } }, "Send a heartbeat to advertise the server's presence." : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invia un heartbeat per pubblicizzare la presenza del server." + } + } + } }, "Send a message to a certain meshtastic channel" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare un messaggio a un certo canale meshtastic" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27025,6 +28888,12 @@ }, "Send a message to a certain meshtastic node" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare un messaggio a un certo nodo meshtastico" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27035,6 +28904,12 @@ }, "Send a position on the primary channel when the user button is triple clicked." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invia una posizione sul canale primario quando si fa triplo clic sul pulsante utente." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27057,6 +28932,12 @@ "value" : "Herunterfahren an verbundenen Knoten senden" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare uno spegnimento al nodo a cui si è connessi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27073,6 +28954,12 @@ "value" : "Wegpunkt senden" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare un waypoint" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27083,6 +28970,12 @@ }, "Send ASCII bell with alert message. Useful for triggering external notification on bell." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invia una campana ASCII con un messaggio di avviso. Utile per attivare una notifica esterna sul campanello." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27105,6 +28998,12 @@ "value" : "Sende Glocke" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invia la campana" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27121,6 +29020,12 @@ }, "Send Reboot OTA" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare il riavvio OTA" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27137,6 +29042,12 @@ }, "Sender Interval" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo del mittente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27153,6 +29064,12 @@ }, "Sensor Metrics" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metriche dei sensori" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27169,6 +29086,12 @@ }, "Sensor options" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni del sensore" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27179,6 +29102,12 @@ }, "Sensor Options" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni del sensore" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27195,6 +29124,12 @@ "value" : "Wird an andere Knoten im Netz gesendet, damit diese einen gemeinsamen geheimen Schlüssel berechnen können." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato agli altri nodi della rete per consentire loro di calcolare una chiave segreta condivisa." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27211,6 +29146,12 @@ "value" : "Sequenznummer" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Numero di sequenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27227,6 +29168,12 @@ "value" : "Sequenz: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sequenza: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27261,18 +29208,18 @@ "value" : "סיריאלי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seriale" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Seryjny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Serial" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -27290,12 +29237,6 @@ "state" : "translated", "value" : "串口" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "串口" - } } } }, @@ -27307,6 +29248,12 @@ "value" : "Serielle Konsole" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Console seriale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27323,6 +29270,12 @@ "value" : "Serielle Konsole über die Stream-API." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Console seriale tramite l'API Stream." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27357,18 +29310,18 @@ "value" : "'הגדרות מודולה 'סיריאלי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione seriale" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja seryjna" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração Serial" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -27386,17 +29339,10 @@ "state" : "translated", "value" : "串口配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "串口設定" - } } } }, "serial.mode.default" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -27422,18 +29368,18 @@ "value" : "ברירת מחדל" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predefinito" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Domyślny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Padrão" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -27451,17 +29397,10 @@ "state" : "translated", "value" : "默认" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "預設" - } } } }, "serial.mode.nmea" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -27487,18 +29426,18 @@ "value" : "מיקומי NMEA" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizioni NMEA" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Pozycje NMEA" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Posições NMEA" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -27516,17 +29455,10 @@ "state" : "translated", "value" : "NMEA 位置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "NMEA 位置" - } } } }, "serial.mode.proto" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -27552,18 +29484,18 @@ "value" : "Protobufs" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Protobufs" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Protobufy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Protobufs" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -27581,17 +29513,10 @@ "state" : "translated", "value" : "Protobufs" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Protobufs" - } } } }, "serial.mode.simple" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -27617,18 +29542,18 @@ "value" : "פשוט" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Semplice" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Prosty" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Simples" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -27646,17 +29571,10 @@ "state" : "translated", "value" : "简单" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "簡單" - } } } }, "serial.mode.txtmsg" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -27682,18 +29600,18 @@ "value" : "הודעת טקסט" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio di testo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wiadomość tekstowa" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagem de Texto" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -27711,17 +29629,17 @@ "state" : "translated", "value" : "文本消息" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "文本訊息" - } } } }, "Series" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serie" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27738,6 +29656,12 @@ "value" : "Server" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Server" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27754,6 +29678,12 @@ "value" : "Serveradresse" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indirizzo del server" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27763,10 +29693,23 @@ } }, "Server Option" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzione server" + } + } + } }, "Set" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Set" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27777,6 +29720,12 @@ }, "Set the GPIO pins for RXD and TXD." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impostare i pin GPIO per RXD e TXD." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27811,18 +29760,18 @@ "value" : "בחר אזור לורה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impostare la regione LoRa" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Ustaw region LoRa" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleciona o Região da LoRa" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -27840,17 +29789,17 @@ "state" : "translated", "value" : "设置 LoRa 区域" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "設定 LoRa 區域" - } } } }, "Sets the maximum number of hops, default is 3. Increasing hops also increases congestion and should be used carefully. O hop broadcast messages will not get ACKs." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Imposta il numero massimo di hop, l'impostazione predefinita è 3. L'aumento degli hop aumenta anche la congestione e deve essere usato con attenzione. I messaggi di broadcasting a un hop non riceveranno ACK." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27885,18 +29834,18 @@ "value" : "הגדרות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impostazioni" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Ustawienia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Definições" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -27914,17 +29863,18 @@ "state" : "translated", "value" : "设置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "設定" - } } } }, "Settings" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impostazioni" + } + } + } }, "Share QR Code & Link" : { "localizations" : { @@ -27934,6 +29884,12 @@ "value" : "QR Code & Link teilen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Condividi il codice QR e il link" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27968,18 +29924,18 @@ "value" : "שתף ערוצים באמצעות קוד QR" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Condividi il codice QR" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Udostępnij kod QR kanałów" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Partilhar o Código do QR" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -27997,17 +29953,10 @@ "state" : "translated", "value" : "分享频道二维码" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "分享頻道QRcode" - } } } }, "share.position" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -28033,18 +29982,18 @@ "value" : "שתף מיקום" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Condividi Posizione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Udostępnij pozycję" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Partilhar o Posição" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28062,12 +30011,6 @@ "state" : "translated", "value" : "分享位置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "分享位置" - } } } }, @@ -28079,6 +30022,12 @@ "value" : "Gemeinsamer Schlüssel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave condivisa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28095,6 +30044,12 @@ "value" : "Kurzname" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome breve" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28117,6 +30072,12 @@ "value" : "Kurzname: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome breve: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28132,7 +30093,6 @@ } }, "short.range.fast" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -28140,6 +30100,12 @@ "value" : "Short Range - Fast" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corto raggio - Veloce" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28149,7 +30115,6 @@ } }, "short.range.slow" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -28157,6 +30122,12 @@ "value" : "Short Range - Slow" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corto raggio - Lento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28166,7 +30137,6 @@ } }, "short.range.turbo" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -28174,6 +30144,12 @@ "value" : "Short Range - Turbo" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corto raggio - Turbo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28190,6 +30166,12 @@ "value" : "Zeige Alarme" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra avvisi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28206,6 +30188,12 @@ "value" : "Zeige Alarme" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra avvisi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28222,6 +30210,12 @@ "value" : "Zeige Knoten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra i nodi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28238,6 +30232,12 @@ "value" : "Zeige auf dem Gerätebildschirm" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra sullo schermo del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28254,6 +30254,12 @@ "value" : "Zeige auf der Netzwerkkarte." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra sulla mappa della mesh." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28270,6 +30276,12 @@ "value" : "Zeige Wegpunkte" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra waypoint " + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28279,7 +30291,14 @@ } }, "Shows information for the Lora radio connected via bluetooth. You can swipe left to disconnect the radio and long press start the live activity." : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra le informazioni relative alla radio Lora collegata via bluetooth. È possibile scorrere il dito verso sinistra per scollegare la radio e premere a lungo per avviare l'attività live." + } + } + } }, "Shut Down" : { "localizations" : { @@ -28289,6 +30308,12 @@ "value" : "Herunterfahren" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spegnimento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28305,6 +30330,12 @@ "value" : "Knoten herunterfahren?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spegnere il nodo?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28321,6 +30352,12 @@ "value" : "Knoten herunterfahren?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arresto del nodo?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28331,6 +30368,12 @@ }, "Signal %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Segnale %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28340,7 +30383,6 @@ } }, "Singapore 923mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -28348,6 +30390,12 @@ "value" : "Singapore 923MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Singapore 923MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28358,6 +30406,12 @@ }, "Smart Position" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione intelligente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28368,6 +30422,12 @@ }, "SNR" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "SNR" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28378,6 +30438,12 @@ }, "SNR %@ dB" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "SNR %@ dB" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28388,6 +30454,12 @@ }, "SNR %@dB" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "SNR %@dB" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28397,13 +30469,33 @@ } }, "Soil Moisture" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Umidità del suolo" + } + } + } }, "Soil Temp" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Temperatura del suolo" + } + } + } }, "Specifies how long the monitored GPIO should output." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Specifica la durata dell'uscita del GPIO monitorato." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28420,6 +30512,12 @@ "value" : "Geschwindigkeit" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velocità" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28436,6 +30534,12 @@ "value" : "Geschwindigkeit %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velocità %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28452,6 +30556,12 @@ "value" : "Geschwindigkeit: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velocità: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28462,6 +30572,12 @@ }, "Spread Factor" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fattore di diffusione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28496,13 +30612,13 @@ "value" : "שם רשת וויפי" } }, - "pl" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "SSID" } }, - "pt-PT" : { + "pl" : { "stringUnit" : { "state" : "translated", "value" : "SSID" @@ -28525,17 +30641,10 @@ "state" : "translated", "value" : "SSID" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "SSID" - } } } }, "standard" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28561,18 +30670,18 @@ "value" : "סטנדרטי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Standard" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Standardowy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Padrão" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28590,17 +30699,10 @@ "state" : "translated", "value" : "标准" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "標準" - } } } }, "standard.muted" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28626,18 +30728,18 @@ "value" : "סטנדרתי-השתק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Standard Silenzioso" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Standardowy wyłączony" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Padrão Silenciado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28655,12 +30757,6 @@ "state" : "translated", "value" : "标准静音" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "標準靜音" - } } } }, @@ -28690,18 +30786,18 @@ "value" : "החל" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inizio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Start" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Iniciar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28719,17 +30815,17 @@ "state" : "translated", "value" : "开始" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "開始" - } } } }, "State Broadcast Interval" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stato Intervallo di trasmissione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28740,6 +30836,12 @@ }, "Store & Forward" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Memorizzare e inoltrare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28756,6 +30858,12 @@ }, "Store & Forward Config" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione Store & Forward" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28770,8 +30878,53 @@ } } }, + "Store and forward clients can request history from routers on the network." : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I client Store and forward possono richiedere la cronologia ai router della rete." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Клијенти за складиштење и прослеђивање могу затражити историју од рутера на мрежи." + } + } + } + }, + "Store and forward router devices require a ESP32 device with PSRAM." : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I dispositivi router Store and Forward richiedono un dispositivo ESP32 con PSRAM." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Рутер за складиштење и прослеђивање захтева ESP32 уређај са PSRAM." + } + } + } + }, "Store and forward servers require an ESP32 device with PSRAM or Linux Native." : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Store and forward servers require an ESP32 device with PSRAM or Linux Native." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I server Store and Forward richiedono un dispositivo ESP32 con PSRAM o Linux Native." + } + } + } }, "storeforward.heartbeat" : { "localizations" : { @@ -28799,18 +30952,18 @@ "value" : "שלח דופק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare il battito cardiaco" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Send Heartbeat" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enviar Batimento Cardíaco" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28828,12 +30981,6 @@ "state" : "translated", "value" : "发送心跳包" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "發送心跳包" - } } } }, @@ -28845,6 +30992,12 @@ "value" : "מחובר למש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abbonati" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28861,6 +31014,12 @@ "value" : "Unterstützt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supportato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28871,6 +31030,12 @@ }, "Supported I2C Connected sensors will be detected automatically, sensors are BMP280, BME280, BME680, MCP9808, INA219, INA260, LPS22 and SHTC3." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I sensori I2C supportati vengono rilevati automaticamente: BMP280, BME280, BME680, MCP9808, INA219, INA260, LPS22 e SHTC3." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28887,6 +31052,12 @@ }, "Table" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tabella" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28896,7 +31067,6 @@ } }, "Taiwan" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -28904,6 +31074,12 @@ "value" : "Taiwan" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Taiwan" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28914,6 +31090,12 @@ }, "Takes a Meshtastic channel URL and saves the channel settings." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prende l'URL di un canale Meshtastic e salva le impostazioni del canale." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28948,18 +31130,18 @@ "value" : "תגובה מהירה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Risposta di Tapback" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odpowiedź na stuknięcie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Resposta Tapback" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28977,17 +31159,10 @@ "state" : "translated", "value" : "响应" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "響應" - } } } }, "tapback.exclamation" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -29013,18 +31188,18 @@ "value" : "סימן קריאה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Punto esclamativo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wykrzyknik" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ponto de Exclamação" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29042,17 +31217,10 @@ "state" : "translated", "value" : "感叹号" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "驚嘆號" - } } } }, "tapback.haha" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -29078,13 +31246,13 @@ "value" : "חחח" } }, - "pl" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "HaHa" } }, - "pt-PT" : { + "pl" : { "stringUnit" : { "state" : "translated", "value" : "HaHa" @@ -29107,17 +31275,10 @@ "state" : "translated", "value" : "哈哈" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "哈哈" - } } } }, "tapback.heart" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -29143,18 +31304,18 @@ "value" : "לב" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cuore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Serce" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Coração" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29172,17 +31333,10 @@ "state" : "translated", "value" : "心" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "心" - } } } }, "tapback.poop" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -29208,18 +31362,18 @@ "value" : "חרא" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cacca" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Kupa" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cocó" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29237,17 +31391,10 @@ "state" : "translated", "value" : "便便" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "便便" - } } } }, "tapback.question" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -29273,18 +31420,18 @@ "value" : "סימן שאלה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Punto interrogativo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Znak zapytania" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ponto de Interrogação" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29302,17 +31449,10 @@ "state" : "translated", "value" : "问号" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "問號" - } } } }, "tapback.thumbsdown" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -29338,18 +31478,18 @@ "value" : "אגודל למטה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pollici in giù" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Kciuk w dół" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Polegar para Baixo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29367,17 +31507,10 @@ "state" : "translated", "value" : "倒大拇指" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "倒大拇指" - } } } }, "tapback.thumbsup" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -29403,18 +31536,18 @@ "value" : "אגודל למעלה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pollici in su" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Kciuk w górę" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Polegar para Cima" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29432,17 +31565,10 @@ "state" : "translated", "value" : "竖大拇指" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "豎大拇指" - } } } }, "tapback.wave" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -29468,18 +31594,18 @@ "value" : "Wave" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Onda" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wave" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adeus" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29497,17 +31623,10 @@ "state" : "translated", "value" : "Wave" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "招手" - } } } }, "telementry.hazardous" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -29515,6 +31634,12 @@ "value" : "Hazardous" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pericoloso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29524,7 +31649,6 @@ } }, "telementry.unhealthy" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -29532,6 +31656,12 @@ "value" : "Unhealthy" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non sano" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29541,7 +31671,6 @@ } }, "telementry.veryUnhealthy" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -29549,6 +31678,12 @@ "value" : "Very Unhealthy" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Molto malsano" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29583,18 +31718,18 @@ "value" : "טלמטריה (חיישנים)" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telemetria (sensori)" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Telemetria (czujniki)" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetria (Sensores)" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29612,12 +31747,6 @@ "state" : "translated", "value" : "遥测(传感器)" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "遠測(傳感器)" - } } } }, @@ -29647,18 +31776,18 @@ "value" : "הגדרות טלמטריה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della telemetria" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja telemetrii" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração Telemetria" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29676,17 +31805,10 @@ "state" : "translated", "value" : "遥测配置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "遠側設定" - } } } }, "telemetry.good" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -29694,6 +31816,12 @@ "value" : "Good" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buono" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29703,7 +31831,6 @@ } }, "telemetry.moderate" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -29711,6 +31838,12 @@ "value" : "Moderate" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Moderato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29726,7 +31859,6 @@ } }, "telemetry.sensitive" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -29734,6 +31866,12 @@ "value" : "Unhealthy for Sensitive Groups" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insalubre per i gruppi sensibili" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29750,6 +31888,12 @@ "value" : "Temp" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Temp" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29766,6 +31910,12 @@ "value" : "Temperatur" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Temperatura" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29782,6 +31932,12 @@ "value" : "Zehn Minuten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dieci minuti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29798,6 +31954,12 @@ "value" : "Dritter Admin-Schlüssel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave amministrativa terziaria" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29813,7 +31975,6 @@ } }, "tft.full.color.displays" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -29821,6 +31982,12 @@ "value" : "TFT Full Color Displays" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Display TFT a colori" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29830,7 +31997,6 @@ } }, "Thailand" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -29838,6 +32004,12 @@ "value" : "Thailand" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thailandia" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29848,6 +32020,12 @@ }, "The amount of time to wait before we consider your packet as done." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il tempo di attesa prima che il pacchetto venga considerato completato." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29858,6 +32036,12 @@ }, "The compass heading on the screen outside of the circle will always point north." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La direzione della bussola sullo schermo all'esterno del cerchio punterà sempre verso nord." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29874,6 +32058,12 @@ "value" : "Der Taupunkt ist gerade %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il punto di rugiada è %@ in questo momento." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29884,6 +32074,12 @@ }, "The fastest that position updates will be sent if the minimum distance has been satisfied" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La velocità con cui verranno inviati gli aggiornamenti della posizione se la distanza minima è stata soddisfatta" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29894,6 +32090,12 @@ }, "The format used to display GPS coordinates on the device screen." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il formato utilizzato per visualizzare le coordinate GPS sullo schermo del dispositivo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29910,6 +32112,12 @@ }, "The last 4 of the device MAC address will be appended to the short name to set the device's BLE Name. Short name can be up to 4 bytes long." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gli ultimi 4 dell'indirizzo MAC del dispositivo vengono aggiunti al nome breve per impostare il nome BLE del dispositivo. Il nome breve può avere una lunghezza massima di 4 byte." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29926,6 +32134,12 @@ }, "The maximum interval that can elapse without a node broadcasting a position" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'intervallo massimo che può trascorrere senza che un nodo trasmetta una posizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29936,6 +32150,12 @@ }, "The Meshtastic Apple apps support firmware version %@ and above." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le applicazioni Meshtastic Apple supportano la versione firmware %@ e successive." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29952,6 +32172,12 @@ }, "The minimum distance change in meters to be considered for a smart position broadcast." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La variazione di distanza minima in metri da considerare per la trasmissione di una posizione intelligente." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29968,6 +32194,12 @@ }, "The most recent public key for this node does not match the previously recorded key. You can delete the node and let it exchange keys again, but this also may indicate a more serious security problem. Contact the user through another trusted channel to determine if the key change was due to a factory reset or other intentional action." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La chiave pubblica più recente di questo nodo non corrisponde alla chiave registrata in precedenza. È possibile eliminare il nodo e fargli scambiare nuovamente le chiavi, ma questo potrebbe indicare un problema di sicurezza più serio. Contattare l'utente attraverso un altro canale fidato per determinare se la modifica della chiave è dovuta a un reset di fabbrica o a un'altra azione intenzionale." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29990,6 +32222,12 @@ "value" : "Der erste öffentliche Schlüssel, der berechtigt ist, Admin-Nachrichten an diesen Knoten zu senden." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La chiave pubblica primaria autorizzata a inviare messaggi di amministrazione a questo nodo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30006,6 +32244,12 @@ }, "The public key does not match the recorded key. You may delete the node and let it exchange keys again, but this may indicate a more serious security problem. Contact the user through another trusted channel, to determine if the key change was due to a factory reset or other intentional action." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La chiave pubblica non corrisponde alla chiave registrata. È possibile eliminare il nodo e fargli scambiare nuovamente le chiavi, ma questo potrebbe indicare un problema di sicurezza più serio. Contattare l'utente attraverso un altro canale fidato, per determinare se la modifica della chiave è dovuta a un reset di fabbrica o a un'altra azione intenzionale." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30022,6 +32266,12 @@ }, "The region where you will be using your radios." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La regione in cui si utilizzeranno le radio." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30038,6 +32288,12 @@ }, "The root topic to use for MQTT." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'argomento principale da usare per MQTT." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30053,7 +32309,14 @@ } }, "The Router roles are designed for high vantage locations like mountaintops and towers. This node needs to be able to have a good direct connection to most of the nodes on the network or else this will significantly hurt the network." : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I ruoli di router sono progettati per posizioni elevate, come le cime delle montagne e le torri. Questo nodo deve essere in grado di avere una buona connessione diretta con la maggior parte dei nodi della rete, altrimenti danneggia significativamente la rete." + } + } + } }, "The secondary public key authorized to send admin messages to this node." : { "localizations" : { @@ -30063,6 +32326,12 @@ "value" : "Der zweite öffentliche Schlüssel, der berechtigt ist, Admin-Nachrichten an diesen Knoten zu senden." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La chiave pubblica secondaria autorizzata a inviare messaggi di amministrazione a questo nodo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30078,8 +32347,13 @@ } }, "The specified device has disconnected from us" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il dispositivo specificato si è disconnesso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30090,6 +32364,12 @@ }, "The state of the LED (on/off)" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lo stato del LED (acceso/spento)" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30106,6 +32386,12 @@ "value" : "Der dritte öffentliche Schlüssel, der berechtigt ist, Admin-Nachrichten an diesen Knoten zu senden." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La chiave pubblica terziaria autorizzata a inviare messaggi di amministrazione a questo nodo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30122,6 +32408,12 @@ }, "The URL for the channel settings" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'URL per le impostazioni del canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30132,6 +32424,12 @@ }, "There has been no response to a request for device metadata over the admin channel for this node." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non è stata data risposta a una richiesta di metadati del dispositivo sul canale di amministrazione per questo nodo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30142,6 +32440,12 @@ }, "These settings will %@ channels. The current LoRa Config will be replaced, if there are substantial changes to the LoRa config the device will reboot" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Queste impostazioni saranno %@ canali. La configurazione LoRa corrente verrà sostituita; se vengono apportate modifiche sostanziali alla configurazione LoRa, il dispositivo si riavvierà" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30158,6 +32462,12 @@ "value" : "Dreißig Minuten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trenta minuti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30168,6 +32478,12 @@ }, "This conversation will be deleted." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Questa conversazione sarà cancellata." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30178,6 +32494,12 @@ }, "This could take a while, response will appear in the trace route log for the node it was sent to." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La risposta potrebbe richiedere un po' di tempo e verrà visualizzata nel registro delle rotte di tracciamento per il nodo a cui è stata inviata." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30188,6 +32510,12 @@ }, "This could take a while. The response will appear in the trace route log for the node it was sent to." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'operazione potrebbe richiedere un po' di tempo. La risposta apparirà nel registro delle rotte di tracciamento per il nodo a cui è stata inviata." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30198,6 +32526,12 @@ }, "This device will send out range test messages on the selected interval." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il dispositivo invia messaggi di test di portata all'intervallo selezionato." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30220,6 +32554,12 @@ "value" : "Diese Nachricht wurde höchstwahrscheinlich nicht übermittelt." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È probabile che questo messaggio non sia stato consegnato." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30229,10 +32569,23 @@ } }, "This node does not support any configurable modules." : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Questo nodo non supporta alcun modulo configurabile." + } + } + } }, "This will disable fixed position and remove the currently set position." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In questo modo si disattiva la posizione fissa e si rimuove la posizione attualmente impostata." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30243,6 +32596,12 @@ }, "This will send a current position from your phone and enable fixed position." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In questo modo si invia la posizione corrente dal telefono e si abilita la posizione fissa." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30265,6 +32624,12 @@ "value" : "Zeit" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30281,6 +32646,12 @@ "value" : "Zeitstempel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Timbro del tempo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30297,6 +32668,12 @@ "value" : "Zeitzone" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fuso orario" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30313,6 +32690,12 @@ "value" : "Zeitzone für Daten auf dem Gerätebildschirm und Log." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fuso orario per le date sullo schermo del dispositivo e sul registro." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30347,18 +32730,18 @@ "value" : "זמן קצוב" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Timeout" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Limit czasu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tempo Limite" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30376,17 +32759,17 @@ "state" : "translated", "value" : "超时" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "超時" - } } } }, "timestamp" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "timestamp" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30421,18 +32804,18 @@ "value" : "שעה/תאריך" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Timestamp" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Znacznik czasu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Carimbo de Data/Hora" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30450,17 +32833,17 @@ "state" : "translated", "value" : "时间戳" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "時間戳記" - } } } }, "Timing & Format" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempi e formati" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30469,6 +32852,122 @@ } } }, + "tip.bluetooth.connect.message" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Shows information for the Lora radio currently connected via bluetooth. You can swipe left to disconnect the radio and long press to view stats or start the live activity." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Shows information for the Lora radio connected via bluetooth. You can swipe left to disconnect the radio and long press to view stats or start the live activity." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Affiche les informations de la radio Lora connectée via le bluetooth. Vous pouvez faire un glissé vers la gauche pour déconnecter la radio et un appui long pour voir les statistiques ou démarrer l'activité en direct." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מראה מידע אודות מכשיר המשטסטיק המחובר כעת לבלוטוס. ניתן לגרור שמאלה להתנתקות או לחיצה ארוכה לראות סטטיסטיקה או להתחיל פעילות." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra le informazioni relative alla radio Lora collegata via bluetooth. È possibile scorrere il dito verso sinistra per scollegare la radio e premere a lungo per visualizzare le statistiche o avviare l'attività live." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Shows information for the Lora radio currently connected via bluetooth. You can swipe left to disconnect the radio and long press to view stats or start the live activity." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Visar information för LoRa-radion ansluten via bluetooth. Du kan svepa åt vänster för att koppla från radion och långtryck för att visa statistik eller starta liveaktivitet." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Приказује информације за LoRA радио повезан преко Блутута. Можете превући лево да бисте одспојили радио и дуго притиснути да бисте погледали статистику или започели активност у реалном времену." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示当前通过蓝牙连接的 Lora 电台的信息。您可以向左滑动断开电台,长按查看统计信息或开始实时活动。" + } + } + } + }, + "tip.bluetooth.connect.title" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Connected LoRa Radio" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Connected Radio" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radio connectée" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מכשיר מחובר" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radio connessa" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Connected LoRa Radio" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ansluten Radio" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Радио повезан" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "电台已连接" + } + } + } + }, "tip.channel.admin.message" : { "localizations" : { "de" : { @@ -30495,18 +32994,18 @@ "value" : "Admin channel detected: Select a node from the drop down to manage connected or remote devices." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale amministrativo rilevato: Selezionare un nodo dal menu a tendina per gestire i dispositivi collegati o remoti." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Admin channel detected: Select a node from the drop down to manage connected or remote devices." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canal de administração detectado: Selecione um nó do menu suspenso para gerir dispositivos conectados ou remotos." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30524,12 +33023,6 @@ "state" : "translated", "value" : "检测到 admin 频道:请从下拉菜单中选择一个节点,来管理已连接或远程设备。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "偵測到管理頻道:從下拉選單中選擇一個節點來管理連接或遠端設備。" - } } } }, @@ -30559,18 +33052,18 @@ "value" : "Admin Channel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale Admin" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Admin Channel" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canal de Administração" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30588,12 +33081,6 @@ "state" : "translated", "value" : "admin 频道" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "管理頻道" - } } } }, @@ -30623,18 +33110,18 @@ "value" : "Most data on your mesh is sent over the primary channel. You can set up secondary channels to create additional messaging groups secured by their own key. [Channel config tips](https://meshtastic.org/docs/configuration/radio/channels/)" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La maggior parte dei dati sulla rete viene inviata attraverso il canale primario. È possibile impostare canali secondari per creare gruppi di messaggistica aggiuntivi protetti da una propria chiave. [Suggerimenti per la configurazione del canale](https://meshtastic.org/docs/configuration/tips/)" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Most data on your mesh is sent over the primary channel. You can set up secondary channels to create additional messaging groups secured by their own key. [Channel config tips](https://meshtastic.org/docs/configuration/radio/channels/)" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "A maioria dos dados na sua malha é enviada pelo canal principal. Você pode configurar canais secundários para criar grupos de mensagens adicionais protegidos por sua própria chave. [Channel config tips](https://meshtastic.org/docs/configuration/tips/)" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30652,12 +33139,6 @@ "state" : "translated", "value" : "Mesh 网格上的大部分数据都通过主频道发送。您可以设置辅助频道以创建由其自身密钥保护的消息组。[频道配置提示](https://meshtastic.org/docs/configuration/tips/)" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "現在 Mesh 上的資料會通過主通道發送。您可以設定輔助通道來建立由自己的金鑰保護的其他訊息組 [頻道設定提示](https://meshtastic.org/docs/configuration/radio/channels/)" - } } } }, @@ -30687,18 +33168,18 @@ "value" : "Manage Channels" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gestire i canali" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Manage Channels" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerir Canais" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30716,12 +33197,6 @@ "state" : "translated", "value" : "管理频道" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "管理頻道" - } } } }, @@ -30751,18 +33226,18 @@ "value" : "במשטסטיק יש עד 8 ערוצים. הראשון הינו הראשי והינו היכן שרוב הפעילות מתבצעת והכרחי. אם לא תשתף את הערוץ הראשי שלך הערוץ הראשון שלך נהיה הערוץ הראשי ברשת השניה. הוא מדבר בערוץ הראשי שלו במשני שלך. ערוץ בעל השם 'admin' הינו לשליטה מרחוק. ערוצים נוספים הינם לקבוצות פרטיות, כל אחת עם מפתח הצפנה משלה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un codice QR Meshtastic contiene la configurazione LoRa e i valori dei canali necessari alle radio per comunicare. È possibile condividere una configurazione completa dei canali utilizzando l'opzione Sostituisci canali; se si sceglie Aggiungi canali, i canali condivisi verranno aggiunti ai canali della radio ricevente." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "In a Meshtastic LoRa Mesh there are up to 8 channels. The first one is the Primary channel where most activity happens and is required. If you don't share your primary channel your first shared channel becomes the primary channel on the other network. It talks on its primary and your secondary channel. A channel with the name 'admin' controls nodes remotely. Other channels are for private groups, each with its own key." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Um código QR Meshtastic contém a configuração LoRa e os valores do canal necessários para os rádios se comunicarem. Você pode compartilhar uma configuração completa do canal usando a opção Substituir Canais; se você escolher Adicionar Canais, seus canais compartilhados serão adicionados aos canais no rádio receptor." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30780,12 +33255,6 @@ "state" : "translated", "value" : "在 Meshtastic 网络中最多有 8 个频道。第一个频道是主频道,大多数活动都发生在这里,也是必需的。如果您不共享主频道,您的第一个共享频道就会成为其他网络的主频道。它会在其主频道和您的辅助频道上对话。名称为 admin 的频道可远程控制节点。其他频道用于私人群组,每个群组都有自己的密钥。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "在 Meshtastic 網路中最多有 8 個頻道。第一個頻道是主頻道,大多數活動都發生在這裡,也是必需的。如果您不共享主頻道,您的第一個共享頻道就會成為其他網路的主頻道。它會在其主頻道和您的輔助頻道上對話。名稱為 admin 的頻道可遠端控制中繼點。其他頻道用於私人群组,每個群組都有自己的密鑰。" - } } } }, @@ -30815,18 +33284,18 @@ "value" : "משתף ערוצי משטסטיק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Condividere i canali Meshtastic" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Sharing Meshtastic Channels" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Compartilhando Canais Meshtastis" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30844,12 +33313,6 @@ "state" : "translated", "value" : "共享 Meshtastic 频道" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "共享 Meshtastic 頻道" - } } } }, @@ -30879,18 +33342,18 @@ "value" : "ניתן לשלוח הודעות ערוץ (קבוצות צ'אט) והודעות פרטיות. על הודעה ניתן לעשות לחיצה ארוכה בכדי לראות פעולות אפשריות כגון העתק, הגב, תגובה מהירה, מחק ובנוסף לראות מצב שליחה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È possibile inviare e ricevere messaggi di canale (chat di gruppo) e messaggi diretti. Da qualsiasi messaggio è possibile premere a lungo per visualizzare le azioni disponibili, come copia, risposta, tapback e cancellazione, nonché i dettagli di consegna." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "You can send and receive channel (group chats) and direct messages. From any message you can long press to see available actions like copy, reply, tapback and delete as well as delivery details." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Você pode enviar e receber mensagens de canal (conversas em grupo) e mensagens diretas. De qualquer mensagem, você pode pressionar por um longo período para ver ações disponíveis como copiar, responder, tapback e excluir, bem como detalhes de entrega." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30908,12 +33371,6 @@ "state" : "translated", "value" : "您可以发送和接收群聊或私聊消息。在任何消息中,您都可以长按查看可用的操作,如复制、回复、拍一拍、删除以及投递详情。" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "您可以發送和接收1對1聊天和群聊。在任何訊息中,您都可以長按查看可用的操作,如複製、回復、拍一拍、刪除以及詳情。" - } } } }, @@ -30943,18 +33400,18 @@ "value" : "הודעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Messages" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagens" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30972,17 +33429,17 @@ "state" : "translated", "value" : "消息" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "消息" - } } } }, "TLS Enabled" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "TLS abilitato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30998,8 +33455,13 @@ } }, "Topic: %@" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Argomento: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31016,6 +33478,12 @@ "value" : "Total" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Totale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31026,6 +33494,12 @@ }, "Trace Route" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Percorso di tracciamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31036,6 +33510,12 @@ }, "Trace Route Log" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro del percorso di tracciamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31046,6 +33526,12 @@ }, "Trace Route Sent" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Traccia del percorso inviato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31056,6 +33542,12 @@ }, "Trace route sent to %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Traccia del percorso inviato a %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31066,6 +33558,12 @@ }, "Trace route to %@ was not sent." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La rotta di tracciamento verso %@ non è stata inviata." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31076,6 +33574,12 @@ }, "Trace Route was rate limited. You can send a trace route a maximum of once every thirty seconds." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La rotta di traccia era limitata dalla velocità. È possibile inviare una rotta di tracciamento al massimo una volta ogni trenta secondi." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31092,6 +33596,12 @@ "value" : "Verkehr" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Traffico" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31102,6 +33612,12 @@ }, "Transmit data (txd) GPIO pin" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dati di trasmissione (txd) Pin GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31112,6 +33628,12 @@ }, "Transmit Enabled" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmissione abilitata" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31128,6 +33650,12 @@ }, "Treat double tap on supported accelerometers as a user button press." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tratta il doppio tocco sugli accelerometri supportati come una pressione di un tasto utente." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31144,6 +33672,12 @@ }, "TriggerType" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tipo di innesco" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31154,6 +33688,12 @@ }, "Triple Click Ad Hoc Ping" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ping ad hoc a triplo clic" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31170,6 +33710,12 @@ "value" : "Erneut versuchen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riprova" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31179,7 +33725,6 @@ } }, "twitter" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -31205,13 +33750,13 @@ "value" : "טוויטר" } }, - "pl" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "Twitter" } }, - "pt-PT" : { + "pl" : { "stringUnit" : { "state" : "translated", "value" : "Twitter" @@ -31234,17 +33779,17 @@ "state" : "translated", "value" : "Twitter" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } } } }, "Two Hours" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Due ore" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31254,10 +33799,16 @@ } }, "UDP Broadcast" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmissione UDP" + } + } + } }, "Ukraine 433mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -31265,6 +33816,12 @@ "value" : "Ukraine 433MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ucraina 433MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31274,7 +33831,6 @@ } }, "Ukraine 868mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -31282,6 +33838,12 @@ "value" : "Ukraine 868MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ucraina 868MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31292,6 +33854,12 @@ }, "Un-Favorite" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non preferito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31301,7 +33869,6 @@ } }, "United States" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -31309,6 +33876,12 @@ "value" : "United States" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stati Uniti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31319,6 +33892,12 @@ }, "Units displayed on the device screen" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unità visualizzate sullo schermo del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31329,6 +33908,12 @@ }, "unknown" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "sconosciuto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31363,18 +33948,18 @@ "value" : "לא ידוע" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sconosciuto" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Nieznany" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desconhecido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -31392,12 +33977,6 @@ "state" : "translated", "value" : "未知" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "未知" - } } } }, @@ -31427,18 +34006,18 @@ "value" : "גיל לא ידוע" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Età sconosciuta" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Nieznany wiek" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Idade Desconhecido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -31456,12 +34035,6 @@ "state" : "translated", "value" : "未知时间" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "未知時間" - } } } }, @@ -31491,18 +34064,18 @@ "value" : "לא נקבע" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non impostato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Nieustawiony" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Não Definido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -31520,17 +34093,17 @@ "state" : "translated", "value" : "未设置" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "未設置" - } } } }, "Unsupported" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non supportato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31541,6 +34114,12 @@ }, "Up Down 1" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Su Giù 1" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31557,6 +34136,12 @@ }, "Update Interval" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo di aggiornamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31591,18 +34176,18 @@ "value" : "עדכן קושחה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornare il firmware" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zaktualizuj firmware" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Atualiza o Seu Firmware" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -31620,12 +34205,6 @@ "state" : "translated", "value" : "更新你的固件" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "更新韌體" - } } } }, @@ -31655,18 +34234,18 @@ "value" : "זמן בין עדכונים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo di aggiornamento" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Interwał aktualizacji" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervalo de Atualização" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -31684,17 +34263,17 @@ "state" : "translated", "value" : "更新间隔" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "更新間隔" - } } } }, "Updated Node Stats Data." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dati aggiornati sulle statistiche dei nodi." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31711,6 +34290,12 @@ "value" : "Aktualisiert: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornato: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31721,6 +34306,12 @@ }, "Uplink Enabled" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uplink abilitato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31749,10 +34340,10 @@ "value" : "Uptime" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Tempo No Ár" + "value" : "Tempo di attività" } }, "se" : { @@ -31771,6 +34362,12 @@ }, "Uptime" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempo di attività" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31781,6 +34378,12 @@ }, "Use a PWM output (like the RAK Buzzer) for tunes instead of an on/off output. This will ignore the output, output duration and active settings and use the device config buzzer GPIO option instead." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizzare un'uscita PWM (come il cicalino RAK) per le sintonie invece di un'uscita on/off. In questo modo si ignorano le impostazioni di uscita, durata e attivazione e si utilizza invece l'opzione GPIO del buzzer configurata dal dispositivo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31797,6 +34400,12 @@ }, "Use I2S As Buzzer" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizzare I2S come cicalino" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31807,6 +34416,12 @@ }, "Use Preset" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizzare la preimpostazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31823,6 +34438,12 @@ }, "Use PWM Buzzer" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizzare il cicalino PWM" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31839,6 +34460,12 @@ }, "Used to create a shared key with a remote device." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si usa per creare una chiave condivisa con un dispositivo remoto." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31873,18 +34500,18 @@ "value" : "משתמש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utente" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Użytkownik" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Utilizador" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -31902,17 +34529,17 @@ "state" : "translated", "value" : "用户" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "使用者" - } } } }, "User Config" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione utente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31929,6 +34556,12 @@ }, "User Details" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dettagli utente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31945,6 +34578,12 @@ }, "User Id" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Id utente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31960,8 +34599,13 @@ } }, "User Initiated Disconnect" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disconnessione avviata dall'utente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31977,7 +34621,6 @@ } }, "user.details" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -32003,18 +34646,18 @@ "value" : "פרטי משתמש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dettagli utente" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Szczegóły użytkownika" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dados do Utilizador" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -32032,17 +34675,17 @@ "state" : "translated", "value" : "用户信息" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "使用者資料" - } } } }, "Uses pullup resistor" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizza una resistenza di pullup" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32053,6 +34696,12 @@ }, "Utilizes the network connection on your phone to connect to MQTT." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizza la connessione di rete del telefono per connettersi a MQTT." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32075,6 +34724,12 @@ "value" : "Fahrzeugsteuerkurs" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Direzione del veicolo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32091,6 +34746,12 @@ "value" : "Fahrzeuggeschwindigkeit" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velocità del veicolo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32103,10 +34764,16 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", "value" : "Version %1$@ includes substantial network optimizations and extensive changes to devices and client apps. Only nodes version %2$@ and above are supported." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La versione %1$@ include sostanziali ottimizzazioni di rete e modifiche estese ai dispositivi e alle applicazioni client. Sono supportati solo i nodi versione %2$@ e superiori." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32131,10 +34798,16 @@ }, "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", "value" : "Version: %1$@ (%2$@) " } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versione: %1$@ (%2$@) " + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32150,7 +34823,6 @@ } }, "very.long.range.slow" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -32158,6 +34830,12 @@ "value" : "Very Long Range - Slow" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "A lunghissimo raggio - Lento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32174,6 +34852,12 @@ "value" : "Via Lora" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Via Lora" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32190,6 +34874,12 @@ "value" : "Via Mqtt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Via Mqtt" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32230,18 +34920,18 @@ "value" : "וולטז'" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tensione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Napięcie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tensão" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -32259,17 +34949,17 @@ "state" : "translated", "value" : "电压" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電壓" - } } } }, "Voltage" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tensione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32279,7 +34969,14 @@ } }, "Volts %@" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Volt %@" + } + } + } }, "Waiting" : { "localizations" : { @@ -32307,18 +35004,18 @@ "value" : "ממתין. . ." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In attesa. . ." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Czekam. . ." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "À Espara. . ." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -32336,17 +35033,17 @@ "state" : "translated", "value" : "等待中..." } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "等待中..." - } } } }, "Waiting to be acknowledged. . ." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In attesa di essere riconosciuti. . ." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32357,6 +35054,12 @@ }, "Wake Screen on tap or motion" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Svegliare lo schermo al tocco o al movimento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32373,6 +35076,12 @@ "value" : "Wegpunktoptionen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni Waypoint" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32389,6 +35098,12 @@ "value" : "Wetterverhältnisse" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Condizioni meteo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32405,6 +35120,12 @@ }, "Web Flasher" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lampeggiatore web" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32415,6 +35136,12 @@ }, "Website" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sito web" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32430,7 +35157,14 @@ } }, "Weight" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Peso" + } + } + } }, "What does the lock mean?" : { "localizations" : { @@ -32440,6 +35174,12 @@ "value" : "Was bedeutet das Schloß?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Che cosa significa il lucchetto?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32462,6 +35202,12 @@ "value" : "Was ist Meshtastic?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Che cos'è Meshtastic?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32478,6 +35224,12 @@ }, "What licensed operator mode does:\n* Sets the node name to your call sign \n* Broadcasts node info every 10 minutes \n* Overrides frequency, dutycycle and tx power \n* Disables encryption" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cosa fa la modalità operatore con licenza:\n* Imposta il nome del nodo con il proprio nominativo\n* Trasmette informazioni sul nodo ogni 10 minuti\n* Sovrascrive la frequenza, il dutycycle e la potenza di trasmissione\n* Disabilita la crittografia" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32494,6 +35246,12 @@ }, "When using in GPIO mode, keep the output on for this long. " : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quando si utilizza la modalità GPIO, mantenere l'uscita attiva per questo tempo. " + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32510,6 +35268,12 @@ }, "Whether or not use INPUT_PULLUP mode for GPIO pin. Only applicable if the board uses pull-up resistors on the pin" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizza o meno la modalità INPUT_PULLUP per il pin GPIO. Si applica solo se la scheda utilizza resistenze di pull-up sul pin" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32526,6 +35290,12 @@ "value" : "WiFi Optionen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni WiFi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32535,7 +35305,14 @@ } }, "Wind" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vento" + } + } + } }, "Wind Direction" : { "localizations" : { @@ -32545,6 +35322,12 @@ "value" : "Windrichtung" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Direzione del vento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32561,6 +35344,12 @@ "value" : "Windgeschwindigkeit" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velocità del vento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32571,6 +35360,12 @@ }, "x" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "x" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32583,7 +35378,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "X: %1$@, Y: %2$d" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "X: %1$@, Y: %2$d" } }, @@ -32605,7 +35406,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "X: %1$@, Y: %2$f" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "X: %1$@, Y: %2$f" } }, @@ -32627,7 +35434,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "X: %1$@, Y: %2$lld" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "X: %1$@, Y: %2$lld" } }, @@ -32647,6 +35460,12 @@ }, "y" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "y" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32669,6 +35488,12 @@ "value" : "Gestern" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ieri" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32679,6 +35504,12 @@ }, "You can also update your Meshtastic device over bluetooth using the Nordic DFU app." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È anche possibile aggiornare il dispositivo Meshtastic tramite bluetooth utilizzando l'applicazione Nordic DFU." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32695,6 +35526,12 @@ }, "Your current location will be set as the fixed position and broadcast over the mesh on the position interval." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La posizione attuale viene impostata come posizione fissa e trasmessa sulla mesh nell'intervallo di posizione." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32717,6 +35554,12 @@ "value" : "Deine Firmware ist aktuell" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il firmware è aggiornato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32733,6 +35576,12 @@ }, "Your MQTT Server must support TLS." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il server MQTT deve supportare TLS." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32743,6 +35592,12 @@ }, "Your node’s operating frequency is calculated based on the region, modem preset, and this field. When 0, the slot is automatically calculated based on the primary channel name." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La frequenza operativa del nodo viene calcolata in base alla regione, alla preimpostazione del modem e a questo campo. Se il campo è 0, lo slot viene calcolato automaticamente in base al nome del canale primario." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32753,6 +35608,12 @@ }, "Your position has been sent with a request for a response with their position. You will receive a notification when a position is returned." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La vostra posizione è stata inviata con una richiesta di risposta con la loro posizione. Riceverete una notifica quando la posizione verrà restituita." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32769,6 +35630,12 @@ }, "Your region has a %lld%% duty cycle. MQTT is not advised when you are duty cycle restricted, the extra traffic will quickly overwhelm your LoRa mesh." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La vostra regione ha un ciclo di lavoro di %lld%%. MQTT è sconsigliato quando il ciclo di lavoro è limitato, perché il traffico extra sovraccaricherà rapidamente la rete LoRa." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32785,6 +35652,12 @@ }, "Your region has a %lld%% hourly duty cycle, your radio will stop sending packets when it reaches the hourly limit." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La regione ha un ciclo di funzionamento orario del %lld%%; la radio smette di inviare pacchetti quando raggiunge il limite orario." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32795,6 +35668,12 @@ }, "Your route file must have both Latitude and Longitude columns and headers." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il file di percorso deve avere entrambe le colonne Latitudine e Longitudine e le intestazioni." + } + }, "sr" : { "stringUnit" : { "state" : "translated", From 17c7e3dbdaa30597e2b87a12e036b9a47eea04e7 Mon Sep 17 00:00:00 2001 From: al31c0 <57990612+al31c0@users.noreply.github.com> Date: Sat, 5 Apr 2025 16:44:51 +0200 Subject: [PATCH 08/93] Update project.pbxproj Update project.pbxproj to support Italian language translation --- Meshtastic.xcodeproj/project.pbxproj | 1 + 1 file changed, 1 insertion(+) diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 58e2baa5..4b7fc483 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -1282,6 +1282,7 @@ se, "pt-PT", sr, + it, ); mainGroup = DDC2E14B26CE248E0042C5E4; packageReferences = ( From d4a6742c42581d906cdf4f781a250b069c8d7e02 Mon Sep 17 00:00:00 2001 From: Uno Huang Date: Sun, 6 Apr 2025 23:47:07 -0400 Subject: [PATCH 09/93] some translation --- Localizable.xcstrings | 846 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 682 insertions(+), 164 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 08f7b2ae..a60c69f0 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -84,6 +84,12 @@ "state" : "translated", "value" : "为你的电路板重新定义 PIN_GPS_EN" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "重新設定主板腳位 (PIN_GPS_EN)" + } } } }, @@ -188,6 +194,12 @@ "state" : "translated", "value" : "%@ - 没有响应" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ - 沒有回應" + } } } }, @@ -210,6 +222,12 @@ "state" : "translated", "value" : "%@ - 未发送" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ - 未送出" + } } } }, @@ -363,7 +381,8 @@ "value" : "%@ dB" } } - } + }, + "shouldTranslate" : false }, "%@ Please try connecting again and check the PIN carefully." : { "extractionState" : "migrated", @@ -477,8 +496,8 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", - "value" : "%@ 如果在首選電台的旁邊,App 將會自動重連。" + "state" : "translated", + "value" : "%@ 如果在首選節點的旁邊,App 將會自動重連。" } } } @@ -536,8 +555,8 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", - "value" : "%@ 這個錯誤通常無法自動修復,你需要在系統設定的藍芽選項中忽略該電台並重新配對。" + "state" : "translated", + "value" : "%@ 這個錯誤通常無法自動修復,你需要在系統設定的藍芽選項中忽略該節點並重新配對。" } } } @@ -882,7 +901,8 @@ "value" : "< 1%" } } - } + }, + "shouldTranslate" : false }, "🦕 End of life Version 🦖 ☄️" : { "localizations" : { @@ -891,6 +911,12 @@ "state" : "translated", "value" : "🦕 Верзија за крај живота 🦖 ☄" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "🦕 該版本已停止支援 🦖 ☄️" + } } } }, @@ -908,7 +934,8 @@ "value" : "1 byte" } } - } + }, + "shouldTranslate" : false }, "1 hop away" : { "localizations" : { @@ -935,7 +962,8 @@ "value" : "2.4 GHz" } } - } + }, + "shouldTranslate" : false }, "7" : { "localizations" : { @@ -1047,7 +1075,8 @@ "value" : "128 bit" } } - } + }, + "shouldTranslate" : false }, "256 bit" : { "localizations" : { @@ -1063,7 +1092,8 @@ "value" : "256 bit" } } - } + }, + "shouldTranslate" : false }, "A Trace Route was sent, no response has been received." : { "localizations" : { @@ -1082,6 +1112,12 @@ "state" : "translated", "value" : "О" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "關於" + } } } }, @@ -1092,6 +1128,12 @@ "state" : "translated", "value" : "О Мештастику" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "關於Meshtastic" + } } } }, @@ -1108,6 +1150,12 @@ "state" : "translated", "value" : "Прецизност %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "精確度 %@" + } } } }, @@ -1419,8 +1467,8 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", - "value" : "ago" + "state" : "translated", + "value" : "之前" } } } @@ -1477,8 +1525,8 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", - "value" : "廣播時間" + "state" : "translated", + "value" : "空中時間" } } } @@ -1590,6 +1638,12 @@ "state" : "translated", "value" : "全部" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "全部" + } } } }, @@ -1606,6 +1660,12 @@ "state" : "translated", "value" : "所有设备以及 App 数据都会被删除。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "全部的設備及App資料將會被刪除。" + } } } }, @@ -1754,7 +1814,8 @@ "value" : "常亮" } } - } + }, + "shouldTranslate" : false }, "Always point north" : { "localizations" : { @@ -1824,7 +1885,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "環境照明" } } @@ -1882,7 +1943,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "環境照明設定" } } @@ -2096,7 +2157,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "是否確定?" } } @@ -2110,6 +2171,12 @@ "state" : "translated", "value" : "Аустралија / Нови Зеланд" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "澳洲 / 紐西蘭" + } } } }, @@ -2197,7 +2264,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "可以連接的設備" } } @@ -2325,7 +2392,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "電池電量" } } @@ -2344,6 +2411,12 @@ "state" : "translated", "value" : "电池电量 %" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電池電量 %" + } } } }, @@ -2415,7 +2488,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "藍芽名稱" } } @@ -2473,7 +2546,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "藍芽 PIN 碼必須是 6 位數字。" } } @@ -2621,8 +2694,8 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", - "value" : "藍芽設置" + "state" : "translated", + "value" : "藍芽設定" } } } @@ -2679,7 +2752,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "藍芽已關閉" } } @@ -2802,7 +2875,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "位元組" } } @@ -2821,6 +2894,12 @@ "state" : "translated", "value" : "呼号" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "呼號" + } } } }, @@ -2837,6 +2916,12 @@ "state" : "translated", "value" : "呼号不能为空" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "呼號不能為空" + } } } }, @@ -2892,7 +2977,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "取消" } } @@ -2950,7 +3035,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "罐頭訊息" } } @@ -3008,8 +3093,8 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", - "value" : "通知設定" + "state" : "translated", + "value" : "罐頭訊息設定" } } } @@ -3248,6 +3333,12 @@ "state" : "translated", "value" : "Канал 1 струја" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道1 電流" + } } } }, @@ -3258,6 +3349,12 @@ "state" : "translated", "value" : "Канал 1 напон" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道1 電壓" + } } } }, @@ -3268,6 +3365,12 @@ "state" : "translated", "value" : "Канал 2 струја" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道2 電流" + } } } }, @@ -3278,6 +3381,12 @@ "state" : "translated", "value" : "Канал 2 напон" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道2 電壓" + } } } }, @@ -3288,6 +3397,12 @@ "state" : "translated", "value" : "Канал 3 струја" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道3 電流" + } } } }, @@ -3298,6 +3413,12 @@ "state" : "translated", "value" : "Канал 3 напон" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道3 電壓" + } } } }, @@ -3353,7 +3474,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "頻道" } } @@ -3372,6 +3493,12 @@ "state" : "translated", "value" : "包含频道 0" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已包含頻道0" + } } } }, @@ -3382,6 +3509,12 @@ "state" : "translated", "value" : "Канал 1" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道1" + } } } }, @@ -3398,6 +3531,12 @@ "state" : "translated", "value" : "包含频道 1" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已包含頻道1" + } } } }, @@ -3408,6 +3547,12 @@ "state" : "translated", "value" : "Канал 2" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道2" + } } } }, @@ -3424,6 +3569,12 @@ "state" : "translated", "value" : "包含频道 2" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已包含頻道2" + } } } }, @@ -3434,6 +3585,12 @@ "state" : "translated", "value" : "Канал 3" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道3" + } } } }, @@ -3450,6 +3607,12 @@ "state" : "translated", "value" : "包含频道 3" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已包含頻道3" + } } } }, @@ -3466,6 +3629,12 @@ "state" : "translated", "value" : "包含频道 4" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已包含頻道4" + } } } }, @@ -3482,6 +3651,12 @@ "state" : "translated", "value" : "包含频道 5" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已包含頻道5" + } } } }, @@ -3498,6 +3673,12 @@ "state" : "translated", "value" : "包含频道 6" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已包含頻道6" + } } } }, @@ -3514,6 +3695,12 @@ "state" : "translated", "value" : "包含频道 7" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已包含頻道7" + } } } }, @@ -3546,6 +3733,12 @@ "state" : "translated", "value" : "频道名称" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道名稱" + } } } }, @@ -3562,6 +3755,12 @@ "state" : "translated", "value" : "频道编号必须介于 0 和 7 之间。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道名稱必須在0和7之間。" + } } } }, @@ -3578,6 +3777,12 @@ "state" : "translated", "value" : "频道角色" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道模式" + } } } }, @@ -3967,6 +4172,12 @@ "state" : "translated", "value" : "Кина" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "中國" + } } } }, @@ -3993,6 +4204,12 @@ "state" : "translated", "value" : "Очисти логове" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "清除 Log 檔" + } } } }, @@ -4239,6 +4456,12 @@ "state" : "translated", "value" : "颜色" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "顏色" + } } } }, @@ -4268,6 +4491,12 @@ "state" : "translated", "value" : "配置" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定" + } } } }, @@ -4876,7 +5105,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "為了追蹤器和感測器的角色,這將包括將 LoRa 無線電設備盡可能地進入睡眠模式。如果您想要使用手機應用程式操作您的設備,或者使用沒有用戶按鈕的設備,請不要使用此設定。" + "value" : "此設定會讓裝置盡可能休眠,包括 LoRa 無線電(用於 Tracker 和 Sensor 角色)。若您要搭配手機 App,或裝置沒有用戶按鈕,請不要使用此設定。" } } } @@ -5161,7 +5390,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "失去電源後關機" + "value" : "斷電自動關機" } } } @@ -5278,7 +5507,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "等待藍芽" + "value" : "關閉藍芽" } } } @@ -5563,7 +5792,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "電台將會在設定儲存後重啟。" + "value" : "節點將會在設定儲存後重啟。" } } } @@ -5581,6 +5810,12 @@ "state" : "translated", "value" : "Конфигурација за: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在設定: %@" + } } } }, @@ -5780,7 +6015,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "已連接的電台" + "value" : "已連接的節點" } } } @@ -5934,7 +6169,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "嘗試連接%d失敗,你可能需要在系统設定的藍芽選項中忽略該電台。" + "value" : "嘗試連接%d失敗,你可能需要在系统設定的藍芽選項中忽略該節點。" } } } @@ -7125,6 +7360,12 @@ "state" : "translated", "value" : "设备角色" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置模式" + } } } }, @@ -7203,7 +7444,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "電台設定" + "value" : "節點設定" } } } @@ -7319,7 +7560,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "刪除所有電台指標??" + "value" : "要刪除所有裝置指標嗎?" } } } @@ -7383,7 +7624,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "電台指標紀錄檔" + "value" : "裝置指標紀錄檔" } } } @@ -7448,7 +7689,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "標準模式 - App 可以連接到電台進行收發操作,並且會自動轉發 Mesh 網路中其他中繼點的消息。" + "value" : "可連接 App 或作為獨立運作的訊息裝置。" } } } @@ -7513,7 +7754,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "隱藏模式 - 用於那些\"只在被問到時才回答\"的節點,關閉所有常規廣播,但允許臨時通訊。依然會進行轉播,但只在本地轉播模式下進行(僅限已知的網狀網路)。可以用於私密操作或顯著減少空中時間/功耗。" + "value" : "裝置僅在必要時廣播,以達到隱蔽性或節能目的。" } } } @@ -7578,7 +7819,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "靜音模式 - 與標準模式類似,App 可以連接到電台進行收發操作,但不會轉發 Mesh 網路中其他中繼點的消息。" + "value" : "裝置不會轉發來自其他設備的封包。" } } } @@ -7643,7 +7884,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "遺失物模式 - 用於自動頻繁地向網狀網路發送一條包含設備當前位置的短信:\"I'm lost! Position: lat / long\"" + "value" : "裝置會定期把位置廣播到預設頻道,方便找回遺失設備。\n" } } } @@ -7675,7 +7916,8 @@ "value" : "客户端" } } - } + }, + "shouldTranslate" : false }, "device.role.name.clientHidden" : { "extractionState" : "manual", @@ -7704,7 +7946,8 @@ "value" : "客户端隐藏" } } - } + }, + "shouldTranslate" : false }, "device.role.name.clientMute" : { "extractionState" : "manual", @@ -7727,7 +7970,8 @@ "value" : "客户端静默" } } - } + }, + "shouldTranslate" : false }, "device.role.name.lostAndFound" : { "extractionState" : "manual", @@ -7756,7 +8000,8 @@ "value" : "失物招领" } } - } + }, + "shouldTranslate" : false }, "device.role.name.repeater" : { "extractionState" : "manual", @@ -7785,7 +8030,8 @@ "value" : "中继" } } - } + }, + "shouldTranslate" : false }, "device.role.name.router" : { "extractionState" : "manual", @@ -7814,7 +8060,8 @@ "value" : "路由" } } - } + }, + "shouldTranslate" : false }, "device.role.name.routerClient" : { "extractionState" : "manual", @@ -7843,7 +8090,8 @@ "value" : "路由 & 客户端" } } - } + }, + "shouldTranslate" : false }, "device.role.name.routerlate" : { "extractionState" : "manual", @@ -7866,7 +8114,8 @@ "value" : "Рутер са кашњењем" } } - } + }, + "shouldTranslate" : false }, "device.role.name.sensor" : { "extractionState" : "manual", @@ -7895,7 +8144,8 @@ "value" : "传感器" } } - } + }, + "shouldTranslate" : false }, "device.role.name.tak" : { "extractionState" : "manual", @@ -7924,7 +8174,8 @@ "value" : "TAK" } } - } + }, + "shouldTranslate" : false }, "device.role.name.takTracker" : { "extractionState" : "manual", @@ -7953,7 +8204,8 @@ "value" : "TAK 追踪器" } } - } + }, + "shouldTranslate" : false }, "device.role.name.tracker" : { "extractionState" : "manual", @@ -7982,7 +8234,8 @@ "value" : "追踪器" } } - } + }, + "shouldTranslate" : false }, "device.role.repeater" : { "extractionState" : "migrated", @@ -8043,8 +8296,8 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", - "value" : "中繼模式 - Mesh 網路數據包將優先通過此中繼點路由。此模式可消除不必要的開銷,如 NodeInfo、DeviceTelemetry 和任何其他 Mesh 數據包,從而使設備不顯示為 Mesh 網路的一部分。有關此角色的其他特定設置,請參閱轉播模式。" + "state" : "translated", + "value" : "僅適用於安裝於塔台或山頂。不適用於屋頂或移動式節點。具備高效的訊息轉發能力,資源消耗極低。此類節點不會顯示於節點列表中。" } } } @@ -8108,8 +8361,8 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", - "value" : "纯路由模式 - 自動轉發 Mesh 網路中其他中繼點的消息,中繼模式下螢幕會熄滅,Wi-Fi 和藍芽將會進入睡眠模式,App 將無法連接到電台進行收發操作。" + "state" : "translated", + "value" : "僅適用於安裝於塔台或山頂的基礎設施節點。不適用於屋頂或移動式節點,需具備卓越的訊號覆蓋能力。此類節點會顯示於節點列表中。" } } } @@ -8173,8 +8426,8 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", - "value" : "路由客户端模式 - 優先轉發 Mesh 網路中其他中繼點的消息,App 也可以連接到電台進行收發操作。" + "state" : "translated", + "value" : "已不再使用,請選擇 CLIENT。" } } } @@ -8199,6 +8452,12 @@ "state" : "translated", "value" : "Нод инфраструктуре који увек поново преноси пакете једном, али тек након свих других начина, обезбеђујући додатно покриће за локалне кластере. Видљив на листи нодова." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "基礎設施節點,會在所有其他模式完成轉發後,固定將封包重新轉發一次,以確保鄰近節點群擁有額外的覆蓋範圍。此節點會顯示於節點列表中。" + } } } }, @@ -8262,7 +8521,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "傳感器模式 - 優先廣播傳感器數據包" + "value" : "優先廣播遙測資料。" } } } @@ -8327,7 +8586,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "TAK模式 - 優化了 ATAK 系統通訊,減少常規廣播。" + "value" : "為 ATAK 系統通訊最佳化,並減少例行廣播頻率。" } } } @@ -8392,7 +8651,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "TAK TRACKER追蹤器 - 啟用自動 TAK PLI 廣播並減少常規廣播。" + "value" : "啟用自動傳送 TAK PLI 資訊,並降低例行廣播頻率。" } } } @@ -8457,7 +8716,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "追蹤模式 - 用於作為 GPS 追蹤器。從該設備發送的定位數據包優先級較高,每兩分鐘廣播一次。智能位置廣播預設為關閉。" + "value" : "優先傳送 GPS 位置封包。" } } } @@ -8815,7 +9074,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "螢幕(電台螢幕)" + "value" : "螢幕" } } } @@ -9757,6 +10016,12 @@ "state" : "translated", "value" : "Европска унија 433MHz" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "歐盟 433MHz" + } } } }, @@ -9774,6 +10039,12 @@ "state" : "translated", "value" : "Европска унија 868MHz" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "歐盟 868MHz" + } } } }, @@ -10435,7 +10706,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "檢測到不支援的韌體版本,無法連接到電台。" + "value" : "檢測到不支援的韌體版本,無法連接到節點。" } } } @@ -10862,7 +11133,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "生成QRcode" + "value" : "生成 QRcode" } } } @@ -11027,7 +11298,8 @@ "value" : "GPS EN GPIO" } } - } + }, + "shouldTranslate" : false }, "GPS Format" : { "localizations" : { @@ -11748,7 +12020,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到" + "value" : "接收" } } } @@ -11813,7 +12085,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "最後收到" + "value" : "最後通訊時間" } } } @@ -11831,6 +12103,12 @@ "state" : "translated", "value" : "帮助开发应用程序" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "幫助App開發" + } } } }, @@ -12107,6 +12385,12 @@ "state" : "translated", "value" : "如何升级固件" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "如何更新韌體" + } } } }, @@ -12133,6 +12417,12 @@ "state" : "translated", "value" : "Влажност" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "濕度" + } } } }, @@ -12280,7 +12570,8 @@ "value" : "IAQ" } } - } + }, + "shouldTranslate" : false }, "IAQ " : { "localizations" : { @@ -12296,7 +12587,8 @@ "value" : "IAQ " } } - } + }, + "shouldTranslate" : false }, "IAQ %lld" : { "localizations" : { @@ -12312,7 +12604,8 @@ "value" : "IAQ %lld" } } - } + }, + "shouldTranslate" : false }, "Icon" : { "localizations" : { @@ -12423,6 +12716,12 @@ "state" : "translated", "value" : "忽略 MQTT" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "忽略 MQTT" + } } } }, @@ -12471,6 +12770,12 @@ "state" : "translated", "value" : "导入路线" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "輸入路徑" + } } } }, @@ -12592,7 +12897,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Incomplete" + "value" : "尚未完成" } } } @@ -12611,6 +12916,12 @@ "state" : "translated", "value" : "Индија" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "印度" + } } } }, @@ -12627,6 +12938,12 @@ "state" : "translated", "value" : "室内空气质量" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "室內空氣品質" + } } } }, @@ -12643,6 +12960,12 @@ "state" : "translated", "value" : "室内空气质量 (IAQ)" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "室內空氣品質(IAQ)" + } } } }, @@ -13179,6 +13502,12 @@ "state" : "translated", "value" : "输入" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "輸入" + } } } }, @@ -13651,6 +13980,12 @@ "state" : "translated", "value" : "四十八小时" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "48小時" + } } } }, @@ -14100,6 +14435,12 @@ "state" : "translated", "value" : "七十二小时" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "72小時" + } } } }, @@ -15115,6 +15456,12 @@ "state" : "translated", "value" : "Јапан" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "日本" + } } } }, @@ -15277,6 +15624,12 @@ "state" : "translated", "value" : "Кореја" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "韓國" + } } } }, @@ -16033,7 +16386,8 @@ "value" : "Дугачки домет - Брзо" } } - } + }, + "shouldTranslate" : false }, "long.range.moderate" : { "extractionState" : "manual", @@ -16050,7 +16404,8 @@ "value" : "Дугачки домет - Умерено" } } - } + }, + "shouldTranslate" : false }, "long.range.slow" : { "extractionState" : "manual", @@ -16067,7 +16422,8 @@ "value" : "Дугачки домет - Споро" } } - } + }, + "shouldTranslate" : false }, "Longitude" : { "localizations" : { @@ -16146,14 +16502,9 @@ "state" : "translated", "value" : "LoRa" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "LoRa" - } } - } + }, + "shouldTranslate" : false }, "lora.config" : { "localizations" : { @@ -16239,6 +16590,12 @@ "state" : "translated", "value" : "Лош" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "弱" + } } } }, @@ -16262,6 +16619,12 @@ "state" : "translated", "value" : "Прихватљив" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "尚可" + } } } }, @@ -16285,6 +16648,12 @@ "state" : "translated", "value" : "Добар" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "良好" + } } } }, @@ -16308,6 +16677,12 @@ "state" : "translated", "value" : "Без" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "無" + } } } }, @@ -16335,6 +16710,12 @@ "state" : "translated", "value" : "Малезија 433MHz" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "馬來西亞 433MHz" + } } } }, @@ -16352,6 +16733,12 @@ "state" : "translated", "value" : "Малезија 919MHz" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "馬來西亞 919MHz" + } } } }, @@ -17028,7 +17415,8 @@ "value" : "Средњи домет - Брзо" } } - } + }, + "shouldTranslate" : false }, "medium.range.slow" : { "extractionState" : "manual", @@ -17045,7 +17433,8 @@ "value" : "Средњи домет - Споро" } } - } + }, + "shouldTranslate" : false }, "Mesh activity update" : { "localizations" : { @@ -17171,12 +17560,6 @@ "state" : "translated", "value" : "Ambient Lighting module config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ambient Lighting module config received: %@" - } } } }, @@ -17236,12 +17619,6 @@ "state" : "translated", "value" : "Bluetooth config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth config received: %@" - } } } }, @@ -17295,12 +17672,6 @@ "state" : "translated", "value" : "Canned Message module config received: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canned Message module config received: %@" - } } } }, @@ -17354,12 +17725,6 @@ "state" : "translated", "value" : "Requested Canned Messages Module Messages for node: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requested Canned Messages Module Messages for node: %@" - } } } }, @@ -17413,12 +17778,6 @@ "state" : "translated", "value" : "Canned Messages Messages Received For: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canned Messages Messages Received For: %@" - } } } }, @@ -17472,12 +17831,6 @@ "state" : "translated", "value" : "Sent a Channel for: %@ Channel Index %d" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a Channel for: %@ Channel Index %d" - } } } }, @@ -17535,7 +17888,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到偵測感應器模組配置:%@" + "value" : "收到偵測感應器模組設定:%@" } } } @@ -17854,7 +18207,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到外部通知模組配置:%@" + "value" : "收到外部通知模組設定:%@" } } } @@ -17984,7 +18337,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "發送LoRa配置給:%@" + "value" : "發送LoRa設定給:%@" } } } @@ -18049,7 +18402,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到MQTT模組配置:%@" + "value" : "收到MQTT模組設定:%@" } } } @@ -18244,7 +18597,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到中繼點訊息: %@" + "value" : "收到節點訊息: %@" } } } @@ -18397,7 +18750,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到位置配置:%@" + "value" : "收到位置設定:%@" } } } @@ -18462,7 +18815,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "從中繼點接收到定位封包: %@" + "value" : "從節點接收到定位封包: %@" } } } @@ -18621,7 +18974,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到RTTTL鈴聲配置:%@" + "value" : "收到RTTTL鈴聲設定:%@" } } } @@ -18751,7 +19104,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到串列模組配置:%@" + "value" : "收到串列模組設定:%@" } } } @@ -18816,7 +19169,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "傳送iOS裝置的GPS定位封包到中繼點上: %@" + "value" : "傳送iOS裝置的GPS定位封包到節點上: %@" } } } @@ -18875,7 +19228,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到儲存與轉發模組配置:%@" + "value" : "收到儲存與轉發模組設定:%@" } } } @@ -19454,7 +19807,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "對 %@ 發出配置請求" + "value" : "已發送設定請求至 %@" } } } @@ -20914,6 +21267,12 @@ "state" : "translated", "value" : "Нови зеланд 865MHz" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "紐西蘭 865MHz" + } } } }, @@ -21132,7 +21491,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "未找到 Meshtastic 中繼點" + "value" : "未找到 Meshtastic 節點" } } } @@ -21367,7 +21726,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "中繼點" + "value" : "節點" } } } @@ -21432,7 +21791,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "中繼點 (%@)" + "value" : "節點 (%@)" } } } @@ -21506,7 +21865,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "未連接到電台" + "value" : "未連接到節點" } } } @@ -21556,6 +21915,12 @@ "state" : "translated", "value" : "Број хопова" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "轉送跳數" + } } } }, @@ -22605,6 +22970,12 @@ "state" : "translated", "value" : "Филипини 433MHz" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "菲律賓 433MHz" + } } } }, @@ -22622,6 +22993,12 @@ "state" : "translated", "value" : "Филипини 868MHz" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "菲律賓 868MHz" + } } } }, @@ -22639,6 +23016,12 @@ "state" : "translated", "value" : "Филипини 915MHz" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "菲律賓 915MHz" + } } } }, @@ -22766,7 +23149,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "電台通過手機獲得定位的時間間隔,但是向 Mesh 網路中更新定位的時間間隔由電台控制。" + "value" : "節點通過手機獲得定位的時間間隔,但是向 Mesh 網路中更新定位的時間間隔由裝置控制。" } } } @@ -23333,7 +23716,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "首選電台" + "value" : "首選節點" } } } @@ -23584,7 +23967,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "電台設定" + "value" : "無線設定" } } } @@ -23986,7 +24369,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "重啟中繼點" + "value" : "重啟節點" } } } @@ -24828,6 +25211,12 @@ "state" : "translated", "value" : "Улога" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "模式" + } } } }, @@ -24844,6 +25233,12 @@ "state" : "translated", "value" : "Улога: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "模式: %@" + } } } }, @@ -24860,6 +25255,12 @@ "state" : "translated", "value" : "Улоге" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "模式" + } } } }, @@ -26239,6 +26640,12 @@ "state" : "translated", "value" : "Русија" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "俄羅斯" + } } } }, @@ -26620,6 +27027,12 @@ "state" : "translated", "value" : "保存包含量程测试报文详细信息的 CSV 文件,目前仅适用于配有网络服务器的 ESP32 设备。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "將距離測試訊息詳情儲存為 CSV 檔,目前僅限於搭載網頁伺服器的 ESP32 裝置使用。" + } } } }, @@ -26937,7 +27350,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "選擇中繼點" + "value" : "選擇節點" } } } @@ -27856,6 +28269,12 @@ "state" : "translated", "value" : "Подешава максималан број скокова. Подразумевано је 3, а повећање броја одобрених скокова такође повећава загушење и треба га користити опрезно. Поруке емитоване са 0 скокова неће добити потврде пријема (ACK)." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定最大轉送跳數,預設值為 3。提高跳數會增加網路擁擠程度,請謹慎使用。跳數為 0 的廣播訊息將不會收到確認回應(ACK)。" + } } } }, @@ -28001,7 +28420,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "分享頻道QRcode" + "value" : "分享 QR Code" } } } @@ -28146,7 +28565,8 @@ "value" : "Кратки домет - Брзо" } } - } + }, + "shouldTranslate" : false }, "short.range.slow" : { "extractionState" : "manual", @@ -28163,7 +28583,8 @@ "value" : "Кратки домет - Споро" } } - } + }, + "shouldTranslate" : false }, "short.range.turbo" : { "extractionState" : "manual", @@ -28180,7 +28601,8 @@ "value" : "Кратки домет - Турбо" } } - } + }, + "shouldTranslate" : false }, "Show alerts" : { "localizations" : { @@ -28353,6 +28775,12 @@ "state" : "translated", "value" : "Сингапур 923MHz" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "新加坡 923MHz" + } } } }, @@ -28909,6 +29337,12 @@ "state" : "translated", "value" : "Тајван" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "台灣 🇹🇼" + } } } }, @@ -28981,7 +29415,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "響應" + "value" : "表情回應" } } } @@ -29616,7 +30050,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "遠測(傳感器)" + "value" : "遙測(傳感器)" } } } @@ -29680,7 +30114,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "遠側設定" + "value" : "遙測設定" } } } @@ -29843,6 +30277,12 @@ "state" : "translated", "value" : "Тајланд" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "泰國" + } } } }, @@ -30053,7 +30493,14 @@ } }, "The Router roles are designed for high vantage locations like mountaintops and towers. This node needs to be able to have a good direct connection to most of the nodes on the network or else this will significantly hurt the network." : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router 模式專為高處位置(如山頂或塔台)設計。此節點必須能夠與網路中的大多數節點保持良好的直接連線,否則將會嚴重影響整體網路效能。" + } + } + } }, "The secondary public key authorized to send admin messages to this node." : { "localizations" : { @@ -30209,6 +30656,12 @@ "state" : "translated", "value" : "该设备将按所选时间间隔发送测距信息。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置將按照設定的時間間隔發送距離測試訊息。" + } } } }, @@ -30656,7 +31109,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "現在 Mesh 上的資料會通過主通道發送。您可以設定輔助通道來建立由自己的金鑰保護的其他訊息組 [頻道設定提示](https://meshtastic.org/docs/configuration/radio/channels/)" + "value" : "您的Mesh網路中大部分資料將透過主要頻道傳輸。若需要額外的訊息群組,您可以設定次要頻道,並設定專屬金鑰進行保護。" } } } @@ -30784,7 +31237,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "在 Meshtastic 網路中最多有 8 個頻道。第一個頻道是主頻道,大多數活動都發生在這裡,也是必需的。如果您不共享主頻道,您的第一個共享頻道就會成為其他網路的主頻道。它會在其主頻道和您的輔助頻道上對話。名稱為 admin 的頻道可遠端控制中繼點。其他頻道用於私人群组,每個群組都有自己的密鑰。" + "value" : "Meshtastic QR Code 包含 LoRa 設定與頻道資訊。選擇「取代頻道」可分享完整設定,「新增頻道」則會將分享的頻道新增到接收設備中。" } } } @@ -30848,7 +31301,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "共享 Meshtastic 頻道" + "value" : "分享 Meshtastic 頻道" } } } @@ -30912,7 +31365,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "您可以發送和接收1對1聊天和群聊。在任何訊息中,您都可以長按查看可用的操作,如複製、回復、拍一拍、刪除以及詳情。" + "value" : "您可以傳送及接收頻道(群組聊天)和私人訊息。對任何訊息長按,可顯示操作選單,包括複製、回覆、表情回應、刪除及傳送詳情等功能。" } } } @@ -30976,7 +31429,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "消息" + "value" : "訊息" } } } @@ -31270,6 +31723,12 @@ "state" : "translated", "value" : "Украјина 433MHz" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "烏克蘭 433MHz" + } } } }, @@ -31287,6 +31746,12 @@ "state" : "translated", "value" : "Украјина 868MHz" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "烏克蘭 868MHz" + } } } }, @@ -31314,6 +31779,12 @@ "state" : "translated", "value" : "Сједињене Америчке државе" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "美國" + } } } }, @@ -31524,7 +31995,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "未設置" + "value" : "未設定" } } } @@ -32164,7 +32635,8 @@ "value" : "Веома дугачки домет - Споро" } } - } + }, + "shouldTranslate" : false }, "Via Lora" : { "localizations" : { @@ -32179,6 +32651,12 @@ "state" : "translated", "value" : "Преко LoRA" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "經由 LoRa" + } } } }, @@ -32275,11 +32753,24 @@ "state" : "translated", "value" : "Напон" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電壓" + } } } }, "Volts %@" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 伏特" + } + } + } }, "Waiting" : { "localizations" : { @@ -32400,6 +32891,12 @@ "state" : "translated", "value" : "天气状况" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "天氣狀況" + } } } }, @@ -32411,7 +32908,8 @@ "value" : "Веб флашер" } } - } + }, + "shouldTranslate" : false }, "Website" : { "localizations" : { @@ -32426,6 +32924,12 @@ "state" : "translated", "value" : "网站" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "網站" + } } } }, @@ -32531,6 +33035,12 @@ "state" : "translated", "value" : "Опције вајфаја" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "WiFi 選項" + } } } }, @@ -32577,7 +33087,8 @@ "value" : "x" } } - } + }, + "shouldTranslate" : false }, "X: %@, Y: %d" : { "localizations" : { @@ -32659,7 +33170,8 @@ "value" : "y" } } - } + }, + "shouldTranslate" : false }, "Yesterday" : { "localizations" : { @@ -32674,6 +33186,12 @@ "state" : "translated", "value" : "Јуче" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "昨天" + } } } }, From 43b7be81ee755c330c40cabb091f9e6be9af9a66 Mon Sep 17 00:00:00 2001 From: Uno Huang Date: Mon, 7 Apr 2025 14:26:58 -0400 Subject: [PATCH 10/93] some translation --- Localizable.xcstrings | 351 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 311 insertions(+), 40 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index a60c69f0..383402bd 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -18,7 +18,8 @@ "value" : "\t%@" } } - } + }, + "shouldTranslate" : false }, " %@" : { "localizations" : { @@ -34,10 +35,11 @@ "value" : " %@" } } - } + }, + "shouldTranslate" : false }, " %@%%" : { - + "shouldTranslate" : false }, ": %@" : { "localizations" : { @@ -53,7 +55,8 @@ "value" : ": %@" } } - } + }, + "shouldTranslate" : false }, ": %d" : { "localizations" : { @@ -69,7 +72,8 @@ "value" : ": %d" } } - } + }, + "shouldTranslate" : false }, "(Re)define PIN_GPS_EN for your board." : { "localizations" : { @@ -107,7 +111,8 @@ "value" : "%@" } } - } + }, + "shouldTranslate" : false }, "%@ - %@" : { "localizations" : { @@ -129,7 +134,8 @@ "value" : "%1$@ - %2$@" } } - } + }, + "shouldTranslate" : false }, "%@ - %@ - %@" : { "localizations" : { @@ -151,7 +157,8 @@ "value" : "%1$@ - %2$@ - %3$@" } } - } + }, + "shouldTranslate" : false }, "%@ - %@ Towards %@ Back" : { "localizations" : { @@ -251,7 +258,8 @@ "value" : "%1$@ (%2$@)" } } - } + }, + "shouldTranslate" : false }, "%@ %@" : { "localizations" : { @@ -273,7 +281,8 @@ "value" : "%1$@ %2$@" } } - } + }, + "shouldTranslate" : false }, "%@ %lld" : { "localizations" : { @@ -295,7 +304,8 @@ "value" : "%1$@ %2$lld" } } - } + }, + "shouldTranslate" : false }, "%@ away" : { "localizations" : { @@ -348,6 +358,12 @@ "state" : "translated", "value" : "%@ 频道?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 頻道?" + } } } }, @@ -581,7 +597,8 @@ "value" : "%1$@, %2$@" } } - } + }, + "shouldTranslate" : false }, "%@: %lld / %lld" : { "localizations" : { @@ -603,7 +620,8 @@ "value" : "%1$@: %2$lld / %3$lld" } } - } + }, + "shouldTranslate" : false }, "%@%%" : { "localizations" : { @@ -619,7 +637,8 @@ "value" : "%@%%" } } - } + }, + "shouldTranslate" : false }, "%@°F" : { "localizations" : { @@ -635,7 +654,8 @@ "value" : "%@°F" } } - } + }, + "shouldTranslate" : false }, "%@mA" : { "localizations" : { @@ -645,7 +665,8 @@ "value" : "%@mA" } } - } + }, + "shouldTranslate" : false }, "%@V" : { "localizations" : { @@ -655,7 +676,8 @@ "value" : "%@V" } } - } + }, + "shouldTranslate" : false }, "%d" : { "localizations" : { @@ -671,7 +693,8 @@ "value" : "%d" } } - } + }, + "shouldTranslate" : false }, "%d Hops" : { "localizations" : { @@ -746,6 +769,24 @@ } } } + }, + "zh-Hant-TW" : { + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d Hops" + } + }, + "zero" : { + "stringUnit" : { + "state" : "translated", + "value" : "直連" + } + } + } + } } } }, @@ -763,7 +804,8 @@ "value" : "%d%%" } } - } + }, + "shouldTranslate" : false }, "%lf" : { "localizations" : { @@ -779,7 +821,8 @@ "value" : "%lf" } } - } + }, + "shouldTranslate" : false }, "%lld" : { "localizations" : { @@ -795,7 +838,8 @@ "value" : "%lld" } } - } + }, + "shouldTranslate" : false }, "%lld or less hops away" : { "localizations" : { @@ -979,7 +1023,8 @@ "value" : "7" } } - } + }, + "shouldTranslate" : false }, "8" : { "localizations" : { @@ -995,7 +1040,8 @@ "value" : "8" } } - } + }, + "shouldTranslate" : false }, "25" : { "localizations" : { @@ -1011,7 +1057,8 @@ "value" : "25" } } - } + }, + "shouldTranslate" : false }, "50" : { "localizations" : { @@ -1027,7 +1074,8 @@ "value" : "50" } } - } + }, + "shouldTranslate" : false }, "75" : { "localizations" : { @@ -1043,7 +1091,8 @@ "value" : "75" } } - } + }, + "shouldTranslate" : false }, "100" : { "localizations" : { @@ -1059,7 +1108,8 @@ "value" : "100" } } - } + }, + "shouldTranslate" : false }, "128 bit" : { "localizations" : { @@ -1102,6 +1152,12 @@ "state" : "translated", "value" : "Трејсрут је послат, али одговор није примљен." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已發送 Trace Route,但未收到任何回應。" + } } } }, @@ -1167,7 +1223,8 @@ "value" : "Ack SNR: %@ dB" } } - } + }, + "shouldTranslate" : false }, "Ack Time: %@" : { "localizations" : { @@ -1176,6 +1233,12 @@ "state" : "translated", "value" : "Ack време: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ack 時間: %@" + } } } }, @@ -1186,6 +1249,12 @@ "state" : "translated", "value" : "Потврђен од стране другог чвора" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已被其他節點確認接收。" + } } } }, @@ -1202,6 +1271,12 @@ "state" : "translated", "value" : "Акције" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "動作" + } } } }, @@ -1346,6 +1421,12 @@ "state" : "translated", "value" : "管理员" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "遠端管理" + } } } }, @@ -1968,6 +2049,12 @@ "state" : "translated", "value" : "这是一个开源、离网、分布式 Mesh 网络,可在价格低廉的低功率无线电设备上运行。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "一個開源、離線運作、去中心化的網狀網路,運行於平價且低功耗的無線電設備上。" + } } } }, @@ -2000,6 +2087,12 @@ "state" : "translated", "value" : "App 数据" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "App 資料" + } } } }, @@ -2016,6 +2109,12 @@ "state" : "translated", "value" : "App 文件" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "App 檔案" + } } } }, @@ -2032,6 +2131,12 @@ "state" : "translated", "value" : "App 设置" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "App 設定" + } } } }, @@ -2049,7 +2154,8 @@ "value" : "Apple Apps" } } - } + }, + "shouldTranslate" : false }, "Approximate Location" : { "localizations" : { @@ -6856,6 +6962,12 @@ "state" : "translated", "value" : "删除所有环境指标?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "刪除所有環境資料?" + } } } }, @@ -7290,6 +7402,12 @@ "state" : "translated", "value" : "设备由 Mesh 管理员管理,用户无法访问任何设备设置。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置由 Mesh 遠端管理,使用者無法存取任何裝置設定。" + } } } }, @@ -9285,6 +9403,12 @@ "state" : "translated", "value" : "文档" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "文檔" + } } } }, @@ -9349,6 +9473,12 @@ "state" : "translated", "value" : "拖放升级固件文档" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "拖放更新韌體操作說明" + } } } }, @@ -9693,6 +9823,12 @@ "state" : "translated", "value" : "启用以太网将禁用应用程序的蓝牙连接。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用乙太網路後,將會停用與應用程式的藍牙連線。" + } } } }, @@ -9709,6 +9845,12 @@ "state" : "translated", "value" : "启用 WiFi 将禁用应用程序的蓝牙连接。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用 Wi-Fi 後,將會停用與應用程式的藍牙連線。" + } } } }, @@ -9859,6 +10001,12 @@ "state" : "translated", "value" : "环境" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "環境" + } } } }, @@ -9881,6 +10029,12 @@ "state" : "translated", "value" : "环境" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "環境" + } } } }, @@ -9897,6 +10051,12 @@ "state" : "translated", "value" : "环境指标日志" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "環境數據記錄" + } } } }, @@ -15722,6 +15882,12 @@ "state" : "translated", "value" : "Стари начин администрације" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "舊版遠端管理" + } } } }, @@ -21337,6 +21503,12 @@ "state" : "translated", "value" : "没有环境指标" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "無環境數據" + } } } }, @@ -22353,6 +22525,12 @@ "state" : "translated", "value" : "打开设置" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "打開設定" + } } } }, @@ -23203,6 +23381,12 @@ "state" : "translated", "value" : "基于 PKI 的节点管理,需要 2.5 以上版本的固件" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "基於 PKI 的遠端管理,需搭配 2.5 版以上的韌體。" + } } } }, @@ -23219,6 +23403,12 @@ "state" : "translated", "value" : "请连接电台以修改配置。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "請先連接裝置來進行設定。" + } } } }, @@ -23527,6 +23717,12 @@ "state" : "translated", "value" : "Снага" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電源" + } } } }, @@ -23537,6 +23733,12 @@ "state" : "translated", "value" : "Мерни подаци о снази" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電源指標" + } } } }, @@ -23547,15 +23749,11 @@ "state" : "translated", "value" : "Логови метрике снаге" } - } - } - }, - "Power Metrics Log}" : { - "localizations" : { - "sr" : { + }, + "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Логови метрике снаге}" + "value" : "電源指標紀錄" } } } @@ -23564,9 +23762,15 @@ "localizations" : { "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Искључи" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "關機" + } } } }, @@ -23574,9 +23778,15 @@ "localizations" : { "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Опције снаге" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電源選項" + } } } }, @@ -23604,6 +23814,12 @@ "state" : "translated", "value" : "Обрисати све логове метрике снаге?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "刪除所有電源指標紀錄?" + } } } }, @@ -23621,6 +23837,12 @@ "state" : "translated", "value" : "Логови метрике снаге" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電源指標紀錄" + } } } }, @@ -23644,15 +23866,21 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Genaue Position" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Прецизне локације" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "精確位置" + } } } }, @@ -23827,6 +24055,12 @@ "state" : "translated", "value" : "项目信息" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "專案資訊" + } } } }, @@ -24573,6 +24807,12 @@ "state" : "translated", "value" : "区域" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "區域" + } } } }, @@ -24738,6 +24978,12 @@ "state" : "translated", "value" : "Даљинска администрација за: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在為 %@ 執行遠端設定" + } } } }, @@ -24932,6 +25178,12 @@ "state" : "translated", "value" : "重置 App 设置" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "重置 App 設定" + } } } }, @@ -25066,6 +25318,12 @@ "state" : "translated", "value" : "审查应用程序" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "為應用程式留下評價" + } } } }, @@ -32593,6 +32851,7 @@ } }, "Version: %@ (%@) " : { + "comment" : "In the \"About\" under \"Apple Apps\"", "localizations" : { "de" : { "stringUnit" : { @@ -32617,6 +32876,12 @@ "state" : "translated", "value" : "版本号: %1$@ (%2$@) " } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "版本: %1$@ (%2$@) " + } } } }, @@ -32977,6 +33242,12 @@ "state" : "translated", "value" : "什么是 Meshtastic?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "什麼是 Meshtastic?" + } } } }, From 89ac89cb133ecb7c09693c768cd1cd9c190b9744 Mon Sep 17 00:00:00 2001 From: Uno Huang Date: Mon, 7 Apr 2025 14:32:42 -0400 Subject: [PATCH 11/93] some translation --- Localizable.xcstrings | 73 +++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 383402bd..b88659e7 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -1459,6 +1459,12 @@ "state" : "translated", "value" : "高级设备 GPS" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "進階裝置 GPS" + } } } }, @@ -4717,7 +4723,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "人流計數器" + "value" : "PAX 計數器" } } } @@ -4775,7 +4781,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "人流計數器設定" + "value" : "PAX 計數器設定" } } } @@ -7386,6 +7392,12 @@ "state" : "translated", "value" : "设备 GPS" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置 GPS" + } } } }, @@ -15866,6 +15878,12 @@ "state" : "translated", "value" : "LED 状态" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "LED 狀態燈" + } } } }, @@ -19270,7 +19288,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到串列模組設定:%@" + "value" : "收到序列模組設定:%@" } } } @@ -23116,7 +23134,8 @@ "value" : "ВајФај" } } - } + }, + "shouldTranslate" : false }, "Perform a factory reset on the node you are connected to" : { "localizations" : { @@ -23707,6 +23726,12 @@ "state" : "translated", "value" : "位置将由设备 GPS 提供,如果选择禁用或不存在,则可以设置固定位置。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置的 GPS 會提供定位資訊,如果選擇「已停用」或「無此功能」,則可以手動設定固定位置。" + } } } }, @@ -27819,6 +27844,12 @@ "state" : "translated", "value" : "发送间隔" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "傳送頻率" + } } } }, @@ -27965,7 +27996,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "串口" + "value" : "序列" } } } @@ -27983,6 +28014,12 @@ "state" : "translated", "value" : "Серијска конзола" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "序列主控台" + } } } }, @@ -28061,7 +28098,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "串口設定" + "value" : "序列設定" } } } @@ -28252,12 +28289,6 @@ "state" : "translated", "value" : "Protobufs" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Protobufs" - } } } }, @@ -28317,12 +28348,6 @@ "state" : "translated", "value" : "简单" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "簡單" - } } } }, @@ -28382,12 +28407,6 @@ "state" : "translated", "value" : "文本消息" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "文本訊息" - } } } }, @@ -30800,6 +30819,12 @@ "state" : "translated", "value" : "Стање LED диоде (укључено/искључено)" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "LED狀態燈開關" + } } } }, From 719ad995524842c54cfc26a12e774f256a780406 Mon Sep 17 00:00:00 2001 From: Uno Huang Date: Mon, 7 Apr 2025 14:38:32 -0400 Subject: [PATCH 12/93] some translation --- Localizable.xcstrings | 131 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 128 insertions(+), 3 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index b88659e7..8d05dbc5 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -854,6 +854,12 @@ "state" : "translated", "value" : "%lld или мање скокова" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld 或更少的Hops以外" + } } } }, @@ -1351,6 +1357,12 @@ "state" : "translated", "value" : "Додај у омиљене" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "加入最愛" + } } } }, @@ -6595,6 +6607,12 @@ "state" : "translated", "value" : "无法找到节点" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "找不到節點" + } } } }, @@ -9399,6 +9417,12 @@ "state" : "translated", "value" : "距离" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "距離" + } } } }, @@ -9935,7 +9959,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "加密" + "value" : "已加密" } } } @@ -9959,6 +9983,12 @@ "state" : "translated", "value" : "加密" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已加密" + } } } }, @@ -9975,6 +10005,12 @@ "state" : "translated", "value" : "启用加密" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "加密已啟用" + } } } }, @@ -10527,6 +10563,12 @@ "state" : "translated", "value" : "Омиљени" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "最愛" + } } } }, @@ -10543,6 +10585,12 @@ "state" : "translated", "value" : "Омиљени" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "最愛" + } } } }, @@ -10611,6 +10659,12 @@ "state" : "translated", "value" : "Пронађи контакт" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "搜尋聯絡人" + } } } }, @@ -10627,6 +10681,12 @@ "state" : "translated", "value" : "Пронађи чвор" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "搜尋節點" + } } } }, @@ -12359,6 +12419,12 @@ "state" : "translated", "value" : "Скокови удаљености" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hops 以外" + } } } }, @@ -12375,6 +12441,12 @@ "state" : "translated", "value" : "Удаљено %d скокова" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hops 以外 %d" + } } } }, @@ -12391,6 +12463,12 @@ "state" : "translated", "value" : "Скокови удаљености:" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hops 以外:" + } } } }, @@ -12407,6 +12485,12 @@ "state" : "translated", "value" : "Скокови удаљености: %d" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hops 以外: %d" + } } } }, @@ -12926,6 +13010,12 @@ "state" : "translated", "value" : "忽略" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已忽略" + } } } }, @@ -16686,9 +16776,14 @@ "state" : "translated", "value" : "LoRa" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "LoRa" + } } - }, - "shouldTranslate" : false + } }, "lora.config" : { "localizations" : { @@ -20441,6 +20536,12 @@ "state" : "translated", "value" : "Минимум раздаљине" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "最短距離" + } } } }, @@ -20701,6 +20802,12 @@ "state" : "translated", "value" : "MQTT" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "MQTT" + } } } }, @@ -22521,6 +22628,12 @@ "state" : "translated", "value" : "На мрежи" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "在線" + } } } }, @@ -25077,6 +25190,12 @@ "state" : "translated", "value" : "从忽略中删除" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "從忽略中移除" + } } } }, @@ -32969,6 +33088,12 @@ "state" : "translated", "value" : "通过 MQTT" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "經由 Mqtt" + } } } }, From 114f3c35cc5cf5e9b43ee7e586d32907b1c813a4 Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Fri, 18 Apr 2025 13:09:18 -0700 Subject: [PATCH 13/93] Fixed transparent tab view --- Meshtastic/Views/ContentView.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Meshtastic/Views/ContentView.swift b/Meshtastic/Views/ContentView.swift index d6b2fd6b..50734893 100644 --- a/Meshtastic/Views/ContentView.swift +++ b/Meshtastic/Views/ContentView.swift @@ -11,6 +11,12 @@ struct ContentView: View { @ObservedObject var router: Router + init(appState: AppState, router: Router) { + self.appState = appState + self.router = router + UITabBar.appearance().scrollEdgeAppearance = UITabBarAppearance(idiom: .unspecified) + } + var body: some View { TabView(selection: $appState.router.navigationState.selectedTab) { Messages( From dc00d8d118c18f88967d769934541710123cdd9d Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sat, 19 Apr 2025 06:49:15 -0500 Subject: [PATCH 14/93] Add delegate to fix tls issues with cocoamqtt --- Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift b/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift index cac34de8..1fa45f2e 100644 --- a/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift +++ b/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift @@ -40,8 +40,8 @@ class MqttClientProxyManager { if let host = host { let port = defaultServerPort - var username = node.mqttConfig?.username - var password = node.mqttConfig?.password + let username = node.mqttConfig?.username + let password = node.mqttConfig?.password // if host == defaultServerAddress { //username = ProcessInfo.processInfo.environment["PUBLIC_MQTT_USERNAME"] //password = ProcessInfo.processInfo.environment["PUBLIC_MQTT_PASSWORD"] @@ -130,6 +130,9 @@ extension MqttClientProxyManager: CocoaMQTTDelegate { self.disconnect() } } + func mqtt(_ mqtt: CocoaMQTT, didReceive trust: SecTrust, completionHandler: @escaping (Bool) -> Void) { + completionHandler(true) + } func mqttDidDisconnect(_ mqtt: CocoaMQTT, withError err: Error?) { Logger.mqtt.debug("📲 [MQTT Client Proxy] disconnected: \(err?.localizedDescription ?? "", privacy: .public)") if let error = err { From 5e6486b8d4f8c4634b42f078605cf52e3762047e Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sat, 19 Apr 2025 07:06:56 -0500 Subject: [PATCH 15/93] Update Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../Helpers/Mqtt/MqttClientProxyManager.swift | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift b/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift index 1fa45f2e..450dbc52 100644 --- a/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift +++ b/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift @@ -131,8 +131,24 @@ extension MqttClientProxyManager: CocoaMQTTDelegate { } } func mqtt(_ mqtt: CocoaMQTT, didReceive trust: SecTrust, completionHandler: @escaping (Bool) -> Void) { - completionHandler(true) + var isValid = false + #if canImport(Security) + if #available(macOS 10.15, iOS 13.0, *) { + isValid = SecTrustEvaluateWithError(trust, nil) + } else { + var result: SecTrustResultType = .invalid + let status = SecTrustEvaluate(trust, &result) + isValid = (status == errSecSuccess) && (result == .unspecified || result == .proceed) } + #endif + if isValid { + Logger.mqtt.info("📲 [MQTT Client Proxy] TLS validation succeeded.") + completionHandler(true) + } else { + Logger.mqtt.error("📲 [MQTT Client Proxy] TLS validation failed.") + completionHandler(false) + } + } func mqttDidDisconnect(_ mqtt: CocoaMQTT, withError err: Error?) { Logger.mqtt.debug("📲 [MQTT Client Proxy] disconnected: \(err?.localizedDescription ?? "", privacy: .public)") if let error = err { From d4ece62cce1bfd0b6654a89d0ac9c5c3d3e39b3f Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sat, 19 Apr 2025 07:09:08 -0500 Subject: [PATCH 16/93] Complete anyway --- Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift b/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift index 450dbc52..569379b5 100644 --- a/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift +++ b/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift @@ -145,8 +145,8 @@ extension MqttClientProxyManager: CocoaMQTTDelegate { Logger.mqtt.info("📲 [MQTT Client Proxy] TLS validation succeeded.") completionHandler(true) } else { - Logger.mqtt.error("📲 [MQTT Client Proxy] TLS validation failed.") - completionHandler(false) + Logger.mqtt.warning("📲 [MQTT Client Proxy] TLS validation failed.") + completionHandler(true) } } func mqttDidDisconnect(_ mqtt: CocoaMQTT, withError err: Error?) { From be5540eda57d5a520f7d4f3ba913de5dc130b92f Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 20 Apr 2025 10:38:51 -0700 Subject: [PATCH 17/93] Remove impossible cases --- Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift b/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift index 569379b5..6dc1854b 100644 --- a/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift +++ b/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift @@ -8,6 +8,7 @@ import Foundation import CocoaMQTT import OSLog +import Security protocol MqttClientProxyManagerDelegate: AnyObject { func onMqttConnected() @@ -131,16 +132,7 @@ extension MqttClientProxyManager: CocoaMQTTDelegate { } } func mqtt(_ mqtt: CocoaMQTT, didReceive trust: SecTrust, completionHandler: @escaping (Bool) -> Void) { - var isValid = false - #if canImport(Security) - if #available(macOS 10.15, iOS 13.0, *) { - isValid = SecTrustEvaluateWithError(trust, nil) - } else { - var result: SecTrustResultType = .invalid - let status = SecTrustEvaluate(trust, &result) - isValid = (status == errSecSuccess) && (result == .unspecified || result == .proceed) - } - #endif + let isValid = SecTrustEvaluateWithError(trust, nil) if isValid { Logger.mqtt.info("📲 [MQTT Client Proxy] TLS validation succeeded.") completionHandler(true) From 8729dfa656f61c875ebe9e5c25c8bb208c5c3924 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Mon, 21 Apr 2025 17:44:21 -0700 Subject: [PATCH 18/93] MQTT Map report opt in prototype, add legacy admin channel back to restricted channels. --- Localizable.xcstrings | 15 +++++++++++++++ Meshtastic/Views/Messages/ChannelList.swift | 2 +- .../Views/Settings/Config/Module/MQTTConfig.swift | 9 +++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 43a11bb0..6ca06337 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -2748,6 +2748,12 @@ } } } + }, + "By enabling the map report your node will periodically send a totally unencrypted packet to the configured MQTT server irrigardness of any channel specific uplink and downling MQTT Settings. This report includes short and long name, position, hardware model, role, firmware version, LoRa region, modem preset and primary channel name" : { + + }, + "By enabling this feature, you acknowledge and expressly consent to the transmission of your device’s real-time geographic location over the MQTT protocol without encryption. This location data may be used for purposes such as live map reporting, device tracking, and related telemetry functions." : { + }, "Bytes" : { "extractionState" : "migrated", @@ -5938,6 +5944,9 @@ } } } + }, + "Consent to Share Unencrypted Location Data via MQTT" : { + }, "contacts" : { "extractionState" : "manual", @@ -12265,6 +12274,9 @@ } } } + }, + "I have read and understand the above. I voluntarily consent to the unencrypted transmission of my location data via MQTT for map reporting purposes." : { + }, "IAQ" : { "localizations" : { @@ -22822,6 +22834,9 @@ } } } + }, + "Please be advised that because MQTT transmission is not encrypted by default, your location data may be stored permanently and displayed by third parties. Meshtastic does not assume responsibility for any such unauthorized access or disclosure resulting from unencrypted transmission." : { + }, "Please connect to a radio to configure settings." : { "localizations" : { diff --git a/Meshtastic/Views/Messages/ChannelList.swift b/Meshtastic/Views/Messages/ChannelList.swift index a4fd86bf..426cb0c7 100644 --- a/Meshtastic/Views/Messages/ChannelList.swift +++ b/Meshtastic/Views/Messages/ChannelList.swift @@ -24,7 +24,7 @@ struct ChannelList: View { @State private var isPresentingTraceRouteSentAlert = false - var restrictedChannels = ["gpio", "mqtt", "serial"] + var restrictedChannels = ["gpio", "mqtt", "serial", "admin"] @ViewBuilder private func makeChannelRow( diff --git a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift index 29b06464..046d86aa 100644 --- a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift @@ -30,6 +30,7 @@ struct MQTTConfig: View { @State var mqttConnected: Bool = false @State var defaultTopic = "msh/US" @State var nearbyTopics = [String]() + @State var mapReportingOptIn = false @State var mapReportingEnabled = false @State var mapPublishIntervalSecs = 3600 @State var mapPositionPrecision: Double = 14.0 @@ -92,9 +93,17 @@ struct MQTTConfig: View { } Section(header: Text("Map Report")) { + Text("Consent to Share Unencrypted Location Data via MQTT") + .font(.title2) + Text("By enabling this feature, you acknowledge and expressly consent to the transmission of your device’s real-time geographic location over the MQTT protocol without encryption. This location data may be used for purposes such as live map reporting, device tracking, and related telemetry functions.") + Text("Please be advised that because MQTT transmission is not encrypted by default, your location data may be stored permanently and displayed by third parties. Meshtastic does not assume responsibility for any such unauthorized access or disclosure resulting from unencrypted transmission.") + Toggle(isOn: $mapReportingOptIn) { + Label("I have read and understand the above. I voluntarily consent to the unencrypted transmission of my location data via MQTT for map reporting purposes.", systemImage: "hand.raised") + } Toggle(isOn: $mapReportingEnabled) { Label("enabled", systemImage: "map") + Text("By enabling the map report your node will periodically send a totally unencrypted packet to the configured MQTT server irrigardness of any channel specific uplink and downling MQTT Settings. This report includes short and long name, position, hardware model, role, firmware version, LoRa region, modem preset and primary channel name") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) if mapReportingEnabled { From 05de2af1f617238a404da392a9df580a2f432555 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Tue, 22 Apr 2025 20:29:07 -0700 Subject: [PATCH 19/93] Remove stale keys and languages with no translations --- Localizable.xcstrings | 2263 +------------------------- Meshtastic.xcodeproj/project.pbxproj | 2 - 2 files changed, 5 insertions(+), 2260 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 87e7edb3..98364266 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -1,6 +1,9 @@ { "sourceLanguage" : "en", "strings" : { + "" : { + + }, "\t%@" : { "localizations" : { "it" : { @@ -1767,59 +1770,6 @@ } } }, - "ago" : { - "comment" : "Three hours ago = Три сата пре", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "her" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "auparavant" - } - }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "עברו" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "fa" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "temu" - } - }, - "se" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "sedan" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "пре" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "之前" - } - } - } - }, "Airtime" : { "localizations" : { "de" : { @@ -2734,28 +2684,6 @@ } } }, - "Backup Database" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Database di backup" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Резервна база података" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "备份数据库" - } - } - } - }, "Bandwidth" : { "localizations" : { "de" : { @@ -5380,98 +5308,6 @@ } } }, - "config.power.ls.secs" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Light Sleep Interval" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Light Sleep Interval" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervallo di sospensione leggera" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Light Sleep Interval" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervall för Ljussömn" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Интервал благог спавања" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "轻度睡眠间隔" - } - } - } - }, - "config.power.min.wake.secs" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Minimum Wake Interval" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Minimum Wake Interval" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervallo minimo di risveglio" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Minimum Wake Interval" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Minsta Väckningsintervall" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Минимални интервал будног стања" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "最小唤醒间隔" - } - } - } - }, "config.power.saving" : { "localizations" : { "de" : { @@ -5622,58 +5458,6 @@ } } }, - "config.power.section.sleep" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Schlafmodus" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sleep" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sleep" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sospensione" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sleep" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sömn" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Стане спавања" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "休眠" - } - } - } - }, "config.power.settings" : { "localizations" : { "de" : { @@ -5876,110 +5660,6 @@ } } }, - "config.power.wait.bluetooth.secs" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth Aus nach" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth Off After" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth Off After" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth spento dopo" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth Off After" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth Stängs Av Efter" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Блутут се искључује након" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "蓝牙关闭 After" - } - } - } - }, - "config.ringtone" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Klingelton" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Ringtone" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Ringtone" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Suoneria RTTTL" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Ringtone" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Ringsignal" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL мелодија звона" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL 铃声" - } - } - } - }, "config.ringtone.description" : { "localizations" : { "en" : { @@ -6594,64 +6274,6 @@ }, "Consent to Share Unencrypted Location Data via MQTT" : { - }, - "contacts" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontakte" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contacts" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contacts" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אנשי קשר" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contatti" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontakty" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontakter" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Контакти" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "联系人" - } - } - } }, "contacts %@" : { "localizations" : { @@ -10113,64 +9735,6 @@ } } }, - "email.address" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email Adresse" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email Address" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adresse mail" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "כתובת דואר אלקטרוני" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Indirizzo e-mail" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adres Email" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-postadress" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Имејл адреса" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "邮件地址" - } - } - } - }, "Emoji" : { "localizations" : { "it" : { @@ -10359,27 +9923,8 @@ } } }, - "Enables the store and forward module. Store and forward must be enabled on both client and router devices." : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abilita il modulo store and forward. Store and forward deve essere abilitato su entrambi i dispositivi client e router." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Омогућава модул за чување и пренос. Чување и пренос мора бити омогућено на оба уређаја, клијенту и рутеру." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "启用存储和转发模块。客户端和路由器设备都必须启用存储和转发功能。" - } - } - } + "Enables the store and forward module." : { + }, "Enabling Ethernet will disable the bluetooth connection to the app." : { "localizations" : { @@ -11895,116 +11440,6 @@ } } }, - "gas" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gaz" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "דלק" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gaz" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Гас" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "气体" - } - } - } - }, - "gas.resistance" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas Resistance" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Résistence du gaz" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas Resistance" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Resistenza ai gas" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odporność na Gaz" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gasmotstånd" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Отпорност на гас" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "气体阻抗" - } - } - } - }, "generate.qr.code" : { "localizations" : { "de" : { @@ -13017,64 +12452,6 @@ } } }, - "heard.last" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zuletzt gehört" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Last Heard" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Capté pour la dernière fois" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "נשמע לאחרונה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ultimo ascolto" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ostatnio Słyszane" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Senast Hörd" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Прво откривање" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "最后收到" - } - } - } - }, "Help with App Development" : { "localizations" : { "it" : { @@ -13519,28 +12896,6 @@ } } }, - "HUMIDITY" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "LUFTFEUCHTIGKEIT" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "UMIDITÀ" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "ВЛАЖНОСТ" - } - } - } - }, "hybrid" : { "localizations" : { "de" : { @@ -14672,28 +14027,6 @@ } } }, - "interval.eventytwo.hours" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "intervallo.eventodue.ore" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Двадесет и два сата" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "七十二小时" - } - } - } - }, "interval.fifteen.minutes" : { "localizations" : { "de" : { @@ -15970,122 +15303,6 @@ } } }, - "interval.twenty.seconds" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zwanzig Sekunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twenty Seconds" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vingt secondes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "עשרים שניות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Venti secondi" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dwadzieścia Sekund" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tjugo Sekunder" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Двадесет секунди" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "二十秒" - } - } - } - }, - "interval.twentyfive.seconds" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fünfundzwanzig Sekunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twenty Five Seconds" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vingt cinq secondes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "עשרים וחמש שניות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Venticinque secondi" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dwadzieścia Pięć Sekund" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tjugofem Sekunder" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Двадесет пет секунди" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "二十五秒" - } - } - } - }, "interval.twentyfour.hours" : { "localizations" : { "de" : { @@ -16478,64 +15695,6 @@ } } }, - "keyboard.type" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keyboard Typ" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keyboard Type" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Type de clavier" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "סוג מקלדת" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo di tastiera" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Typ Klawiatury" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tangentbordstyp" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Тип тастатуре" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "键盘类型" - } - } - } - }, "Korea" : { "localizations" : { "en" : { @@ -17952,58 +17111,6 @@ } } }, - "map.centering" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Centering Mode" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mode centré" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מכשיר במרכז" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modalità di centratura" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tryb Wyśrodkowania" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Centreringsläge" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Режим центрирања" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "居中" - } - } - } - }, "map.tiles.delete" : { "localizations" : { "en" : { @@ -18056,180 +17163,6 @@ } } }, - "map.type" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kartentyp" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Default Type" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Type par défaut" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "סוג ברירת מחדל" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo predefinito" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Domyślny Typ" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Standardtyp" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подразумевани тип" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "地图类型" - } - } - } - }, - "map.use.legacy" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Use Legacy Mesh Map" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Use Legacy Mesh Map" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Utiliser l'ancienne génération de carte de maillage" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "השתמש במפה מדור קודם" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Usare la mappa mesh legacy" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Use Legacy Mesh Map" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Använd Äldre Mesh Karta" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Користите легаси мрежну мапу" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "使用传统网状地图" - } - } - } - }, - "map.usertrackingmode" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "User tracking mode" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "User tracking mode" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mode suivre l'utilisateur" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מצב מעקב אחר משתמש" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modalità di tracciamento dell'utente" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tryb śledzenia użytkownika" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Spårningsläge för användare" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Мод праћења корисника" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "用户跟随模式" - } - } - } - }, "map.usertrackingmode.follow" : { "localizations" : { "de" : { @@ -18522,64 +17455,6 @@ } } }, - "mesh.log" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mesh Log" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mesh Log" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Journal du maillage" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "יומן מש" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Registro di mesh" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dziennik Sieci" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mesh-logg" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Логови мреже" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mesh 日志" - } - } - } - }, "mesh.log.ambientlighting.config %@" : { "localizations" : { "en" : { @@ -19066,64 +17941,6 @@ } } }, - "mesh.log.devicemetadata %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anforderung der Geräte Metadaten für %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requesting Device Metadata for %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Demande des metadatas de l'appareil à %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מבקש מטא-דאטה עבור %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Richiesta dei metadati del dispositivo per %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Żądanie metadanych urządzenia dla %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Begär metadata för enhet för %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Захтевање метаподатака уређаја за %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requesting Device Metadata for %@" - } - } - } - }, "mesh.log.display.config %@" : { "localizations" : { "de" : { @@ -20438,64 +19255,6 @@ } } }, - "mesh.log.traceroute.received.direct %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Traceroute Anforderung an Knoten gesendet: %@ wurde direkt empfangen." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trace Route request sent to node: %@ was recieived directly." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La demande de Trace Route envoyée au noeud : %@ a été directement reçue." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "בקשת בדיקת מסלול נשלחה למכשיר: %@ התקבל ישירות." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trace La richiesta di rotta inviata al nodo: %@ è stata ricevuta direttamente." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Żądanie śledzenia trasy wysłane do węzła: %@ zostało odebrane bezpośrednio." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Spårruttförfrågan skickad till nod: %@ mottogs direkt." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Захтев за тражење путања послат на чвор: %@ је примљен директно." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trace Route request sent to node: %@ was recieived directly." - } - } - } - }, "mesh.log.traceroute.received.route %@" : { "localizations" : { "de" : { @@ -22088,64 +20847,6 @@ } } }, - "New Node Notifications" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mitteilungen über neue Knoten" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "New Node Notifications" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "New Node Notifications" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "New Node Notifications" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notifiche di nuovi nodi" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "New Node Notifications" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "New Node Notifications" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Обавештења о новим чворовима" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "新节点通知" - } - } - } - }, "New Zealand 865mhz" : { "localizations" : { "en" : { @@ -22352,64 +21053,6 @@ } } }, - "no.nodes" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Meshtastic Knoten gefunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No Meshtastic Nodes Found" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucun noeud Meshtastic trouvé" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "לא נמצאו מכשירי משטסטיק" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessun nodo Meshtastic trovato" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nie znaleziono węzłów Meshtastic" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inga Meshtastic-noder hittades" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Нема пронађених Мештастик чворова" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "未找到 Meshtastic 节点" - } - } - } - }, "Node" : { "localizations" : { "de" : { @@ -22916,64 +21559,6 @@ } } }, - "numbers.punctuation" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ziffern und Interpunktion" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Numbers and Punctuation" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nombres and Ponctuation" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מספרים וסימני פיסוק " - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Numeri e punteggiatura" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cyfry i interpunkcja" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Siffror och skiljetecken" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Бројеви и интерпункција" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "数字和标点符号" - } - } - } - }, "off" : { "localizations" : { "de" : { @@ -23032,64 +21617,6 @@ } } }, - "offline" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Offline" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Offline" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hors ligne" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מנותק" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Non in linea" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Offline" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Offline" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ван мреже" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "离线" - } - } - } - }, "OK" : { "localizations" : { "de" : { @@ -24132,64 +22659,6 @@ } } }, - "phone.gps.interval.description" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wie häufig das Telefon den Standort an das Gerät sendet. Standortaktualisierungen an das Mesh werden vom Gerät verwaltet." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "How frequently your phone will send your location to the device, location updates to the mesh are managed by the device." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La fréquence à laquelle votre téléphone envoie votre position à l'appareil, les mises à jour de la position vers le maillage sont gérées par l'appareil." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "כל כמה זמן מכשיר הטלפון ישלח את מיקומך למכשיר המשטסטיק. עדכוני מיקום למש מנוהלות על ידי המכשיר." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "La frequenza con cui il telefono invia la posizione al dispositivo, gli aggiornamenti della posizione alla rete sono gestiti dal dispositivo." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Jak często Twój telefon będzie wysyłał swoją lokalizację do urządzenia, aktualizacje lokalizacji w sieci są zarządzane przez urządzenie." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hur ofta din telefon skickar din plats till enheten, platsuppdateringar till mesh-nätverket hanteras av enheten." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Колико често ваш телефон шаље вашу локацију уређају, ажурирања локације на мрежу се управљају од стране уређаја." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "电台通过手机获取定位的时间间隔,但是向 Mesh 网络中发送定位的时间间隔由电台控制。" - } - } - } - }, "Pin %lld" : { "localizations" : { "it" : { @@ -24737,28 +23206,6 @@ } } }, - "power.metrics.delete" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete all power metrics?" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancellare tutte le metriche di potenza?" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Обрисати све логове метрике снаге?" - } - } - } - }, "power.metrics.log" : { "localizations" : { "en" : { @@ -24825,64 +23272,6 @@ } } }, - "preferred.radio" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bevorzugtes Gerät" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Preferred Radio" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Radio favorie" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "רדיו מועדף" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Radio preferita" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Preferowane radio" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Föredragen Radio" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Преферирани радио" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "默认电台" - } - } - } - }, "Presets" : { "localizations" : { "it" : { @@ -25213,64 +23602,6 @@ } } }, - "Random PIN" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zufällige PIN" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Random PIN" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code PIN aléatoire" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "קוד אקראי" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "PIN casuale" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Losowy PIN" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Slumpmässig PIN" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Насумичан ПИН" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "随机 PIN 码" - } - } - } - }, "range.test" : { "localizations" : { "de" : { @@ -25329,64 +23660,6 @@ } } }, - "range.test.blocked" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Block Range Test" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Block Range Test" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Test de portée bloqué" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "חסום בדיקות טווח" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Test di portata del blocco" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Block Range Test" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Blockera räckviddstest" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Тест домета блока" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "区块范围测试" - } - } - } - }, "range.test.config" : { "localizations" : { "de" : { @@ -26289,28 +24562,6 @@ } } }, - "restore" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wiederherstellen" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "ripristinare" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Обнова" - } - } - } - }, "resume" : { "localizations" : { "de" : { @@ -26455,64 +24706,6 @@ } } }, - "ringtone.config" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Klingelton Konfiguration" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringtone Config" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration de la sonnerie" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות רינגטון" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione della suoneria" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguracja dzwonka" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringsignalsinställningar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подешавање мелодије звона" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "铃声设置" - } - } - } - }, "Role" : { "localizations" : { "de" : { @@ -26703,38 +24896,6 @@ } } }, - "Router" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Рутер" - } - } - } - }, - "Router Options" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Opzioni del router" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Опције рутера" - } - } - } - }, "Routes" : { "localizations" : { "it" : { @@ -27755,40 +25916,6 @@ } } }, - "routing.pkiunknownpubkey" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unbekannter öffentlicher Schlüssel" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unknown Public Key" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chiave pubblica sconosciuta" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Непознат јавни кључ" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "未知的公钥" - } - } - } - }, "routing.timeout" : { "localizations" : { "de" : { @@ -28645,64 +26772,6 @@ } } }, - "select.contact" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontakt wählen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select a Contact" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectioner un contact" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "בחר איש קשר" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selezionare un contatto" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wybierz kontakt" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Välj en kontakt" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Одабери контакт" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择一名联系人" - } - } - } - }, "select.node" : { "localizations" : { "de" : { @@ -29955,64 +28024,6 @@ } } }, - "share.position" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Position teilen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Share Position" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Partager la position" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שתף מיקום" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Condividi Posizione" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Udostępnij pozycję" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dela position" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подели позицију" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "分享位置" - } - } - } - }, "Shared Key" : { "localizations" : { "de" : { @@ -30877,38 +28888,6 @@ } } }, - "Store and forward clients can request history from routers on the network." : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "I client Store and forward possono richiedere la cronologia ai router della rete." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Клијенти за складиштење и прослеђивање могу затражити историју од рутера на мрежи." - } - } - } - }, - "Store and forward router devices require a ESP32 device with PSRAM." : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "I dispositivi router Store and Forward richiedono un dispositivo ESP32 con PSRAM." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Рутер за складиштење и прослеђивање захтева ESP32 уређај са PSRAM." - } - } - } - }, "Store and forward servers require an ESP32 device with PSRAM or Linux Native." : { "localizations" : { "en" : { @@ -32851,122 +30830,6 @@ } } }, - "tip.bluetooth.connect.message" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Shows information for the Lora radio currently connected via bluetooth. You can swipe left to disconnect the radio and long press to view stats or start the live activity." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Shows information for the Lora radio connected via bluetooth. You can swipe left to disconnect the radio and long press to view stats or start the live activity." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Affiche les informations de la radio Lora connectée via le bluetooth. Vous pouvez faire un glissé vers la gauche pour déconnecter la radio et un appui long pour voir les statistiques ou démarrer l'activité en direct." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מראה מידע אודות מכשיר המשטסטיק המחובר כעת לבלוטוס. ניתן לגרור שמאלה להתנתקות או לחיצה ארוכה לראות סטטיסטיקה או להתחיל פעילות." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mostra le informazioni relative alla radio Lora collegata via bluetooth. È possibile scorrere il dito verso sinistra per scollegare la radio e premere a lungo per visualizzare le statistiche o avviare l'attività live." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Shows information for the Lora radio currently connected via bluetooth. You can swipe left to disconnect the radio and long press to view stats or start the live activity." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Visar information för LoRa-radion ansluten via bluetooth. Du kan svepa åt vänster för att koppla från radion och långtryck för att visa statistik eller starta liveaktivitet." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Приказује информације за LoRA радио повезан преко Блутута. Можете превући лево да бисте одспојили радио и дуго притиснути да бисте погледали статистику или започели активност у реалном времену." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "显示当前通过蓝牙连接的 Lora 电台的信息。您可以向左滑动断开电台,长按查看统计信息或开始实时活动。" - } - } - } - }, - "tip.bluetooth.connect.title" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connected LoRa Radio" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connected Radio" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Radio connectée" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מכשיר מחובר" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Radio connessa" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connected LoRa Radio" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ansluten Radio" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Радио повезан" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "电台已连接" - } - } - } - }, "tip.channel.admin.message" : { "localizations" : { "de" : { @@ -33723,64 +31586,6 @@ } } }, - "twitter" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "טוויטר" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "X.com" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - } - } - }, "Two Hours" : { "localizations" : { "it" : { @@ -34619,64 +32424,6 @@ } } }, - "user.details" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Benutzer Details" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "User Details" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Détails de l'utilisateur" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "פרטי משתמש" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dettagli utente" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Szczegóły użytkownika" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Användaruppgifter" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Кориснички детаљи" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "用户信息" - } - } - } - }, "Uses pullup resistor" : { "localizations" : { "it" : { diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index f88a0721..1ac17a2e 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -1278,9 +1278,7 @@ pl, he, fr, - "zh-Hant-TW", se, - "pt-PT", sr, it, ); From 1b7e5e09ff40838366780e9442e0c710c9699d03 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Wed, 23 Apr 2025 08:10:34 -0700 Subject: [PATCH 20/93] Revert "Better handling of reading messages" --- Localizable.xcstrings | 3 - Meshtastic.xcodeproj/project.pbxproj | 4 - .../Helpers/ScrollToBottomButtonView.swift | 30 -- .../Views/Messages/ChannelMessageList.swift | 275 +++++++----------- .../Views/Messages/UserMessageList.swift | 229 ++++++--------- 5 files changed, 192 insertions(+), 349 deletions(-) delete mode 100644 Meshtastic/Views/Helpers/ScrollToBottomButtonView.swift diff --git a/Localizable.xcstrings b/Localizable.xcstrings index ac116396..98364266 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -15628,9 +15628,6 @@ } } } - }, - "Jump to present" : { - }, "Key" : { "localizations" : { diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index d05151f5..1ac17a2e 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -62,7 +62,6 @@ BCB613832C672A2600485544 /* MessageChannelIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB613822C672A2600485544 /* MessageChannelIntent.swift */; }; BCB613852C68703800485544 /* NodePositionIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB613842C68703800485544 /* NodePositionIntent.swift */; }; BCB613872C69A0FB00485544 /* AppIntentErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB613862C69A0FB00485544 /* AppIntentErrors.swift */; }; - BCD93CB82D9E0D9F006C9214 /* ScrollToBottomButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD93CB72D9E0D9F006C9214 /* ScrollToBottomButtonView.swift */; }; BCE2D3C32C7ADF42008E6199 /* ShutDownNodeIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCE2D3C22C7ADF42008E6199 /* ShutDownNodeIntent.swift */; }; BCE2D3C52C7AE369008E6199 /* RestartNodeIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCE2D3C42C7AE369008E6199 /* RestartNodeIntent.swift */; }; BCE2D3C72C7B0D0A008E6199 /* ShortcutsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCE2D3C62C7B0D0A008E6199 /* ShortcutsProvider.swift */; }; @@ -327,7 +326,6 @@ BCB613822C672A2600485544 /* MessageChannelIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageChannelIntent.swift; sourceTree = ""; }; BCB613842C68703800485544 /* NodePositionIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodePositionIntent.swift; sourceTree = ""; }; BCB613862C69A0FB00485544 /* AppIntentErrors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIntentErrors.swift; sourceTree = ""; }; - BCD93CB72D9E0D9F006C9214 /* ScrollToBottomButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollToBottomButtonView.swift; sourceTree = ""; }; BCE2D3C22C7ADF42008E6199 /* ShutDownNodeIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShutDownNodeIntent.swift; sourceTree = ""; }; BCE2D3C42C7AE369008E6199 /* RestartNodeIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RestartNodeIntent.swift; sourceTree = ""; }; BCE2D3C62C7B0D0A008E6199 /* ShortcutsProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortcutsProvider.swift; sourceTree = ""; }; @@ -1058,7 +1056,6 @@ DD5E523D298F5A7D00D21B61 /* Weather */, DD6F65712C6AB8EC0053C113 /* SecureInput.swift */, 8D3F8A3E2D44BB02009EAAA4 /* PowerMetrics.swift */, - BCD93CB72D9E0D9F006C9214 /* ScrollToBottomButtonView.swift */, ); path = Helpers; sourceTree = ""; @@ -1439,7 +1436,6 @@ B399E8A42B6F486400E4488E /* RetryButton.swift in Sources */, DDB8F4102A9EE5B400230ECE /* Messages.swift in Sources */, 233E99C32D849D7A00CC3A77 /* WeightCompactWidget.swift in Sources */, - BCD93CB82D9E0D9F006C9214 /* ScrollToBottomButtonView.swift in Sources */, DD4A911E2708C65400501B7E /* AppSettings.swift in Sources */, DD1BD0F32C63C65E008C0C70 /* SecurityConfig.swift in Sources */, DD2160AF28C5552500C17253 /* MQTTConfig.swift in Sources */, diff --git a/Meshtastic/Views/Helpers/ScrollToBottomButtonView.swift b/Meshtastic/Views/Helpers/ScrollToBottomButtonView.swift deleted file mode 100644 index 50ddee24..00000000 --- a/Meshtastic/Views/Helpers/ScrollToBottomButtonView.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// ScrollToBottomButtonView.swift -// Meshtastic -// -// Created by Benjamin Faershtein on 4/2/25. -// - -import SwiftUI - -struct ScrollToBottomButtonView: View { - var body: some View { - HStack(spacing: 4) { - Text("Jump to present") - .font(.caption) - .padding(.horizontal, 8) - .padding(.vertical, 4) - .cornerRadius(12) - Image(systemName: "arrow.down") - .font(.title2) - .symbolRenderingMode(.hierarchical) - - } - .foregroundColor(.accentColor) - .shadow(radius: 2) - } -} - -#Preview { - ScrollToBottomButtonView() -} diff --git a/Meshtastic/Views/Messages/ChannelMessageList.swift b/Meshtastic/Views/Messages/ChannelMessageList.swift index 8c03572a..4480b53b 100644 --- a/Meshtastic/Views/Messages/ChannelMessageList.swift +++ b/Meshtastic/Views/Messages/ChannelMessageList.swift @@ -22,191 +22,128 @@ struct ChannelMessageList: View { @ObservedObject var channel: ChannelEntity @State private var replyMessageId: Int64 = 0 @AppStorage("preferredPeripheralNum") private var preferredPeripheralNum = -1 - - // Scroll state - @State private var showScrollToBottomButton = false - @State private var hasReachedBottom = false - @State private var gotFirstUnreadMessage: Bool = false var body: some View { VStack { ScrollViewReader { scrollView in - ZStack(alignment: .bottomTrailing) { - ScrollView { - LazyVStack { - ForEach(channel.allPrivateMessages) { (message: MessageEntity) in - let currentUser: Bool = (Int64(preferredPeripheralNum) == message.fromUser?.num ? true : false) - if message.replyID > 0 { - let messageReply = channel.allPrivateMessages.first(where: { $0.messageId == message.replyID }) + ScrollView { + LazyVStack { + ForEach( channel.allPrivateMessages ) { (message: MessageEntity) in + let currentUser: Bool = (Int64(preferredPeripheralNum) == message.fromUser?.num ? true : false) + if message.replyID > 0 { + let messageReply = channel.allPrivateMessages.first(where: { $0.messageId == message.replyID }) + HStack { + Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) + .padding(10) + .overlay( + RoundedRectangle(cornerRadius: 18) + .stroke(Color.blue, lineWidth: 0.5) + ) + Image(systemName: "arrowshape.turn.up.left.fill") + .symbolRenderingMode(.hierarchical) + .imageScale(.large).foregroundColor(.accentColor) + .padding(.trailing) + } + } + HStack(alignment: .bottom) { + if currentUser { Spacer(minLength: 50) } + if !currentUser { + CircleText(text: message.fromUser?.shortName ?? "?", color: Color(UIColor(hex: UInt32(message.fromUser?.num ?? 0))), circleSize: 44, node: getNodeInfo(id: Int64(message.fromUser?.num ?? 0), context: context)) + .padding(.all, 5) + .offset(y: -7) + } + + VStack(alignment: currentUser ? .trailing : .leading) { + let isDetectionSensorMessage = message.portNum == Int32(PortNum.detectionSensorApp.rawValue) + + if !currentUser && message.fromUser != nil { + Text("\(message.fromUser?.longName ?? "unknown".localized ) (\(message.fromUser?.userId ?? "?"))") + .font(.caption) + .foregroundColor(.gray) + .offset(y: 8) + } + HStack { - Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) - .padding(10) - .overlay( - RoundedRectangle(cornerRadius: 18) - .stroke(Color.blue, lineWidth: 0.5) - ) - Image(systemName: "arrowshape.turn.up.left.fill") - .symbolRenderingMode(.hierarchical) - .imageScale(.large).foregroundColor(.accentColor) - .padding(.trailing) + MessageText( + message: message, + tapBackDestination: .channel(channel), + isCurrentUser: currentUser + ) { + self.replyMessageId = message.messageId + self.messageFieldFocused = true + } + + if currentUser && message.canRetry { + RetryButton(message: message, destination: .channel(channel)) + } + } + + TapbackResponses(message: message) { + appState.unreadChannelMessages = myInfo.unreadMessages + context.refresh(myInfo, mergeChanges: true) + } + + HStack { + let ackErrorVal = RoutingError(rawValue: Int(message.ackError)) + if currentUser && message.receivedACK { + Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) + .foregroundStyle(ackErrorVal?.color ?? Color.red) + .font(.caption2) + } else if currentUser && message.ackError == 0 { + // Empty Error + Text("Waiting to be acknowledged. . .").font( + .caption2) + .foregroundColor(.orange) + } else if currentUser && !isDetectionSensorMessage { + Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) + .foregroundStyle(ackErrorVal?.color ?? Color.red) + .font(.caption2) + } } } - HStack(alignment: .bottom) { - if currentUser { Spacer(minLength: 50) } - if !currentUser { - CircleText(text: message.fromUser?.shortName ?? "?", color: Color(UIColor(hex: UInt32(message.fromUser?.num ?? 0))), circleSize: 44, node: getNodeInfo(id: Int64(message.fromUser?.num ?? 0), context: context)) - .padding(.all, 5) - .offset(y: -7) - } + .padding(.bottom) + .id(channel.allPrivateMessages.firstIndex(of: message)) + + if !currentUser { + Spacer(minLength: 50) } - HStack(alignment: .bottom) { - if currentUser { Spacer(minLength: 50) } - if !currentUser { - CircleText(text: message.fromUser?.shortName ?? "?", color: Color(UIColor(hex: UInt32(message.fromUser?.num ?? 0))), circleSize: 44) - .padding(.all, 5) - .offset(y: -7) - } - - VStack(alignment: currentUser ? .trailing : .leading) { - let isDetectionSensorMessage = message.portNum == Int32(PortNum.detectionSensorApp.rawValue) - - if !currentUser && message.fromUser != nil { - Text("\(message.fromUser?.longName ?? "unknown".localized ) (\(message.fromUser?.userId ?? "?"))") - .font(.caption) - .foregroundColor(.gray) - .offset(y: 8) - } - - HStack { - MessageText( - message: message, - tapBackDestination: .channel(channel), - isCurrentUser: currentUser - ) { - self.replyMessageId = message.messageId - self.messageFieldFocused = true - } - - if currentUser && message.canRetry { - RetryButton(message: message, destination: .channel(channel)) - } - } - - TapbackResponses(message: message) { - appState.unreadChannelMessages = myInfo.unreadMessages - context.refresh(myInfo, mergeChanges: true) - } - - HStack { - let ackErrorVal = RoutingError(rawValue: Int(message.ackError)) - if currentUser && message.receivedACK { - Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) - .foregroundStyle(ackErrorVal?.color ?? Color.red) - .font(.caption2) - } else if currentUser && message.ackError == 0 { - // Empty Error - Text("Waiting to be acknowledged. . .").font( - .caption2) - .foregroundColor(.orange) - } else if currentUser && !isDetectionSensorMessage { - Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) - .foregroundStyle(ackErrorVal?.color ?? Color.red) - .font(.caption2) - } - } - } - .padding(.bottom) - .id(channel.allPrivateMessages.firstIndex(of: message)) - - if !currentUser { - Spacer(minLength: 50) - } - } - .padding([.leading, .trailing]) - .frame(maxWidth: .infinity) - .id(message.messageId) - .onAppear { - if gotFirstUnreadMessage{ - if !message.read { - message.read = true - do { - for unreadMessage in channel.allPrivateMessages.filter({ !$0.read }) { - unreadMessage.read = true - } - try context.save() - Logger.data.info("📖 [App] Read message \(message.messageId, privacy: .public) ") - appState.unreadChannelMessages = myInfo.unreadMessages - context.refresh(myInfo, mergeChanges: true) - } catch { - Logger.data.error("Failed to read message \(message.messageId, privacy: .public): \(error.localizedDescription, privacy: .public)") - } - } - // Check if we've reached the bottom message - if message.messageId == channel.allPrivateMessages.last?.messageId { - hasReachedBottom = true - showScrollToBottomButton = false + } + .padding([.leading, .trailing]) + .frame(maxWidth: .infinity) + .id(message.messageId) + .onAppear { + if !message.read { + message.read = true + do { + for unreadMessage in channel.allPrivateMessages.filter({ !$0.read }) { + unreadMessage.read = true } + try context.save() + Logger.data.info("📖 [App] Read message \(message.messageId, privacy: .public) ") + appState.unreadChannelMessages = myInfo.unreadMessages + context.refresh(myInfo, mergeChanges: true) + } catch { + Logger.data.error("Failed to read message \(message.messageId, privacy: .public): \(error.localizedDescription, privacy: .public)") } } } - // Invisible spacer to detect reaching bottom - Color.clear - .frame(height: 1) - .id("bottomAnchor") - .onAppear { - hasReachedBottom = true - showScrollToBottomButton = false - } } } - .scrollDismissesKeyboard(.interactively) - .onFirstAppear { - // Find first unread message - if let firstUnreadMessageId = channel.allPrivateMessages.first(where: { !$0.read })?.messageId { - withAnimation { - scrollView.scrollTo(firstUnreadMessageId, anchor: .top) - showScrollToBottomButton = true - } - } else { - // If no unread messages, scroll to bottom - withAnimation { - scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) - hasReachedBottom = true - } - } - gotFirstUnreadMessage = true + } + .scrollDismissesKeyboard(.interactively) + .onFirstAppear { + withAnimation { + scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) } - .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardDidShowNotification)) { _ in - withAnimation { - scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) - hasReachedBottom = true - showScrollToBottomButton = false - } + } + .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardDidShowNotification)) { _ in + withAnimation { + scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) } - .onChange(of: channel.allPrivateMessages) { - if hasReachedBottom { - withAnimation { - scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) - } - } else { - showScrollToBottomButton = true - } - } - - // Scroll to bottom button - if showScrollToBottomButton { - Button { - withAnimation { - scrollView.scrollTo("bottomAnchor", anchor: .bottom) - hasReachedBottom = true - showScrollToBottomButton = false - } - } label: { - ScrollToBottomButtonView() - } - .padding(.bottom, 8) - .padding(.trailing, 16) - .transition(.opacity) + } + .onChange(of: channel.allPrivateMessages) { + withAnimation { + scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) } } } diff --git a/Meshtastic/Views/Messages/UserMessageList.swift b/Meshtastic/Views/Messages/UserMessageList.swift index 6f995756..dea4586f 100644 --- a/Meshtastic/Views/Messages/UserMessageList.swift +++ b/Meshtastic/Views/Messages/UserMessageList.swift @@ -20,172 +20,115 @@ struct UserMessageList: View { // View State Items @ObservedObject var user: UserEntity @State private var replyMessageId: Int64 = 0 - - // Scroll state - @State private var showScrollToBottomButton = false - @State private var hasReachedBottom = false - @State private var gotFirstUnreadMessage: Bool = false var body: some View { VStack { ScrollViewReader { scrollView in - ZStack(alignment: .bottomTrailing) { - ScrollView { - LazyVStack { - ForEach( user.messageList ) { (message: MessageEntity) in - if user.num != bleManager.connectedPeripheral?.num ?? -1 { - let currentUser: Bool = (Int64(UserDefaults.preferredPeripheralNum) == message.fromUser?.num ?? -1 ? true : false) + ScrollView { + LazyVStack { + ForEach( user.messageList ) { (message: MessageEntity) in + if user.num != bleManager.connectedPeripheral?.num ?? -1 { + let currentUser: Bool = (Int64(UserDefaults.preferredPeripheralNum) == message.fromUser?.num ?? -1 ? true : false) - if message.replyID > 0 { - let messageReply = user.messageList.first(where: { $0.messageId == message.replyID }) + if message.replyID > 0 { + let messageReply = user.messageList.first(where: { $0.messageId == message.replyID }) + HStack { + Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) + .padding(10) + .overlay( + RoundedRectangle(cornerRadius: 18) + .stroke(Color.blue, lineWidth: 0.5) + ) + Image(systemName: "arrowshape.turn.up.left.fill") + .symbolRenderingMode(.hierarchical) + .imageScale(.large).foregroundColor(.accentColor) + .padding(.trailing) + } + } + HStack(alignment: .top) { + if currentUser { Spacer(minLength: 50) } + VStack(alignment: currentUser ? .trailing : .leading) { HStack { - Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) - .padding(10) - .overlay( - RoundedRectangle(cornerRadius: 18) - .stroke(Color.blue, lineWidth: 0.5) - ) - Image(systemName: "arrowshape.turn.up.left.fill") - .symbolRenderingMode(.hierarchical) - .imageScale(.large).foregroundColor(.accentColor) - .padding(.trailing) + MessageText( + message: message, + tapBackDestination: .user(user), + isCurrentUser: currentUser + ) { + self.replyMessageId = message.messageId + self.messageFieldFocused = true + } + + if currentUser && message.canRetry || (message.receivedACK && !message.realACK) { + RetryButton(message: message, destination: .user(user)) + } } - } - HStack(alignment: .top) { - if currentUser { Spacer(minLength: 50) } - VStack(alignment: currentUser ? .trailing : .leading) { - HStack { - MessageText( - message: message, - tapBackDestination: .user(user), - isCurrentUser: currentUser - ) { - self.replyMessageId = message.messageId - self.messageFieldFocused = true - } - if currentUser && message.canRetry || (message.receivedACK && !message.realACK) { - RetryButton(message: message, destination: .user(user)) - } - } + TapbackResponses(message: message) { + appState.unreadDirectMessages = user.unreadMessages + } - TapbackResponses(message: message) { - appState.unreadDirectMessages = user.unreadMessages - } - - HStack { - let ackErrorVal = RoutingError(rawValue: Int(message.ackError)) - if currentUser && message.receivedACK { - // Ack Received - if message.realACK { - Text("\(ackErrorVal?.display ?? "Empty Ack Error")") - .font(.caption2) - .foregroundStyle(ackErrorVal?.color ?? Color.secondary) - } else { - Text("Acknowledged by another node").font(.caption2).foregroundColor(.orange) - } - } else if currentUser && message.ackError == 0 { - // Empty Error - Text("Waiting to be acknowledged. . .").font(.caption2).foregroundColor(.yellow) - } else if currentUser && message.ackError > 0 { - Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) - .foregroundStyle(ackErrorVal?.color ?? Color.red) + HStack { + let ackErrorVal = RoutingError(rawValue: Int(message.ackError)) + if currentUser && message.receivedACK { + // Ack Received + if message.realACK { + Text("\(ackErrorVal?.display ?? "Empty Ack Error")") .font(.caption2) + .foregroundStyle(ackErrorVal?.color ?? Color.secondary) + } else { + Text("Acknowledged by another node").font(.caption2).foregroundColor(.orange) } + } else if currentUser && message.ackError == 0 { + // Empty Error + Text("Waiting to be acknowledged. . .").font(.caption2).foregroundColor(.yellow) + } else if currentUser && message.ackError > 0 { + Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) + .foregroundStyle(ackErrorVal?.color ?? Color.red) + .font(.caption2) } } - .padding(.bottom) - .id(user.messageList.firstIndex(of: message)) + } + .padding(.bottom) + .id(user.messageList.firstIndex(of: message)) - if !currentUser { - Spacer(minLength: 50) - } - } - .padding([.leading, .trailing]) - .frame(maxWidth: .infinity) - .id(message.messageId) - .onAppear { - if gotFirstUnreadMessage { - if !message.read { - message.read = true - do { - for unreadMessage in user.messageList.filter({ !$0.read }) { - unreadMessage.read = true - } - try context.save() - Logger.data.info("📖 [App] Read message \(message.messageId, privacy: .public) ") - appState.unreadDirectMessages = user.unreadMessages - } catch { - Logger.data.error("Failed to read message \(message.messageId, privacy: .public): \(error.localizedDescription, privacy: .public)") - } - } - // Check if we've reached the bottom message - if message.messageId == user.messageList.last?.messageId { - hasReachedBottom = true - showScrollToBottomButton = false - } - } + if !currentUser { + Spacer(minLength: 50) } } - } - // Invisible spacer to detect reaching bottom - Color.clear - .frame(height: 1) - .id("bottomAnchor") + .padding([.leading, .trailing]) + .frame(maxWidth: .infinity) + .id(message.messageId) .onAppear { - hasReachedBottom = true - showScrollToBottomButton = false + if !message.read { + message.read = true + do { + try context.save() + Logger.data.info("📖 [App] Read message \(message.messageId, privacy: .public) ") + appState.unreadDirectMessages = user.unreadMessages + + } catch { + Logger.data.error("Failed to read message \(message.messageId, privacy: .public): \(error.localizedDescription, privacy: .public)") + } + } } - } - } - .scrollDismissesKeyboard(.interactively) - .onFirstAppear { - // Find first unread message - if let firstUnreadMessageId = user.messageList.first(where: { !$0.read })?.messageId { - withAnimation { - scrollView.scrollTo(firstUnreadMessageId, anchor: .top) - showScrollToBottomButton = true - } - } else { - // If no unread messages, scroll to bottom - withAnimation { - scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) - hasReachedBottom = true } } - gotFirstUnreadMessage = true } - .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardDidShowNotification)) { _ in - withAnimation { - scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) - hasReachedBottom = true - showScrollToBottomButton = false - } + } + .scrollDismissesKeyboard(.interactively) + .onFirstAppear { + withAnimation { + scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) } - .onChange(of: user.messageList) { - if hasReachedBottom { - withAnimation { - scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) - } - } else { - showScrollToBottomButton = true - } + } + .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardDidShowNotification)) { _ in + withAnimation { + scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) } - - // Scroll to bottom button - if showScrollToBottomButton { - Button { - withAnimation { - scrollView.scrollTo("bottomAnchor", anchor: .bottom) - hasReachedBottom = true - showScrollToBottomButton = false - } - } label: { - ScrollToBottomButtonView() - } - .padding(.bottom, 8) - .padding(.trailing, 16) - .transition(.opacity) + } + .onChange(of: user.messageList) { + withAnimation { + scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) } } } From 22482282be8d373a8ab59fa7870be71c18aec9c6 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Wed, 23 Apr 2025 19:23:48 -0700 Subject: [PATCH 21/93] Remove old of 100 online nodes text as it is not relevant anymore. --- Widgets/WidgetsLiveActivity.swift | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Widgets/WidgetsLiveActivity.swift b/Widgets/WidgetsLiveActivity.swift index 231efec2..3b7d3422 100644 --- a/Widgets/WidgetsLiveActivity.swift +++ b/Widgets/WidgetsLiveActivity.swift @@ -31,23 +31,21 @@ struct WidgetsLiveActivity: Widget { } dynamicIsland: { context in DynamicIsland { DynamicIslandExpandedRegion(.leading) { - if context.state.totalNodes >= 100 { - Text("100+ online") + if context.state.totalNodes > 0 { + Text(" \(context.state.nodesOnline) online") .font(.callout) .foregroundStyle(.secondary) .fixedSize() } else { - Text("\(context.state.nodesOnline) of \(context.state.totalNodes) online") + Text(" ") .font(.callout) .foregroundStyle(.secondary) .fixedSize() } - // Text("\(context.state.channelUtilization.map { String(format: "Ch. Util: %.2f", $0) } ?? "--")%") Text("Ch. Util: \(context.state.channelUtilization?.formatted(.number.precision(.fractionLength(2))) ?? Constants.nilValueIndicator)%") .font(.caption2) .foregroundStyle(.secondary) .fixedSize() - // Text("\(context.state.airtime.map { String(format: "Airtime: %.2f", $0) } ?? "--")%") Text("Airtime: \(context.state.airtime?.formatted(.number.precision(.fractionLength(2))) ?? Constants.nilValueIndicator)%") .font(.caption2) .foregroundStyle(.secondary) From c3bde9a9ffc86231ca7b92ee78e655a472ca8199 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Wed, 23 Apr 2025 19:33:48 -0700 Subject: [PATCH 22/93] Finish removing totalNodes --- Widgets/WidgetsLiveActivity.swift | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/Widgets/WidgetsLiveActivity.swift b/Widgets/WidgetsLiveActivity.swift index 3b7d3422..3923fee7 100644 --- a/Widgets/WidgetsLiveActivity.swift +++ b/Widgets/WidgetsLiveActivity.swift @@ -164,7 +164,7 @@ struct LiveActivityView: View { .frame(minWidth: 25, idealWidth: 45, maxWidth: 55) Spacer() NodeInfoView(isLuminanceReduced: _isLuminanceReduced, nodeName: nodeName, uptimeSeconds: uptimeSeconds, channelUtilization: channelUtilization, airtime: airtime, sentPackets: sentPackets, receivedPackets: receivedPackets, badReceivedPackets: badReceivedPackets, - dupeReceivedPackets: dupeReceivedPackets, packetsSentRelay: packetsSentRelay, packetsCanceledRelay: packetsCanceledRelay, nodesOnline: nodesOnline, totalNodes: totalNodes, timerRange: timerRange) + dupeReceivedPackets: dupeReceivedPackets, packetsSentRelay: packetsSentRelay, packetsCanceledRelay: packetsCanceledRelay, nodesOnline: nodesOnline, timerRange: timerRange) Spacer() } .tint(.primary) @@ -189,7 +189,6 @@ struct NodeInfoView: View { var packetsSentRelay: UInt32 var packetsCanceledRelay: UInt32 var nodesOnline: UInt32 - var totalNodes: UInt32 var timerRange: ClosedRange var body: some View { @@ -218,21 +217,14 @@ struct NodeInfoView: View { .foregroundStyle(.secondary) .opacity(isLuminanceReduced ? 0.8 : 1.0) .fixedSize() - if totalNodes >= 100 { - Text("Connected: \(nodesOnline) nodes online") - .font(.caption) - .fontWeight(.medium) - .foregroundStyle(.secondary) - .opacity(isLuminanceReduced ? 0.8 : 1.0) - .fixedSize() - } else { - Text("Connected: \(nodesOnline) of \(totalNodes) nodes online") - .font(.caption) - .fontWeight(.medium) - .foregroundStyle(.secondary) - .opacity(isLuminanceReduced ? 0.8 : 1.0) - .fixedSize() - } + + Text("Connected: \(nodesOnline) nodes online") + .font(.caption) + .fontWeight(.medium) + .foregroundStyle(.secondary) + .opacity(isLuminanceReduced ? 0.8 : 1.0) + .fixedSize() + let now = Date() Text("Last Heard: \(now.formatted())") .font(.caption) From 5c1e0a0ff9ecd8d7369bc5389c056df3cf832e57 Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Wed, 23 Apr 2025 21:03:26 -0700 Subject: [PATCH 23/93] Fixed the view --- .../Views/Messages/ChannelMessageList.swift | 48 ++++++++----------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/Meshtastic/Views/Messages/ChannelMessageList.swift b/Meshtastic/Views/Messages/ChannelMessageList.swift index 8c03572a..9586d194 100644 --- a/Meshtastic/Views/Messages/ChannelMessageList.swift +++ b/Meshtastic/Views/Messages/ChannelMessageList.swift @@ -32,25 +32,25 @@ struct ChannelMessageList: View { VStack { ScrollViewReader { scrollView in ZStack(alignment: .bottomTrailing) { - ScrollView { - LazyVStack { - ForEach(channel.allPrivateMessages) { (message: MessageEntity) in - let currentUser: Bool = (Int64(preferredPeripheralNum) == message.fromUser?.num ? true : false) - if message.replyID > 0 { - let messageReply = channel.allPrivateMessages.first(where: { $0.messageId == message.replyID }) - HStack { - Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) - .padding(10) - .overlay( - RoundedRectangle(cornerRadius: 18) - .stroke(Color.blue, lineWidth: 0.5) - ) - Image(systemName: "arrowshape.turn.up.left.fill") - .symbolRenderingMode(.hierarchical) - .imageScale(.large).foregroundColor(.accentColor) - .padding(.trailing) - } - } + ScrollView { + LazyVStack { + ForEach( channel.allPrivateMessages ) { (message: MessageEntity) in + let currentUser: Bool = (Int64(preferredPeripheralNum) == message.fromUser?.num ? true : false) + if message.replyID > 0 { + let messageReply = channel.allPrivateMessages.first(where: { $0.messageId == message.replyID }) + HStack { + Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) + .padding(10) + .overlay( + RoundedRectangle(cornerRadius: 18) + .stroke(Color.blue, lineWidth: 0.5) + ) + Image(systemName: "arrowshape.turn.up.left.fill") + .symbolRenderingMode(.hierarchical) + .imageScale(.large).foregroundColor(.accentColor) + .padding(.trailing) + } + } HStack(alignment: .bottom) { if currentUser { Spacer(minLength: 50) } if !currentUser { @@ -58,14 +58,8 @@ struct ChannelMessageList: View { .padding(.all, 5) .offset(y: -7) } - } - HStack(alignment: .bottom) { - if currentUser { Spacer(minLength: 50) } - if !currentUser { - CircleText(text: message.fromUser?.shortName ?? "?", color: Color(UIColor(hex: UInt32(message.fromUser?.num ?? 0))), circleSize: 44) - .padding(.all, 5) - .offset(y: -7) - } + + VStack(alignment: currentUser ? .trailing : .leading) { let isDetectionSensorMessage = message.portNum == Int32(PortNum.detectionSensorApp.rawValue) From 51a4ecc356e2ae1b825be658da85be7c8aca8304 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Wed, 23 Apr 2025 23:08:41 -0700 Subject: [PATCH 24/93] Map report opt in updates --- Localizable.xcstrings | 15 +++++---- .../Settings/Config/Module/MQTTConfig.swift | 33 +++++++++++++------ 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 98364266..138162db 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -3265,9 +3265,6 @@ } } } - }, - "By enabling the map report your node will periodically send a totally unencrypted packet to the configured MQTT server irrigardness of any channel specific uplink and downling MQTT Settings. This report includes short and long name, position, hardware model, role, firmware version, LoRa region, modem preset and primary channel name" : { - }, "By enabling this feature, you acknowledge and expressly consent to the transmission of your device’s real-time geographic location over the MQTT protocol without encryption. This location data may be used for purposes such as live map reporting, device tracking, and related telemetry functions." : { @@ -6272,7 +6269,7 @@ } } }, - "Consent to Share Unencrypted Location Data via MQTT" : { + "Consent to Share Unencrypted Node Data via MQTT" : { }, "contacts %@" : { @@ -13012,7 +13009,7 @@ } } }, - "I have read and understand the above. I voluntarily consent to the unencrypted transmission of my location data via MQTT for map reporting purposes." : { + "I have read and understand the above. I voluntarily consent to the unencrypted transmission of my node data via MQTT." : { }, "IAQ" : { @@ -22735,7 +22732,7 @@ } } }, - "Please be advised that because MQTT transmission is not encrypted by default, your location data may be stored permanently and displayed by third parties. Meshtastic does not assume responsibility for any such unauthorized access or disclosure resulting from unencrypted transmission." : { + "Please be advised that because the map report is not encrypted, your data may be stored and displayed permanently by third parties. Meshtastic does not assume responsibility for any such storage, display or disclosure of this data." : { }, "Please connect to a radio to configure settings." : { @@ -31315,6 +31312,9 @@ } } } + }, + "To comply with privacy laws like CCPA and GDPR, we avoid sharing exact location data. Instead, we use anonymized or approximate (imprecise) location information to protect your privacy." : { + }, "Topic: %@" : { "localizations" : { @@ -33335,6 +33335,9 @@ } } } + }, + "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." : { + }, "Your node’s operating frequency is calculated based on the region, modem preset, and this field. When 0, the slot is automatically calculated based on the primary channel name." : { "localizations" : { diff --git a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift index 046d86aa..e9b184b3 100644 --- a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift @@ -93,20 +93,30 @@ struct MQTTConfig: View { } Section(header: Text("Map Report")) { - Text("Consent to Share Unencrypted Location Data via MQTT") - .font(.title2) - Text("By enabling this feature, you acknowledge and expressly consent to the transmission of your device’s real-time geographic location over the MQTT protocol without encryption. This location data may be used for purposes such as live map reporting, device tracking, and related telemetry functions.") - Text("Please be advised that because MQTT transmission is not encrypted by default, your location data may be stored permanently and displayed by third parties. Meshtastic does not assume responsibility for any such unauthorized access or disclosure resulting from unencrypted transmission.") - Toggle(isOn: $mapReportingOptIn) { - Label("I have read and understand the above. I voluntarily consent to the unencrypted transmission of my location data via MQTT for map reporting purposes.", systemImage: "hand.raised") - - } Toggle(isOn: $mapReportingEnabled) { Label("enabled", systemImage: "map") - Text("By enabling the map report your node will periodically send a totally unencrypted packet to the configured MQTT server irrigardness of any channel specific uplink and downling MQTT Settings. This report includes short and long name, position, hardware model, role, firmware version, LoRa region, modem preset and primary channel name") + Text("Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name.") + .foregroundColor(.gray) + .font(.caption) } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) if mapReportingEnabled { + Text("Consent to Share Unencrypted Node Data via MQTT") + Text("By enabling this feature, you acknowledge and expressly consent to the transmission of your device’s real-time geographic location over the MQTT protocol without encryption. This location data may be used for purposes such as live map reporting, device tracking, and related telemetry functions.") + .foregroundColor(.gray) + .font(.caption) + Text("Please be advised that because the map report is not encrypted, your data may be stored and displayed permanently by third parties. Meshtastic does not assume responsibility for any such storage, display or disclosure of this data.") + .foregroundColor(.gray) + .font(.caption) + Toggle(isOn: $mapReportingOptIn) { + Label("I have read and understand the above. I voluntarily consent to the unencrypted transmission of my node data via MQTT.", systemImage: "hand.raised") + .foregroundColor(.gray) + .font(.callout) + + } + .toggleStyle(SwitchToggleStyle(tint: .accentColor)) + } + if mapReportingEnabled && mapReportingOptIn { Picker("Map Publish Interval", selection: $mapPublishIntervalSecs ) { ForEach(UpdateIntervals.allCases) { ui in if ui.rawValue >= 3600 { @@ -117,6 +127,9 @@ struct MQTTConfig: View { .pickerStyle(DefaultPickerStyle()) VStack(alignment: .leading) { Label("Approximate Location", systemImage: "location.slash.circle.fill") + Text("To comply with privacy laws like CCPA and GDPR, we avoid sharing exact location data. Instead, we use anonymized or approximate (imprecise) location information to protect your privacy.") + .foregroundColor(.gray) + .font(.callout) Slider(value: $mapPositionPrecision, in: 11...14, step: 1) { } minimumValueLabel: { Image(systemName: "minus") @@ -253,7 +266,7 @@ struct MQTTConfig: View { mqtt.encryptionEnabled = self.encryptionEnabled mqtt.jsonEnabled = self.jsonEnabled mqtt.tlsEnabled = self.tlsEnabled - mqtt.mapReportingEnabled = self.mapReportingEnabled + mqtt.mapReportingEnabled = (self.mapReportingEnabled && self.mapReportingOptIn) mqtt.mapReportSettings.positionPrecision = UInt32(self.mapPositionPrecision) mqtt.mapReportSettings.publishIntervalSecs = UInt32(self.mapPublishIntervalSecs) let adminMessageId = bleManager.saveMQTTConfig(config: mqtt, fromUser: connectedNode!.user!, toUser: node!.user!, adminIndex: connectedNode?.myInfo?.adminIndex ?? 0) From e80000cf14c8498f282d919f21c7161b82a2a32f Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Wed, 23 Apr 2025 23:09:01 -0700 Subject: [PATCH 25/93] fixed --- .../Views/Messages/ChannelMessageList.swift | 202 ++++++++---------- 1 file changed, 95 insertions(+), 107 deletions(-) diff --git a/Meshtastic/Views/Messages/ChannelMessageList.swift b/Meshtastic/Views/Messages/ChannelMessageList.swift index f567b7be..c2361ccb 100644 --- a/Meshtastic/Views/Messages/ChannelMessageList.swift +++ b/Meshtastic/Views/Messages/ChannelMessageList.swift @@ -27,25 +27,25 @@ struct ChannelMessageList: View { VStack { ScrollViewReader { scrollView in ZStack(alignment: .bottomTrailing) { - ScrollView { - LazyVStack { - ForEach( channel.allPrivateMessages ) { (message: MessageEntity) in - let currentUser: Bool = (Int64(preferredPeripheralNum) == message.fromUser?.num ? true : false) - if message.replyID > 0 { - let messageReply = channel.allPrivateMessages.first(where: { $0.messageId == message.replyID }) - HStack { - Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) - .padding(10) - .overlay( - RoundedRectangle(cornerRadius: 18) - .stroke(Color.blue, lineWidth: 0.5) - ) - Image(systemName: "arrowshape.turn.up.left.fill") - .symbolRenderingMode(.hierarchical) - .imageScale(.large).foregroundColor(.accentColor) - .padding(.trailing) - } - } + ScrollView { + LazyVStack { + ForEach(channel.allPrivateMessages) { (message: MessageEntity) in + let currentUser: Bool = (Int64(preferredPeripheralNum) == message.fromUser?.num ? true : false) + if message.replyID > 0 { + let messageReply = channel.allPrivateMessages.first(where: { $0.messageId == message.replyID }) + HStack { + Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) + .padding(10) + .overlay( + RoundedRectangle(cornerRadius: 18) + .stroke(Color.blue, lineWidth: 0.5) + ) + Image(systemName: "arrowshape.turn.up.left.fill") + .symbolRenderingMode(.hierarchical) + .imageScale(.large).foregroundColor(.accentColor) + .padding(.trailing) + } + } HStack(alignment: .bottom) { if currentUser { Spacer(minLength: 50) } if !currentUser { @@ -53,8 +53,6 @@ struct ChannelMessageList: View { .padding(.all, 5) .offset(y: -7) } - - VStack(alignment: currentUser ? .trailing : .leading) { let isDetectionSensorMessage = message.portNum == Int32(PortNum.detectionSensorApp.rawValue) @@ -66,115 +64,105 @@ struct ChannelMessageList: View { .offset(y: 8) } - VStack(alignment: currentUser ? .trailing : .leading) { - let isDetectionSensorMessage = message.portNum == Int32(PortNum.detectionSensorApp.rawValue) + HStack { + MessageText( + message: message, + tapBackDestination: .channel(channel), + isCurrentUser: currentUser + ) { + self.replyMessageId = message.messageId + self.messageFieldFocused = true + } - if !currentUser && message.fromUser != nil { - Text("\(message.fromUser?.longName ?? "unknown".localized ) (\(message.fromUser?.userId ?? "?"))") - .font(.caption) - .foregroundColor(.gray) - .offset(y: 8) - } - - HStack { - MessageText( - message: message, - tapBackDestination: .channel(channel), - isCurrentUser: currentUser - ) { - self.replyMessageId = message.messageId - self.messageFieldFocused = true + if currentUser && message.canRetry { + RetryButton(message: message, destination: .channel(channel)) + } } - if currentUser && message.canRetry { - RetryButton(message: message, destination: .channel(channel)) + TapbackResponses(message: message) { + appState.unreadChannelMessages = myInfo.unreadMessages + context.refresh(myInfo, mergeChanges: true) + } + + HStack { + let ackErrorVal = RoutingError(rawValue: Int(message.ackError)) + if currentUser && message.receivedACK { + Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) + .foregroundStyle(ackErrorVal?.color ?? Color.red) + .font(.caption2) + } else if currentUser && message.ackError == 0 { + // Empty Error + Text("Waiting to be acknowledged. . .").font( + .caption2) + .foregroundColor(.orange) + } else if currentUser && !isDetectionSensorMessage { + Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) + .foregroundStyle(ackErrorVal?.color ?? Color.red) + .font(.caption2) + } } } + .padding(.bottom) - TapbackResponses(message: message) { - appState.unreadChannelMessages = myInfo.unreadMessages - context.refresh(myInfo, mergeChanges: true) - } - - HStack { - let ackErrorVal = RoutingError(rawValue: Int(message.ackError)) - if currentUser && message.receivedACK { - Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) - .foregroundStyle(ackErrorVal?.color ?? Color.red) - .font(.caption2) - } else if currentUser && message.ackError == 0 { - // Empty Error - Text("Waiting to be acknowledged. . .").font( - .caption2) - .foregroundColor(.orange) - } else if currentUser && !isDetectionSensorMessage { - Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) - .foregroundStyle(ackErrorVal?.color ?? Color.red) - .font(.caption2) - } + if !currentUser { + Spacer(minLength: 50) } } - .padding(.bottom) - .id(channel.allPrivateMessages.firstIndex(of: message)) - - if !currentUser { - Spacer(minLength: 50) - } - } - .padding([.leading, .trailing]) - .frame(maxWidth: .infinity) - .id(message.messageId) - .onAppear { - if !message.read { - message.read = true - do { - for unreadMessage in channel.allPrivateMessages.filter({ !$0.read }) { - unreadMessage.read = true + .padding([.leading, .trailing]) + .frame(maxWidth: .infinity) + .id(message.messageId) + .onAppear { + if !message.read { + message.read = true + do { + for unreadMessage in channel.allPrivateMessages.filter({ !$0.read }) { + unreadMessage.read = true + } + try context.save() + Logger.data.info("📖 [App] Read message \(message.messageId, privacy: .public) ") + appState.unreadChannelMessages = myInfo.unreadMessages + context.refresh(myInfo, mergeChanges: true) + } catch { + Logger.data.error("Failed to read message \(message.messageId, privacy: .public): \(error.localizedDescription, privacy: .public)") } - try context.save() - Logger.data.info("📖 [App] Read message \(message.messageId, privacy: .public) ") - appState.unreadChannelMessages = myInfo.unreadMessages - context.refresh(myInfo, mergeChanges: true) - } catch { - Logger.data.error("Failed to read message \(message.messageId, privacy: .public): \(error.localizedDescription, privacy: .public)") } } } } } - } - .scrollDismissesKeyboard(.interactively) - .onFirstAppear { - withAnimation { - scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + .scrollDismissesKeyboard(.interactively) + .onFirstAppear { + withAnimation { + scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + } + } + .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardDidShowNotification)) { _ in + withAnimation { + scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + } + } + .onChange(of: channel.allPrivateMessages) { + withAnimation { + scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + } } } - .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardDidShowNotification)) { _ in - withAnimation { - scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) - } - } - .onChange(of: channel.allPrivateMessages) { - withAnimation { - scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) - } - } - } - TextMessageField( - destination: .channel(channel), - replyMessageId: $replyMessageId, - isFocused: $messageFieldFocused - ) { - context.refresh(channel, mergeChanges: true) + TextMessageField( + destination: .channel(channel), + replyMessageId: $replyMessageId, + isFocused: $messageFieldFocused + ) { + context.refresh(channel, mergeChanges: true) + } } } .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .principal) { HStack { - CircleText(text: String(channel.index), color: .accentColor, circleSize: 44).fixedSize() - Text(String(channel.name ?? "unknown".localized).camelCaseToWords()).font(.headline) + CircleText(text: String(channel.index), color: .accentColor, circleSize: 44).fixedSize() + Text(String(channel.name ?? "unknown".localized).camelCaseToWords()).font(.headline) } } ToolbarItem(placement: .navigationBarTrailing) { From 028987a4206f020d736c6bfdb460e124dae734b9 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Thu, 24 Apr 2025 08:10:58 -0700 Subject: [PATCH 26/93] Remove orphaned code --- Localizable.xcstrings | 96 ------------------- Meshtastic.xcodeproj/project.pbxproj | 16 ---- Meshtastic/Extensions/UserDefaults.swift | 18 ---- .../Helpers/Map/OfflineTileManager.swift | 74 -------------- Meshtastic/Helpers/Map/TileOverlay.swift | 15 --- Meshtastic/Views/Settings/AppSettings.swift | 25 ----- 6 files changed, 244 deletions(-) delete mode 100644 Meshtastic/Helpers/Map/OfflineTileManager.swift delete mode 100644 Meshtastic/Helpers/Map/TileOverlay.swift diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 138162db..1d170efb 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -7004,28 +7004,6 @@ } } }, - "Delete all map tiles?" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancellare tutte le tessere della mappa?" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Избрисати све плочице мапе?" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "删除所有瓦片地图?" - } - } - } - }, "Delete all positions?" : { "localizations" : { "it" : { @@ -17086,80 +17064,6 @@ } } }, - "Map Tile Data" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dati delle piastrelle della mappa" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подаци плочица мапе" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "瓦片地图数据" - } - } - } - }, - "map.tiles.delete" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete All Map Tiles" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Supprimer toutes les tuiles de carte" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מחק כל חלקי מפה שמורים" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancellare tutte le tessere della mappa" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Usuń Wszystkie Kafle Mapy" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Radera Alla Kartplattor" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Обриши све плочице мапе" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "删除所有瓦片地图" - } - } - } - }, "map.usertrackingmode.follow" : { "localizations" : { "de" : { diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 1ac17a2e..25d25afc 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -176,8 +176,6 @@ DDB6CCFB2AAF805100945AF6 /* NodeMapSwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB6CCFA2AAF805100945AF6 /* NodeMapSwiftUI.swift */; }; DDB75A0F2A05920E006ED576 /* FileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB75A0E2A05920E006ED576 /* FileManager.swift */; }; DDB75A112A059258006ED576 /* Url.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB75A102A059258006ED576 /* Url.swift */; }; - DDB75A142A0593E2006ED576 /* OfflineTileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB75A132A0593E2006ED576 /* OfflineTileManager.swift */; }; - DDB75A162A0594AD006ED576 /* TileOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB75A152A0594AD006ED576 /* TileOverlay.swift */; }; DDB75A1A2A05EB67006ED576 /* alpha.png in Resources */ = {isa = PBXBuildFile; fileRef = DDB75A192A05EB67006ED576 /* alpha.png */; }; DDB75A1E2A0B0CD0006ED576 /* LoRaSignalStrengthIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB75A1D2A0B0CD0006ED576 /* LoRaSignalStrengthIndicator.swift */; }; DDB75A212A12B954006ED576 /* LoRaSignalStrength.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB75A202A12B954006ED576 /* LoRaSignalStrength.swift */; }; @@ -475,8 +473,6 @@ DDB759E12A04B264006ED576 /* MeshtasticDataModelV12.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MeshtasticDataModelV12.xcdatamodel; sourceTree = ""; }; DDB75A0E2A05920E006ED576 /* FileManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileManager.swift; sourceTree = ""; }; DDB75A102A059258006ED576 /* Url.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Url.swift; sourceTree = ""; }; - DDB75A132A0593E2006ED576 /* OfflineTileManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OfflineTileManager.swift; sourceTree = ""; }; - DDB75A152A0594AD006ED576 /* TileOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TileOverlay.swift; sourceTree = ""; }; DDB75A192A05EB67006ED576 /* alpha.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = alpha.png; sourceTree = ""; }; DDB75A1D2A0B0CD0006ED576 /* LoRaSignalStrengthIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoRaSignalStrengthIndicator.swift; sourceTree = ""; }; DDB75A1F2A10766D006ED576 /* MeshtasticDataModelV13.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MeshtasticDataModelV13.xcdatamodel; sourceTree = ""; }; @@ -918,15 +914,6 @@ path = Map; sourceTree = ""; }; - DDB75A122A0593CD006ED576 /* Map */ = { - isa = PBXGroup; - children = ( - DDB75A132A0593E2006ED576 /* OfflineTileManager.swift */, - DDB75A152A0594AD006ED576 /* TileOverlay.swift */, - ); - path = Map; - sourceTree = ""; - }; DDC2E14B26CE248E0042C5E4 = { isa = PBXGroup; children = ( @@ -1064,7 +1051,6 @@ isa = PBXGroup; children = ( DDD43FE12A78C86B0083A3E9 /* Mqtt */, - DDB75A122A0593CD006ED576 /* Map */, DDAF8C5226EB1DF10058C060 /* BLEManager.swift */, DDC2E1A626CEB3400042C5E4 /* LocationHelper.swift */, DD913638270DFF4C00D7ACF3 /* LocalNotificationManager.swift */, @@ -1445,7 +1431,6 @@ DDDB444229F8A88700EE2349 /* Double.swift in Sources */, DDF45C342BC1A48E005ED5F2 /* MQTTIcon.swift in Sources */, DDA9515A2BC6624100CEA535 /* TelemetryWeather.swift in Sources */, - DDB75A162A0594AD006ED576 /* TileOverlay.swift in Sources */, DD1BD0EB2C601795008C0C70 /* CLLocation.swift in Sources */, DDF924CA26FBB953009FE055 /* ConnectedDevice.swift in Sources */, DD3CC6BE28E4CD9800FA9159 /* BatteryGauge.swift in Sources */, @@ -1520,7 +1505,6 @@ DD6F65762C6EA5490053C113 /* AckErrors.swift in Sources */, DDDB445029F8AC9C00EE2349 /* UIImage.swift in Sources */, DD86D40F2881BE4C00BAEB7A /* CsvDocument.swift in Sources */, - DDB75A142A0593E2006ED576 /* OfflineTileManager.swift in Sources */, DDB75A1E2A0B0CD0006ED576 /* LoRaSignalStrengthIndicator.swift in Sources */, DDA6B2E928419CF2003E8C16 /* MeshPackets.swift in Sources */, DDCE4E2C2869F92900BE9F8F /* UserConfig.swift in Sources */, diff --git a/Meshtastic/Extensions/UserDefaults.swift b/Meshtastic/Extensions/UserDefaults.swift index 740f04e2..ac13f24b 100644 --- a/Meshtastic/Extensions/UserDefaults.swift +++ b/Meshtastic/Extensions/UserDefaults.swift @@ -118,24 +118,6 @@ extension UserDefaults { @UserDefault(.enableMapPointsOfInterest, defaultValue: false) static var enableMapPointsOfInterest: Bool - @UserDefault(.enableOfflineMaps, defaultValue: false) - static var enableOfflineMaps: Bool - - @UserDefault(.mapTileServer, defaultValue: .openStreetMap) - static var mapTileServer: MapTileServer - - @UserDefault(.enableOverlayServer, defaultValue: false) - static var enableOverlayServer: Bool - - @UserDefault(.mapOverlayServer, defaultValue: .baseReReflectivityCurrent) - static var mapOverlayServer: MapOverlayServer - - @UserDefault(.mapTilesAboveLabels, defaultValue: false) - static var mapTilesAboveLabels: Bool - - @UserDefault(.mapUseLegacy, defaultValue: false) - static var mapUseLegacy: Bool - @UserDefault(.enableDetectionNotifications, defaultValue: false) static var enableDetectionNotifications: Bool diff --git a/Meshtastic/Helpers/Map/OfflineTileManager.swift b/Meshtastic/Helpers/Map/OfflineTileManager.swift deleted file mode 100644 index 66afa93c..00000000 --- a/Meshtastic/Helpers/Map/OfflineTileManager.swift +++ /dev/null @@ -1,74 +0,0 @@ -// -// OfflineTileManager.swift -// Meshtastic -// -// Copyright(c) Garth Vander Houwen 4/23/23. -// - -import Foundation -import MapKit -import OSLog - -class OfflineTileManager: ObservableObject { - static let shared = OfflineTileManager() - - // MARK: - Public properties - - @Published var status: DownloadStatus = .downloaded - - enum DownloadStatus { - case downloaded, downloading - } - - init() { - Logger.services.info("🗂️ Documents Directory = \(self.documentsDirectory.absoluteString, privacy: .public)") - createDirectoriesIfNecessary() - } - - // MARK: - Private properties - - private var overlay: MKTileOverlay { MKTileOverlay(urlTemplate: UserDefaults.mapTileServer.tileUrl.count > 1 ? UserDefaults.mapTileServer.tileUrl : MapTileServer.openStreetMap.tileUrl) } - private var documentsDirectory: URL { fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! } - private let fileManager = FileManager.default - - // MARK: - Public methods - - func getAllDownloadedSize() -> String { - fileManager.allocatedSizeOfDirectory(at: documentsDirectory.appendingPathComponent("tiles")) - } - - func removeAll() { - try? fileManager.removeItem(at: documentsDirectory.appendingPathComponent("tiles")) - createDirectoriesIfNecessary() - } - - func loadAndCacheTileOverlay(for path: MKTileOverlayPath) throws -> Data { - guard UserDefaults.enableOfflineMaps, UserDefaults.mapTileServer.zoomRange.contains(path.z) else { - return try Data(contentsOf: Bundle.main.url(forResource: "alpha", withExtension: "png")!) - } - - let tilesUrl = documentsDirectory - .appendingPathComponent("tiles") - .appendingPathComponent("\(UserDefaults.mapTileServer.id)-z\(path.z)x\(path.x)y\(path.y)") - .appendingPathExtension("png") - - do { - return try Data(contentsOf: tilesUrl) - } catch let error as NSError where error.code == NSFileReadNoSuchFileError { - DispatchQueue.main.async { self.status = .downloading } - defer { - DispatchQueue.main.async { self.status = .downloaded } - } - let data = try Data(contentsOf: overlay.url(forTilePath: path)) - try data.write(to: tilesUrl) - return data - } - } - - // MARK: Private methods - - private func createDirectoriesIfNecessary() { - let tiles = documentsDirectory.appendingPathComponent("tiles") - try? fileManager.createDirectory(at: tiles, withIntermediateDirectories: true, attributes: [:]) - } -} diff --git a/Meshtastic/Helpers/Map/TileOverlay.swift b/Meshtastic/Helpers/Map/TileOverlay.swift deleted file mode 100644 index 754771df..00000000 --- a/Meshtastic/Helpers/Map/TileOverlay.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// TileOverlay.swift -// Meshtastic -// -// Copyright(c) Garth Vander Houwen 5/5/23. -// - -import Foundation -import MapKit - -class TileOverlay: MKTileOverlay { - override func loadTile(at path: MKTileOverlayPath) async throws -> Data { - return try OfflineTileManager.shared.loadAndCacheTileOverlay(for: path) - } -} diff --git a/Meshtastic/Views/Settings/AppSettings.swift b/Meshtastic/Views/Settings/AppSettings.swift index d8d1a1e8..7ba7d3f9 100644 --- a/Meshtastic/Views/Settings/AppSettings.swift +++ b/Meshtastic/Views/Settings/AppSettings.swift @@ -8,7 +8,6 @@ import OSLog struct AppSettings: View { @Environment(\.managedObjectContext) var context @EnvironmentObject var bleManager: BLEManager - @ObservedObject var tileManager = OfflineTileManager.shared @State var totalDownloadedTileSize = "" @State private var isPresentingCoreDataResetConfirm = false @State private var isPresentingDeleteMapTilesConfirm = false @@ -85,31 +84,7 @@ struct AppSettings: View { .foregroundColor(.red) } } - if totalDownloadedTileSize != "0MB" { - Section(header: Text("Map Tile Data")) { - Button { - isPresentingDeleteMapTilesConfirm = true - } label: { - Label("\("map.tiles.delete".localized) (\(totalDownloadedTileSize))", systemImage: "trash") - .foregroundColor(.red) - } - .confirmationDialog( - "Are you sure?", - isPresented: $isPresentingDeleteMapTilesConfirm, - titleVisibility: .visible - ) { - Button("Delete all map tiles?", role: .destructive) { - tileManager.removeAll() - totalDownloadedTileSize = tileManager.getAllDownloadedSize() - Logger.services.debug("delete all tiles") - } - } - } - } } - .onAppear(perform: { - totalDownloadedTileSize = tileManager.getAllDownloadedSize() - }) } .navigationTitle("App Settings") .navigationBarItems(trailing: From 6f640fbb3f5530bf0b23f5a17450bb885c0c05cd Mon Sep 17 00:00:00 2001 From: unojazz Date: Thu, 24 Apr 2025 11:51:46 -0400 Subject: [PATCH 27/93] some translation --- Localizable.xcstrings | 970 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 918 insertions(+), 52 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 8d05dbc5..915e34d9 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -179,6 +179,12 @@ "state" : "translated", "value" : "%1$@ - %2$@ Towards %3$@ Back" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ - %2$@ 往 %3$@ 返" + } } } }, @@ -326,6 +332,12 @@ "state" : "translated", "value" : "%@ 离开" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 跳數遠" + } } } }, @@ -342,6 +354,12 @@ "state" : "translated", "value" : "%1$@ 的长度可达 %2$@ 字节" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 最長可以為 %@ bytes" + } } } }, @@ -1455,6 +1473,12 @@ "state" : "translated", "value" : "高级" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "進階" + } } } }, @@ -1493,6 +1517,12 @@ "state" : "translated", "value" : "高级 GPIO 选项" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "進階 GPIO 選項" + } } } }, @@ -1929,6 +1959,12 @@ "state" : "translated", "value" : "Увек усмеравајте на север" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "永遠指北" + } } } }, @@ -2333,6 +2369,12 @@ "state" : "translated", "value" : "可用的调制解调器预置,默认为 “Long Fast”。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "可用的 Modem 預設值,預設為 Long Fast" + } } } }, @@ -4414,6 +4456,12 @@ "state" : "translated", "value" : "客户端" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "客戶端" + } } } }, @@ -4430,6 +4478,12 @@ "state" : "translated", "value" : "客户端历史" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "客戶端歷史紀錄" + } } } }, @@ -4446,6 +4500,12 @@ "state" : "translated", "value" : "已发送客户端历史记录请求" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "客戶端歷史紀錄請求已送出" + } } } }, @@ -4462,6 +4522,12 @@ "state" : "translated", "value" : "客户端选项" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "客戶端選項" + } } } }, @@ -6473,6 +6539,12 @@ "state" : "translated", "value" : "Конвексна љуштура" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "凸包" + } } } }, @@ -6639,6 +6711,12 @@ "state" : "translated", "value" : "Креирајте путну тачку" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "建立路徑點" + } } } }, @@ -6687,6 +6765,12 @@ "state" : "translated", "value" : "当前固件版本号:%@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "目前韌體版本:%@" + } } } }, @@ -6709,6 +6793,12 @@ "state" : "translated", "value" : "当前固件版本号:%1$@,最新固件版本号:%2$@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "目前韌體版本:%@;最新韌體版本:%@" + } } } }, @@ -6760,6 +6850,12 @@ "state" : "translated", "value" : "Датум" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "日期" + } } } }, @@ -6776,6 +6872,12 @@ "state" : "translated", "value" : "Debug" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "偵錯" + } } } }, @@ -6792,6 +6894,12 @@ "state" : "translated", "value" : "Дебаг логови" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "偵錯紀錄" + } } } }, @@ -6802,6 +6910,12 @@ "state" : "translated", "value" : "Debug логови%@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "偵錯紀錄%@" + } } } }, @@ -6883,6 +6997,12 @@ "state" : "translated", "value" : "Подразумевано" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "預設" + } } } }, @@ -6906,6 +7026,12 @@ "state" : "translated", "value" : "默认 128x64 屏幕布局" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "預設 128x64 版型" + } } } }, @@ -7028,6 +7154,12 @@ "state" : "translated", "value" : "Обриши поруку" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "刪除訊息" + } } } }, @@ -7038,6 +7170,12 @@ "state" : "translated", "value" : "Обриши поруке" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "刪除訊息" + } } } }, @@ -7054,6 +7192,12 @@ "state" : "translated", "value" : "Обриши чвор" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "刪除節點" + } } } }, @@ -7070,6 +7214,12 @@ "state" : "translated", "value" : "Обрисати чвор?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "刪除節點?" + } } } }, @@ -7080,6 +7230,12 @@ "state" : "translated", "value" : "Обрисати метрике снаге?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "刪除電源資料?" + } } } }, @@ -7090,6 +7246,12 @@ "state" : "translated", "value" : "Опис" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "描述" + } } } }, @@ -7106,6 +7268,12 @@ "state" : "translated", "value" : "描述必须少于 100 字节" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "描述必須小於 100 bytes" + } } } }, @@ -7454,6 +7622,12 @@ "state" : "translated", "value" : "设备指标" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置數據" + } } } }, @@ -7470,6 +7644,12 @@ "state" : "translated", "value" : "设备指标日志" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置數據記錄" + } } } }, @@ -7492,6 +7672,12 @@ "state" : "translated", "value" : "设备模型:%@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置型號:%@" + } } } }, @@ -7530,6 +7716,12 @@ "state" : "translated", "value" : "设备屏幕" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置螢幕" + } } } }, @@ -8063,9 +8255,14 @@ "state" : "translated", "value" : "客户端" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Client" + } } - }, - "shouldTranslate" : false + } }, "device.role.name.clientHidden" : { "extractionState" : "manual", @@ -8093,9 +8290,14 @@ "state" : "translated", "value" : "客户端隐藏" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Client Hidden" + } } - }, - "shouldTranslate" : false + } }, "device.role.name.clientMute" : { "extractionState" : "manual", @@ -8117,9 +8319,14 @@ "state" : "translated", "value" : "客户端静默" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Client Mute" + } } - }, - "shouldTranslate" : false + } }, "device.role.name.lostAndFound" : { "extractionState" : "manual", @@ -8147,9 +8354,14 @@ "state" : "translated", "value" : "失物招领" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lost and Found" + } } - }, - "shouldTranslate" : false + } }, "device.role.name.repeater" : { "extractionState" : "manual", @@ -8177,9 +8389,14 @@ "state" : "translated", "value" : "中继" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Repeater" + } } - }, - "shouldTranslate" : false + } }, "device.role.name.router" : { "extractionState" : "manual", @@ -8207,9 +8424,14 @@ "state" : "translated", "value" : "路由" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router" + } } - }, - "shouldTranslate" : false + } }, "device.role.name.routerClient" : { "extractionState" : "manual", @@ -8237,9 +8459,14 @@ "state" : "translated", "value" : "路由 & 客户端" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router & Client" + } } - }, - "shouldTranslate" : false + } }, "device.role.name.routerlate" : { "extractionState" : "manual", @@ -8261,9 +8488,14 @@ "state" : "translated", "value" : "Рутер са кашњењем" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router Late" + } } - }, - "shouldTranslate" : false + } }, "device.role.name.sensor" : { "extractionState" : "manual", @@ -8291,9 +8523,14 @@ "state" : "translated", "value" : "传感器" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sensor" + } } - }, - "shouldTranslate" : false + } }, "device.role.name.tak" : { "extractionState" : "manual", @@ -8321,9 +8558,14 @@ "state" : "translated", "value" : "TAK" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "TAK" + } } - }, - "shouldTranslate" : false + } }, "device.role.name.takTracker" : { "extractionState" : "manual", @@ -8351,9 +8593,14 @@ "state" : "translated", "value" : "TAK 追踪器" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "TAK Tracker" + } } - }, - "shouldTranslate" : false + } }, "device.role.name.tracker" : { "extractionState" : "manual", @@ -8381,9 +8628,14 @@ "state" : "translated", "value" : "追踪器" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tracker" + } } - }, - "shouldTranslate" : false + } }, "device.role.repeater" : { "extractionState" : "migrated", @@ -8898,6 +9150,12 @@ "state" : "translated", "value" : "直频" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "直連" + } } } }, @@ -9008,7 +9266,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "聊天" + "value" : "私人訊息" } } } @@ -9032,6 +9290,12 @@ "state" : "translated", "value" : "禁用" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已停用" + } } } }, @@ -9240,6 +9504,12 @@ "state" : "translated", "value" : "展示华氏度" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "顯示華氏溫度" + } } } }, @@ -9256,6 +9526,12 @@ "state" : "translated", "value" : "显示模式" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "顯示模式" + } } } }, @@ -9272,6 +9548,12 @@ "state" : "translated", "value" : "显示单位" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "顯示單位" + } } } }, @@ -9477,6 +9759,12 @@ "state" : "translated", "value" : "启用下载" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Downlink 已啟用" + } } } }, @@ -9493,6 +9781,12 @@ "state" : "translated", "value" : "拖放升级固件" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "拖放更新韌體" + } } } }, @@ -9603,7 +9897,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "echo" + "value" : "Echo" } } } @@ -9615,6 +9909,12 @@ "state" : "translated", "value" : "Уређивање путне тачке" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "編輯路徑點" + } } } }, @@ -9706,6 +10006,12 @@ "state" : "translated", "value" : "Emoji" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Emoji" + } } } }, @@ -9722,6 +10028,12 @@ "state" : "translated", "value" : "空" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "空白" + } } } }, @@ -9741,6 +10053,12 @@ "state" : "translated", "value" : "启用通知" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用通知" + } } } }, @@ -10033,6 +10351,12 @@ "state" : "translated", "value" : "进入 DFU 模式" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "進入 DFU 模式" + } } } }, @@ -10127,6 +10451,12 @@ "state" : "translated", "value" : "擦除所有 App 数据?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "刪除所有 App 數據?" + } } } }, @@ -10149,6 +10479,12 @@ "state" : "translated", "value" : "擦除所有设备和 App 数据?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "刪除所有裝置及 App 數據?" + } } } }, @@ -10165,6 +10501,12 @@ "state" : "translated", "value" : "错误:%@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "錯誤:%@" + } } } }, @@ -10197,6 +10539,12 @@ "state" : "translated", "value" : "ESP32 设备固件升级" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "ESP32 裝置韌體更新" + } } } }, @@ -10207,6 +10555,12 @@ "state" : "translated", "value" : "Етернет опције" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "乙太網路選項" + } } } }, @@ -10263,6 +10617,12 @@ "state" : "translated", "value" : "Размени локације" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "交換位置" + } } } }, @@ -10273,6 +10633,12 @@ "state" : "translated", "value" : "Истиче" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "過期" + } } } }, @@ -10283,6 +10649,12 @@ "state" : "translated", "value" : "Истиче" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "過期" + } } } }, @@ -10293,6 +10665,12 @@ "state" : "translated", "value" : "Истиче: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "過期:%@" + } } } }, @@ -10501,6 +10879,12 @@ "state" : "translated", "value" : "Ресетовање на фабричка подешавања" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "恢復原廠設定" + } } } }, @@ -10633,6 +11017,12 @@ "state" : "translated", "value" : "Петнаест минута" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "十五分鐘" + } } } }, @@ -10773,6 +11163,12 @@ "state" : "translated", "value" : "固件" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "韌體" + } } } }, @@ -10789,6 +11185,12 @@ "state" : "translated", "value" : "固件升级文档" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "韌體更新說明文件" + } } } }, @@ -10811,6 +11213,12 @@ "state" : "translated", "value" : "固件升级" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "韌體更新" + } } } }, @@ -10966,6 +11374,12 @@ "state" : "translated", "value" : "Пет минута" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "五分鐘" + } } } }, @@ -11040,6 +11454,12 @@ "state" : "translated", "value" : "Фиксна локација" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "固定位置" + } } } }, @@ -11124,6 +11544,12 @@ "state" : "translated", "value" : "Фреквенција" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻率" + } } } }, @@ -11180,7 +11606,14 @@ } }, "Full Support" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "完整支援" + } + } + } }, "gas" : { "extractionState" : "manual", @@ -11399,6 +11832,12 @@ "state" : "translated", "value" : "获取节点位置" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "取得 Node 位置" + } } } }, @@ -11431,6 +11870,12 @@ "state" : "translated", "value" : "获取最新测试版固件" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "取得最新的Alpha版本韌體" + } } } }, @@ -11447,6 +11892,12 @@ "state" : "translated", "value" : "获取最新稳定版固件" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "取得最新的穩定版本韌體" + } } } }, @@ -11463,6 +11914,12 @@ "state" : "translated", "value" : "GPIO" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "GPIO" + } } } }, @@ -11473,6 +11930,12 @@ "state" : "translated", "value" : "Трајање GPIO излаза" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "GPIO 輸出長度" + } } } }, @@ -11546,6 +12009,12 @@ "state" : "translated", "value" : "GPS 格式" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "GPS 格式" + } } } }, @@ -11562,6 +12031,12 @@ "state" : "translated", "value" : "GPS Receive GPIO" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "GPS 輸入 GPIO" + } } } }, @@ -11578,6 +12053,12 @@ "state" : "translated", "value" : "GPS Transmit GPIO" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "GPS 輸出 GPIO" + } } } }, @@ -12021,6 +12502,12 @@ "state" : "translated", "value" : "禁用" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已停用" + } } } }, @@ -12074,6 +12561,12 @@ "state" : "translated", "value" : "启用" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已啟用" + } } } }, @@ -12169,6 +12662,12 @@ "state" : "translated", "value" : "硬件" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "硬體" + } } } }, @@ -12351,6 +12850,12 @@ "state" : "translated", "value" : "Сакриј упозорења" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "隱藏通知" + } } } }, @@ -12361,6 +12866,12 @@ "state" : "translated", "value" : "Сакриј алертове" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "隱藏通知" + } } } }, @@ -12513,6 +13024,12 @@ "state" : "translated", "value" : "小时" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "小時" + } } } }, @@ -12523,6 +13040,12 @@ "state" : "translated", "value" : "Натпросечни циклус дужности по сату" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "每小時 Duty Cycle" + } } } }, @@ -12825,9 +13348,14 @@ "state" : "translated", "value" : "IAQ" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "IAQ" + } } - }, - "shouldTranslate" : false + } }, "IAQ " : { "localizations" : { @@ -12842,9 +13370,14 @@ "state" : "translated", "value" : "IAQ " } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "IAQ" + } } - }, - "shouldTranslate" : false + } }, "IAQ %lld" : { "localizations" : { @@ -12876,6 +13409,12 @@ "state" : "translated", "value" : "图标" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Icon" + } } } }, @@ -15740,6 +16279,12 @@ "state" : "translated", "value" : "启用 JSON" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用 JSON" + } } } }, @@ -15778,6 +16323,12 @@ "state" : "translated", "value" : "Key" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "按鍵" + } } } }, @@ -16054,6 +16605,12 @@ "state" : "translated", "value" : "加载日志. . ." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在加載紀錄⋯⋯" + } } } }, @@ -16076,6 +16633,12 @@ "state" : "translated", "value" : "位置" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置" + } } } }, @@ -16098,6 +16661,12 @@ "state" : "translated", "value" : "位置:" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置:" + } } } }, @@ -16120,6 +16689,12 @@ "state" : "translated", "value" : "锁定" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已上鎖" + } } } }, @@ -16548,7 +17123,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "加載中" + "value" : "紀錄" } } } @@ -16566,6 +17141,12 @@ "state" : "translated", "value" : "日志" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "紀錄" + } } } }, @@ -16582,6 +17163,12 @@ "state" : "translated", "value" : "日志:" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "紀錄:" + } } } }, @@ -16604,6 +17191,12 @@ "state" : "translated", "value" : "长名称" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Long Name" + } } } }, @@ -16626,6 +17219,12 @@ "state" : "translated", "value" : "长名称: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Long Name: %@" + } } } }, @@ -16642,6 +17241,12 @@ "state" : "translated", "value" : "长按可收藏联系人或将其静音或删除对话。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "長按可將聯絡人加入最愛、靜音或刪除對話。" + } } } }, @@ -16659,9 +17264,14 @@ "state" : "translated", "value" : "Дугачки домет - Брзо" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Long Range - Fast" + } } - }, - "shouldTranslate" : false + } }, "long.range.moderate" : { "extractionState" : "manual", @@ -16677,9 +17287,14 @@ "state" : "translated", "value" : "Дугачки домет - Умерено" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Long Range - Moderate" + } } - }, - "shouldTranslate" : false + } }, "long.range.slow" : { "extractionState" : "manual", @@ -16695,9 +17310,14 @@ "state" : "translated", "value" : "Дугачки домет - Споро" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Long Range - Slow" + } } - }, - "shouldTranslate" : false + } }, "Longitude" : { "localizations" : { @@ -16972,6 +17592,12 @@ "state" : "translated", "value" : "НИЗАК" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "LOW" + } } } }, @@ -17034,6 +17660,12 @@ "state" : "translated", "value" : "管理设备" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理裝置" + } } } }, @@ -17120,6 +17752,12 @@ "state" : "translated", "value" : "地图选项" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "地圖選項" + } } } }, @@ -17693,9 +18331,14 @@ "state" : "translated", "value" : "Средњи домет - Брзо" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medium Range - Fast" + } } - }, - "shouldTranslate" : false + } }, "medium.range.slow" : { "extractionState" : "manual", @@ -17711,9 +18354,14 @@ "state" : "translated", "value" : "Средњи домет - Споро" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medium Range - Slow" + } } - }, - "shouldTranslate" : false + } }, "Mesh activity update" : { "localizations" : { @@ -20151,7 +20799,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "從節點收到航點封包:%@" + "value" : "從節點收到路徑點封包:%@" } } } @@ -20216,7 +20864,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "從 %@ 發送航點封包" + "value" : "從 %@ 發送路徑點封包" } } } @@ -21586,6 +22234,12 @@ "state" : "translated", "value" : "有固件可以更新" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "有更新的韌體可供使用" + } } } }, @@ -21860,6 +22514,12 @@ "state" : "translated", "value" : "Историја чвора" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "節點歷史位置" + } } } }, @@ -22791,6 +23451,12 @@ "state" : "translated", "value" : "选项" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "選項" + } } } }, @@ -23568,6 +24234,12 @@ "state" : "translated", "value" : "Тачке интересовања" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "興趣點" + } } } }, @@ -25709,6 +26381,12 @@ "state" : "translated", "value" : "Линије руте" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "路徑線" + } } } }, @@ -25719,6 +26397,12 @@ "state" : "translated", "value" : "Снимач руте" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "路徑紀錄" + } } } }, @@ -25729,6 +26413,12 @@ "state" : "translated", "value" : "Снимање руте паузирано" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "路徑紀錄已暫停" + } } } }, @@ -25755,6 +26445,12 @@ "state" : "translated", "value" : "Руте" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "路徑" + } } } }, @@ -27893,6 +28589,12 @@ "state" : "translated", "value" : "Пошаљи тачку путање" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "發送一個路徑點" + } } } }, @@ -27995,6 +28697,12 @@ "state" : "translated", "value" : "Опције сензора" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "傳感器選項" + } } } }, @@ -28005,6 +28713,12 @@ "state" : "translated", "value" : "Опције сензора" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "傳感器選項" + } } } }, @@ -28921,6 +29635,12 @@ "state" : "translated", "value" : "短名称" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "簡短名稱" + } } } }, @@ -28943,6 +29663,12 @@ "state" : "translated", "value" : "短名称: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "簡短名稱:%@" + } } } }, @@ -28960,9 +29686,14 @@ "state" : "translated", "value" : "Кратки домет - Брзо" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Short Range - Fast" + } } - }, - "shouldTranslate" : false + } }, "short.range.slow" : { "extractionState" : "manual", @@ -28978,9 +29709,14 @@ "state" : "translated", "value" : "Кратки домет - Споро" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Short Range - Slow" + } } - }, - "shouldTranslate" : false + } }, "short.range.turbo" : { "extractionState" : "manual", @@ -28996,9 +29732,14 @@ "state" : "translated", "value" : "Кратки домет - Турбо" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Short Range - Turbo" + } } - }, - "shouldTranslate" : false + } }, "Show alerts" : { "localizations" : { @@ -29045,6 +29786,12 @@ "state" : "translated", "value" : "Прикажи чворове" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "顯示節點" + } } } }, @@ -29093,6 +29840,12 @@ "state" : "translated", "value" : "Прикажи тачке путање" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "顯示路徑點" + } } } }, @@ -29690,6 +30443,12 @@ "state" : "translated", "value" : "Подржан" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "支援" + } } } }, @@ -30699,6 +31458,12 @@ "state" : "translated", "value" : "Смер компаса на екрану изван круга увек ће указивати на север." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "畫面上圓圈外的指北針方向將永遠指向北方。" + } } } }, @@ -30715,6 +31480,12 @@ "state" : "translated", "value" : "Тачка росе тренутно износи %@." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "當前露點為 %@" + } } } }, @@ -30757,6 +31528,12 @@ "state" : "translated", "value" : "设备 MAC 地址的后 4 位将附加到短名称中,以设置设备的 BLE 名称。 短名称的长度最多为 4 个字节。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置的 BLE 名稱將由簡短名稱加上裝置 MAC 位址的最後 4 碼組成。簡短名稱最多可為 4 個位元組長。" + } } } }, @@ -31886,6 +32663,12 @@ "state" : "translated", "value" : "Праћење руте" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trace Route" + } } } }, @@ -31896,6 +32679,12 @@ "state" : "translated", "value" : "Лог праћења руте комуникације" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trace Route 紀錄" + } } } }, @@ -31906,6 +32695,12 @@ "state" : "translated", "value" : "Захтев за праћење руте комуникације послат." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trace Route 已送出" + } } } }, @@ -31916,6 +32711,12 @@ "state" : "translated", "value" : "Захтев за праћење руте комуникације послат до %@." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trace Route 已送給 %@" + } } } }, @@ -31926,6 +32727,12 @@ "state" : "translated", "value" : "Захтев за праћење руте комуникације до %@ није послат." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "給 %@ 的 Trace Route 未送出。" + } } } }, @@ -31952,6 +32759,12 @@ "state" : "translated", "value" : "Саобраћај" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "交通狀況" + } } } }, @@ -31978,6 +32791,12 @@ "state" : "translated", "value" : "启用传输" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用傳輸" + } } } }, @@ -32409,6 +33228,12 @@ "state" : "translated", "value" : "Није подржано" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "不支援" + } } } }, @@ -32797,6 +33622,12 @@ "state" : "translated", "value" : "用户配置" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用者設定" + } } } }, @@ -32813,6 +33644,12 @@ "state" : "translated", "value" : "用户信息" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用者詳情" + } } } }, @@ -32829,6 +33666,12 @@ "state" : "translated", "value" : "用户 ID" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用者 ID" + } } } }, @@ -32991,6 +33834,12 @@ "state" : "translated", "value" : "版本 %1$@ 包括大量网络优化以及对设备和客户端应用程序的广泛更改。仅支持 %2$@ 及以上版本的节点。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "第 %1$@ 版本包含大量網路優化,以及對設備與用戶端應用程式的廣泛變更。僅支援版本為 %2$@ 或以上的節點。" + } } } }, @@ -33043,9 +33892,14 @@ "state" : "translated", "value" : "Веома дугачки домет - Споро" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Very Long Range - Slow" + } } - }, - "shouldTranslate" : false + } }, "Via Lora" : { "localizations" : { @@ -33284,6 +34138,12 @@ "state" : "translated", "value" : "Опције за тачке пута" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "路徑點選項" + } } } }, @@ -33667,6 +34527,12 @@ "state" : "translated", "value" : "你的固件已经是最新版本" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "您的韌體已是最新版本" + } } } }, From c298da88b52f439f9de9eb5ef4c4e4bb04540a02 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Thu, 24 Apr 2025 09:50:59 -0700 Subject: [PATCH 28/93] add retainsRegisteredObject bool --- Meshtastic/Persistence/Persistence.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Meshtastic/Persistence/Persistence.swift b/Meshtastic/Persistence/Persistence.swift index f18a8566..4b0fd147 100644 --- a/Meshtastic/Persistence/Persistence.swift +++ b/Meshtastic/Persistence/Persistence.swift @@ -45,6 +45,7 @@ class PersistenceController { // Merge policy that favors in memory data over data in the db self.container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy self.container.viewContext.automaticallyMergesChangesFromParent = true + self.container.viewContext.retainsRegisteredObjects = true if let error = error as NSError? { From cc84a244e8350e045835eb18831f3a6f3d204355 Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Thu, 24 Apr 2025 18:11:58 -0700 Subject: [PATCH 29/93] Added Back Scroll To Bottom --- Meshtastic.xcodeproj/project.pbxproj | 4 + .../Views/Messages/ChannelMessageList.swift | 98 ++++++-- .../Views/Messages/UserMessageList.swift | 237 +++++++++++------- .../Nodes/Helpers/ScrollToBottomButton.swift | 30 +++ 4 files changed, 257 insertions(+), 112 deletions(-) create mode 100644 Meshtastic/Views/Nodes/Helpers/ScrollToBottomButton.swift diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 25d25afc..62cf1085 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -62,6 +62,7 @@ BCB613832C672A2600485544 /* MessageChannelIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB613822C672A2600485544 /* MessageChannelIntent.swift */; }; BCB613852C68703800485544 /* NodePositionIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB613842C68703800485544 /* NodePositionIntent.swift */; }; BCB613872C69A0FB00485544 /* AppIntentErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB613862C69A0FB00485544 /* AppIntentErrors.swift */; }; + BCDDFA9A2DBB180D0065189C /* ScrollToBottomButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCDDFA992DBB180D0065189C /* ScrollToBottomButton.swift */; }; BCE2D3C32C7ADF42008E6199 /* ShutDownNodeIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCE2D3C22C7ADF42008E6199 /* ShutDownNodeIntent.swift */; }; BCE2D3C52C7AE369008E6199 /* RestartNodeIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCE2D3C42C7AE369008E6199 /* RestartNodeIntent.swift */; }; BCE2D3C72C7B0D0A008E6199 /* ShortcutsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCE2D3C62C7B0D0A008E6199 /* ShortcutsProvider.swift */; }; @@ -324,6 +325,7 @@ BCB613822C672A2600485544 /* MessageChannelIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageChannelIntent.swift; sourceTree = ""; }; BCB613842C68703800485544 /* NodePositionIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodePositionIntent.swift; sourceTree = ""; }; BCB613862C69A0FB00485544 /* AppIntentErrors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIntentErrors.swift; sourceTree = ""; }; + BCDDFA992DBB180D0065189C /* ScrollToBottomButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollToBottomButton.swift; sourceTree = ""; }; BCE2D3C22C7ADF42008E6199 /* ShutDownNodeIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShutDownNodeIntent.swift; sourceTree = ""; }; BCE2D3C42C7AE369008E6199 /* RestartNodeIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RestartNodeIntent.swift; sourceTree = ""; }; BCE2D3C62C7B0D0A008E6199 /* ShortcutsProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortcutsProvider.swift; sourceTree = ""; }; @@ -1107,6 +1109,7 @@ DDDB26412AABF655003AFCB7 /* NodeListItem.swift */, DDDCD56F2BB26F5C00BE6B60 /* NodeListFilter.swift */, 251926882C3BAF2E00249DF5 /* Actions */, + BCDDFA992DBB180D0065189C /* ScrollToBottomButton.swift */, ); path = Helpers; sourceTree = ""; @@ -1545,6 +1548,7 @@ DDA9515E2BC6F56F00CEA535 /* IndoorAirQuality.swift in Sources */, DDDB444E29F8AB0E00EE2349 /* Int.swift in Sources */, DD3CC6BC28E366DF00FA9159 /* Meshtastic.xcdatamodeld in Sources */, + BCDDFA9A2DBB180D0065189C /* ScrollToBottomButton.swift in Sources */, DDC4C9FF2A8D982900CE201C /* DetectionSensorConfig.swift in Sources */, 2344A2AF2D6697A700170A77 /* TelemetryEntity+CoreDataClass.swift in Sources */, 2344A2B02D6697A700170A77 /* TelemetryEntity+CoreDataProperties.swift in Sources */, diff --git a/Meshtastic/Views/Messages/ChannelMessageList.swift b/Meshtastic/Views/Messages/ChannelMessageList.swift index c2361ccb..0696e9d8 100644 --- a/Meshtastic/Views/Messages/ChannelMessageList.swift +++ b/Meshtastic/Views/Messages/ChannelMessageList.swift @@ -22,6 +22,11 @@ struct ChannelMessageList: View { @ObservedObject var channel: ChannelEntity @State private var replyMessageId: Int64 = 0 @AppStorage("preferredPeripheralNum") private var preferredPeripheralNum = -1 + + // Scroll state + @State private var showScrollToBottomButton = false + @State private var hasReachedBottom = false + @State private var gotFirstUnreadMessage: Bool = false var body: some View { VStack { @@ -103,6 +108,7 @@ struct ChannelMessageList: View { } } .padding(.bottom) + .id(channel.allPrivateMessages.firstIndex(of: message)) if !currentUser { Spacer(minLength: 50) @@ -112,49 +118,97 @@ struct ChannelMessageList: View { .frame(maxWidth: .infinity) .id(message.messageId) .onAppear { - if !message.read { - message.read = true - do { - for unreadMessage in channel.allPrivateMessages.filter({ !$0.read }) { - unreadMessage.read = true + if gotFirstUnreadMessage{ + if !message.read { + message.read = true + do { + for unreadMessage in channel.allPrivateMessages.filter({ !$0.read }) { + unreadMessage.read = true + } + try context.save() + Logger.data.info("📖 [App] Read message \(message.messageId, privacy: .public) ") + appState.unreadChannelMessages = myInfo.unreadMessages + context.refresh(myInfo, mergeChanges: true) + } catch { + Logger.data.error("Failed to read message \(message.messageId, privacy: .public): \(error.localizedDescription, privacy: .public)") } - try context.save() - Logger.data.info("📖 [App] Read message \(message.messageId, privacy: .public) ") - appState.unreadChannelMessages = myInfo.unreadMessages - context.refresh(myInfo, mergeChanges: true) - } catch { - Logger.data.error("Failed to read message \(message.messageId, privacy: .public): \(error.localizedDescription, privacy: .public)") + } + // Check if we've reached the bottom message + if message.messageId == channel.allPrivateMessages.last?.messageId { + hasReachedBottom = true + showScrollToBottomButton = false } } } } + // Invisible spacer to detect reaching bottom + Color.clear + .frame(height: 1) + .id("bottomAnchor") + .onAppear { + hasReachedBottom = true + showScrollToBottomButton = false + } } } .scrollDismissesKeyboard(.interactively) .onFirstAppear { - withAnimation { - scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + // Find first unread message + if let firstUnreadMessageId = channel.allPrivateMessages.first(where: { !$0.read })?.messageId { + withAnimation { + scrollView.scrollTo(firstUnreadMessageId, anchor: .top) + showScrollToBottomButton = true + } + } else { + // If no unread messages, scroll to bottom + withAnimation { + scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + hasReachedBottom = true + } } + gotFirstUnreadMessage = true } .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardDidShowNotification)) { _ in withAnimation { scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + hasReachedBottom = true + showScrollToBottomButton = false } } .onChange(of: channel.allPrivateMessages) { - withAnimation { - scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + if hasReachedBottom { + withAnimation { + scrollView.scrollTo(channel.allPrivateMessages.last?.messageId ?? 0, anchor: .bottom) + } + } else { + showScrollToBottomButton = true } } + + // Scroll to bottom button + if showScrollToBottomButton { + Button { + withAnimation { + scrollView.scrollTo("bottomAnchor", anchor: .bottom) + hasReachedBottom = true + showScrollToBottomButton = false + } + } label: { + ScrollToBottomButtonView() + } + .padding(.bottom, 8) + .padding(.trailing, 16) + .transition(.opacity) + } } + } - TextMessageField( - destination: .channel(channel), - replyMessageId: $replyMessageId, - isFocused: $messageFieldFocused - ) { - context.refresh(channel, mergeChanges: true) - } + TextMessageField( + destination: .channel(channel), + replyMessageId: $replyMessageId, + isFocused: $messageFieldFocused + ) { + context.refresh(channel, mergeChanges: true) } } .navigationBarTitleDisplayMode(.inline) diff --git a/Meshtastic/Views/Messages/UserMessageList.swift b/Meshtastic/Views/Messages/UserMessageList.swift index dea4586f..6f995756 100644 --- a/Meshtastic/Views/Messages/UserMessageList.swift +++ b/Meshtastic/Views/Messages/UserMessageList.swift @@ -20,115 +20,172 @@ struct UserMessageList: View { // View State Items @ObservedObject var user: UserEntity @State private var replyMessageId: Int64 = 0 + + // Scroll state + @State private var showScrollToBottomButton = false + @State private var hasReachedBottom = false + @State private var gotFirstUnreadMessage: Bool = false var body: some View { VStack { ScrollViewReader { scrollView in - ScrollView { - LazyVStack { - ForEach( user.messageList ) { (message: MessageEntity) in - if user.num != bleManager.connectedPeripheral?.num ?? -1 { - let currentUser: Bool = (Int64(UserDefaults.preferredPeripheralNum) == message.fromUser?.num ?? -1 ? true : false) + ZStack(alignment: .bottomTrailing) { + ScrollView { + LazyVStack { + ForEach( user.messageList ) { (message: MessageEntity) in + if user.num != bleManager.connectedPeripheral?.num ?? -1 { + let currentUser: Bool = (Int64(UserDefaults.preferredPeripheralNum) == message.fromUser?.num ?? -1 ? true : false) - if message.replyID > 0 { - let messageReply = user.messageList.first(where: { $0.messageId == message.replyID }) - HStack { - Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) - .padding(10) - .overlay( - RoundedRectangle(cornerRadius: 18) - .stroke(Color.blue, lineWidth: 0.5) - ) - Image(systemName: "arrowshape.turn.up.left.fill") - .symbolRenderingMode(.hierarchical) - .imageScale(.large).foregroundColor(.accentColor) - .padding(.trailing) + if message.replyID > 0 { + let messageReply = user.messageList.first(where: { $0.messageId == message.replyID }) + HStack { + Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) + .padding(10) + .overlay( + RoundedRectangle(cornerRadius: 18) + .stroke(Color.blue, lineWidth: 0.5) + ) + Image(systemName: "arrowshape.turn.up.left.fill") + .symbolRenderingMode(.hierarchical) + .imageScale(.large).foregroundColor(.accentColor) + .padding(.trailing) + } } - } - HStack(alignment: .top) { - if currentUser { Spacer(minLength: 50) } - VStack(alignment: currentUser ? .trailing : .leading) { - HStack { - MessageText( - message: message, - tapBackDestination: .user(user), - isCurrentUser: currentUser - ) { - self.replyMessageId = message.messageId - self.messageFieldFocused = true - } - - if currentUser && message.canRetry || (message.receivedACK && !message.realACK) { - RetryButton(message: message, destination: .user(user)) - } - } - - TapbackResponses(message: message) { - appState.unreadDirectMessages = user.unreadMessages - } - - HStack { - let ackErrorVal = RoutingError(rawValue: Int(message.ackError)) - if currentUser && message.receivedACK { - // Ack Received - if message.realACK { - Text("\(ackErrorVal?.display ?? "Empty Ack Error")") - .font(.caption2) - .foregroundStyle(ackErrorVal?.color ?? Color.secondary) - } else { - Text("Acknowledged by another node").font(.caption2).foregroundColor(.orange) + HStack(alignment: .top) { + if currentUser { Spacer(minLength: 50) } + VStack(alignment: currentUser ? .trailing : .leading) { + HStack { + MessageText( + message: message, + tapBackDestination: .user(user), + isCurrentUser: currentUser + ) { + self.replyMessageId = message.messageId + self.messageFieldFocused = true + } + + if currentUser && message.canRetry || (message.receivedACK && !message.realACK) { + RetryButton(message: message, destination: .user(user)) + } + } + + TapbackResponses(message: message) { + appState.unreadDirectMessages = user.unreadMessages + } + + HStack { + let ackErrorVal = RoutingError(rawValue: Int(message.ackError)) + if currentUser && message.receivedACK { + // Ack Received + if message.realACK { + Text("\(ackErrorVal?.display ?? "Empty Ack Error")") + .font(.caption2) + .foregroundStyle(ackErrorVal?.color ?? Color.secondary) + } else { + Text("Acknowledged by another node").font(.caption2).foregroundColor(.orange) + } + } else if currentUser && message.ackError == 0 { + // Empty Error + Text("Waiting to be acknowledged. . .").font(.caption2).foregroundColor(.yellow) + } else if currentUser && message.ackError > 0 { + Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) + .foregroundStyle(ackErrorVal?.color ?? Color.red) + .font(.caption2) } - } else if currentUser && message.ackError == 0 { - // Empty Error - Text("Waiting to be acknowledged. . .").font(.caption2).foregroundColor(.yellow) - } else if currentUser && message.ackError > 0 { - Text("\(ackErrorVal?.display ?? "Empty Ack Error")").fixedSize(horizontal: false, vertical: true) - .foregroundStyle(ackErrorVal?.color ?? Color.red) - .font(.caption2) } } - } - .padding(.bottom) - .id(user.messageList.firstIndex(of: message)) + .padding(.bottom) + .id(user.messageList.firstIndex(of: message)) - if !currentUser { - Spacer(minLength: 50) + if !currentUser { + Spacer(minLength: 50) + } } - } - .padding([.leading, .trailing]) - .frame(maxWidth: .infinity) - .id(message.messageId) - .onAppear { - if !message.read { - message.read = true - do { - try context.save() - Logger.data.info("📖 [App] Read message \(message.messageId, privacy: .public) ") - appState.unreadDirectMessages = user.unreadMessages - - } catch { - Logger.data.error("Failed to read message \(message.messageId, privacy: .public): \(error.localizedDescription, privacy: .public)") + .padding([.leading, .trailing]) + .frame(maxWidth: .infinity) + .id(message.messageId) + .onAppear { + if gotFirstUnreadMessage { + if !message.read { + message.read = true + do { + for unreadMessage in user.messageList.filter({ !$0.read }) { + unreadMessage.read = true + } + try context.save() + Logger.data.info("📖 [App] Read message \(message.messageId, privacy: .public) ") + appState.unreadDirectMessages = user.unreadMessages + } catch { + Logger.data.error("Failed to read message \(message.messageId, privacy: .public): \(error.localizedDescription, privacy: .public)") + } + } + // Check if we've reached the bottom message + if message.messageId == user.messageList.last?.messageId { + hasReachedBottom = true + showScrollToBottomButton = false + } } } } } + // Invisible spacer to detect reaching bottom + Color.clear + .frame(height: 1) + .id("bottomAnchor") + .onAppear { + hasReachedBottom = true + showScrollToBottomButton = false + } } } - } - .scrollDismissesKeyboard(.interactively) - .onFirstAppear { - withAnimation { - scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) + .scrollDismissesKeyboard(.interactively) + .onFirstAppear { + // Find first unread message + if let firstUnreadMessageId = user.messageList.first(where: { !$0.read })?.messageId { + withAnimation { + scrollView.scrollTo(firstUnreadMessageId, anchor: .top) + showScrollToBottomButton = true + } + } else { + // If no unread messages, scroll to bottom + withAnimation { + scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) + hasReachedBottom = true + } + } + gotFirstUnreadMessage = true } - } - .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardDidShowNotification)) { _ in - withAnimation { - scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) + .onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardDidShowNotification)) { _ in + withAnimation { + scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) + hasReachedBottom = true + showScrollToBottomButton = false + } } - } - .onChange(of: user.messageList) { - withAnimation { - scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) + .onChange(of: user.messageList) { + if hasReachedBottom { + withAnimation { + scrollView.scrollTo(user.messageList.last?.messageId ?? 0, anchor: .bottom) + } + } else { + showScrollToBottomButton = true + } + } + + // Scroll to bottom button + if showScrollToBottomButton { + Button { + withAnimation { + scrollView.scrollTo("bottomAnchor", anchor: .bottom) + hasReachedBottom = true + showScrollToBottomButton = false + } + } label: { + ScrollToBottomButtonView() + } + .padding(.bottom, 8) + .padding(.trailing, 16) + .transition(.opacity) } } } diff --git a/Meshtastic/Views/Nodes/Helpers/ScrollToBottomButton.swift b/Meshtastic/Views/Nodes/Helpers/ScrollToBottomButton.swift new file mode 100644 index 00000000..da10d18a --- /dev/null +++ b/Meshtastic/Views/Nodes/Helpers/ScrollToBottomButton.swift @@ -0,0 +1,30 @@ +// +// ScrollToBottomButtonView.swift +// Meshtastic +// +// Created by Benjamin Faershtein on 4/2/25. +// + +import SwiftUI + +struct ScrollToBottomButtonView: View { + var body: some View { + HStack(spacing: 4) { + Text("Jump to present") + .font(.caption) + .padding(.horizontal, 8) + .padding(.vertical, 4) + .cornerRadius(12) + Image(systemName: "arrow.down") + .font(.title2) + .symbolRenderingMode(.hierarchical) + + } + .foregroundColor(.accentColor) + .shadow(radius: 2) + } +} + +#Preview { + ScrollToBottomButtonView() +} From 29f8aa06e636ba805a3d56ec2062d2ae5a70399b Mon Sep 17 00:00:00 2001 From: unojazz Date: Sat, 26 Apr 2025 11:58:02 -0400 Subject: [PATCH 30/93] some translation --- Localizable.xcstrings | 1716 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 1621 insertions(+), 95 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 915e34d9..237efc86 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -336,7 +336,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "%@ 跳數遠" + "value" : "%@ 遠" } } } @@ -398,6 +398,12 @@ "state" : "translated", "value" : "已通过管理频道请求 %@ 配置数据,但远程节点未返回任何响应。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "透過管理通道請求 %@ 組態資料,但遠端節點未回應。" + } } } }, @@ -590,7 +596,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "%@ 這個錯誤通常無法自動修復,你需要在系統設定的藍芽選項中忽略該節點並重新配對。" + "value" : "%@ 這個錯誤通常無法自動修復,您需要在系統設定的藍芽選項中忽略該節點並重新配對。" } } } @@ -794,7 +800,7 @@ "other" : { "stringUnit" : { "state" : "translated", - "value" : "%d Hops" + "value" : "%d 跳數" } }, "zero" : { @@ -876,7 +882,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "%lld 或更少的Hops以外" + "value" : "%lld 個挑數以內" } } } @@ -888,6 +894,12 @@ "state" : "translated", "value" : "Укупно %lld читања" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld 筆讀數總計" + } } } }, @@ -898,6 +910,12 @@ "state" : "translated", "value" : "Укупно %lld догађаја детекције" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld 次偵測事件總計" + } } } }, @@ -915,7 +933,8 @@ "value" : "%lld%%" } } - } + }, + "shouldTranslate" : false }, "%llddb Transmit Power" : { "localizations" : { @@ -936,6 +955,12 @@ "state" : "translated", "value" : "发射功率 %llddb" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "發射功率 %lld db" + } } } }, @@ -952,6 +977,12 @@ "state" : "translated", "value" : "%llddBm снага преноса" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "發射功率 %lld dBm" + } } } }, @@ -1018,6 +1049,12 @@ "state" : "translated", "value" : "1 跳" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "一個跳數遠" + } } } }, @@ -1180,7 +1217,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "已發送 Trace Route,但未收到任何回應。" + "value" : "已發送追蹤路由(Trace Route),但未收到任何回應。" } } } @@ -1261,7 +1298,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Ack 時間: %@" + "value" : "確認時間: %@" } } } @@ -1277,7 +1314,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "已被其他節點確認接收。" + "value" : "已被其他節點確認接收" } } } @@ -1317,6 +1354,12 @@ "state" : "translated", "value" : "Активан" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "在線" + } } } }, @@ -1339,6 +1382,12 @@ "state" : "translated", "value" : "活动" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "活動" + } } } }, @@ -1349,6 +1398,12 @@ "state" : "translated", "value" : "Додај канал" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "增加頻道" + } } } }, @@ -1359,6 +1414,12 @@ "state" : "translated", "value" : "Додај канале" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "增加頻道" + } } } }, @@ -1397,6 +1458,12 @@ "state" : "translated", "value" : "其他帮助" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "更多幫助" + } } } }, @@ -1413,6 +1480,12 @@ "state" : "translated", "value" : "地址" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "地址" + } } } }, @@ -1435,6 +1508,12 @@ "state" : "translated", "value" : "管理员 & 私信密钥" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理與直接訊息加密金鑰" + } } } }, @@ -1539,6 +1618,12 @@ "state" : "translated", "value" : "高级位置标志" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "進階位置標記" + } } } }, @@ -1667,6 +1752,12 @@ "state" : "translated", "value" : "Узбуна" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "發送提醒" + } } } }, @@ -1811,6 +1902,12 @@ "state" : "translated", "value" : "Дозволите контролу долазног уређаја над небезбедним старим администраторским каналом." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "允許經由不安全的傳統管理通道接收裝置控制指令。" + } } } }, @@ -1831,6 +1928,12 @@ "state" : "translated", "value" : "Висина" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "高度" + } } } }, @@ -1847,6 +1950,12 @@ "state" : "translated", "value" : "Висина" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "高度" + } } } }, @@ -1863,6 +1972,12 @@ "state" : "translated", "value" : "Висина %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "高度 %@" + } } } }, @@ -1873,6 +1988,12 @@ "state" : "translated", "value" : "Висинска геоидна сепарација" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "大地分離高度(Altitude Geoidal Separation)" + } } } }, @@ -1883,6 +2004,12 @@ "state" : "translated", "value" : "Надморска висина је средњи ниво мора" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "高度為平均海平面高度" + } } } }, @@ -1939,12 +2066,11 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "常亮" } } - }, - "shouldTranslate" : false + } }, "Always point north" : { "localizations" : { @@ -2224,6 +2350,12 @@ "state" : "translated", "value" : "Приближна локација" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "大略位置" + } } } }, @@ -2240,6 +2372,12 @@ "state" : "translated", "value" : "你确定删除这条消息么?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "您確定要刪除這則訊息嗎?" + } } } }, @@ -2262,6 +2400,12 @@ "state" : "translated", "value" : "你确定要初始化这个节点么?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "你確定要將此節點恢復原廠設定嗎?" + } } } }, @@ -2373,7 +2517,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "可用的 Modem 預設值,預設為 Long Fast" + "value" : "可用的數據機預設值,預設為 Long Fast" } } } @@ -2455,6 +2599,12 @@ "state" : "translated", "value" : "带宽" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻寬" + } } } }, @@ -2471,6 +2621,12 @@ "state" : "translated", "value" : "Bar" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "格" + } } } }, @@ -2599,6 +2755,12 @@ "state" : "translated", "value" : "波特率" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "鮑率(Baud)" + } } } }, @@ -2731,6 +2893,12 @@ "state" : "translated", "value" : "BLE RSSI: %lld" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "藍牙訊號強度(RSSI):%lld" + } } } }, @@ -2747,6 +2915,12 @@ "state" : "translated", "value" : "BLE: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "藍牙名稱:%@" + } } } }, @@ -2937,6 +3111,12 @@ "state" : "translated", "value" : "广播间隔" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "廣播間隔" + } } } }, @@ -2953,6 +3133,12 @@ "state" : "translated", "value" : "按钮 GPIO" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "按鈕 GPIO" + } } } }, @@ -2969,6 +3155,12 @@ "state" : "translated", "value" : "购买完整的电台" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "購買完整套件" + } } } }, @@ -2985,6 +3177,12 @@ "state" : "translated", "value" : "蜂鸣器 GPIO" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "蜂鳴器 GPIO" + } } } }, @@ -3489,6 +3687,12 @@ "state" : "translated", "value" : "分类" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "分類" + } } } }, @@ -3883,6 +4087,12 @@ "state" : "translated", "value" : "频道详情" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道資料" + } } } }, @@ -3959,11 +4169,24 @@ "state" : "translated", "value" : "Линк канала" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道網址" + } } } }, "Channel Utilization %@%%" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道利用率 %@%%" + } + } + } }, "channel.role.disabled" : { "extractionState" : "migrated", @@ -4662,11 +4885,24 @@ "state" : "translated", "value" : "Комуницирам" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "通訊中" + } } } }, "Community Support" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "社群支援" + } + } + } }, "Config" : { "localizations" : { @@ -5522,7 +5758,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "之後" + "value" : "間隔之後" } } } @@ -6022,6 +6258,12 @@ "state" : "translated", "value" : "配置预设" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定預設組態" + } } } }, @@ -6038,11 +6280,24 @@ "state" : "translated", "value" : "Конфигуриши" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定" + } } } }, "Confirm" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "確認" + } + } + } }, "Connect to a Node" : { "localizations" : { @@ -6057,11 +6312,24 @@ "state" : "translated", "value" : "Повежите се са чвором" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在連接節點" + } } } }, "Connect to new radio?" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "連接新的節點?" + } + } + } }, "connected" : { "localizations" : { @@ -6140,11 +6408,24 @@ "state" : "translated", "value" : "Повезани чвор %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已連接的節點 %@" + } } } }, "Connected Radio" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已連接的節點" + } + } + } }, "connected.radio" : { "localizations" : { @@ -6296,6 +6577,12 @@ "state" : "translated", "value" : "连接尝试 %lld,共 10 次" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "嘗試連接 %lld / 10" + } } } }, @@ -6359,7 +6646,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "嘗試連接%d失敗,你可能需要在系统設定的藍芽選項中忽略該節點。" + "value" : "嘗試連接%d失敗,您可能需要在系统設定的藍芽選項中忽略該節點。" } } } @@ -6561,6 +6848,12 @@ "state" : "translated", "value" : "Координате" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "經緯度" + } } } }, @@ -6583,6 +6876,12 @@ "state" : "translated", "value" : "坐标 %1$@, %2$@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "經緯度 %@, %@" + } } } }, @@ -6599,6 +6898,12 @@ "state" : "translated", "value" : "Координате:" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "經緯度:" + } } } }, @@ -6743,6 +7048,12 @@ "state" : "translated", "value" : "Струја" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電流" + } } } }, @@ -6815,11 +7126,24 @@ "state" : "translated", "value" : "Тренутно: %lld" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電流:%lld" + } } } }, "Currently showing modules that may not be supported by this node." : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "目前顯示的模組可能不受此節點支援。" + } + } + } }, "Currently the recommended way to update ESP32 devices is using the web flasher on a desktop computer from a chrome based browser. It does not work on mobile devices or over BLE." : { "localizations" : { @@ -7116,7 +7440,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "刪除所有環境資料?" + "value" : "刪除所有環境指標?" } } } @@ -7234,7 +7558,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "刪除電源資料?" + "value" : "刪除電源指標?" } } } @@ -7304,6 +7628,12 @@ "state" : "translated", "value" : "Логови сензора откривања" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "檢測感測器紀錄" + } } } }, @@ -7476,6 +7806,12 @@ "state" : "translated", "value" : "检测传感器日志" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "檢測感測器紀錄" + } } } }, @@ -7492,6 +7828,12 @@ "state" : "translated", "value" : "开发者" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "開發者" + } } } }, @@ -8921,7 +9263,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "優先廣播遙測資料。" + "value" : "優先廣播遙測指標。" } } } @@ -9172,6 +9514,12 @@ "state" : "translated", "value" : "私信帮助" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "私訊功能使用指南" + } } } }, @@ -9188,6 +9536,12 @@ "state" : "translated", "value" : "私聊使用新的公钥基础设施进行加密。需要 2.5 或更高版本的固件。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "私訊已使用新的公開金鑰基礎設施進行加密,需韌體版本 2.5 或更高版本才能支援。" + } } } }, @@ -9204,6 +9558,12 @@ "state" : "translated", "value" : "私聊使用频道的共享密钥。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "私訊使用共用金鑰進行加密傳輸。" + } } } }, @@ -9763,7 +10123,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Downlink 已啟用" + "value" : "啟用下行(Downlink)" } } } @@ -9825,6 +10185,12 @@ "state" : "translated", "value" : "拖放是更新 NRF 设备固件的推荐方式。如果您的 iPhone 或 iPad 是 USB-C 接口,则可以使用普通的 USB-C 充电线;如果是 Lightning 设备,则需要使用 Apple Lightning to USB 摄像头适配器。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "拖放(Drag & Drop)是更新 NRF 裝置韌體的建議方式。如果你的 iPhone 或 iPad 是 USB-C 版本,可以直接使用一般的 USB-C 充電線。若是 Lightning 裝置,則需要使用 Apple 的 Lightning 對 USB 相機轉接器。" + } } } }, @@ -10158,6 +10524,12 @@ "state" : "translated", "value" : "启用检测传感器模块,需要在装有传感器的节点和要接收检测传感器文本信息或查看检测传感器日志和图表的任何节点上启用该模块。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用偵測感測器模組。此功能需在裝有感測器的節點及希望接收偵測感測器文字訊息或瀏覽偵測日誌與圖表的節點上同時啟用。" + } } } }, @@ -10523,6 +10895,12 @@ "state" : "translated", "value" : "ESP 32 OTA 更新正在进行中,请单击下面的按钮向您的设备发送重新启动进入 OTA 管理信息。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "ESP32 的 OTA 更新功能尚在開發中,請點擊下方按鈕以傳送重新啟動至 OTA 管理模式的訊息至您的裝置。" + } } } }, @@ -10901,6 +11279,12 @@ "state" : "translated", "value" : "Вратите уређај и апликацију на фабричка подешавања?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "要將你的裝置與應用程式恢復原廠設定嗎?" + } } } }, @@ -10991,6 +11375,12 @@ "state" : "translated", "value" : "收藏夹和有最近信息的节点会显示在联系人列表的顶部。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已加為最愛的聯絡人與最近有訊息的節點會顯示在聯絡人清單的最上方。" + } } } }, @@ -11021,7 +11411,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "十五分鐘" + "value" : "15 分鐘" } } } @@ -11033,6 +11423,12 @@ "state" : "translated", "value" : "Складиште података" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "檔案儲存" + } } } }, @@ -11358,6 +11754,12 @@ "state" : "translated", "value" : "Прво откривање" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "首次通訊" + } } } }, @@ -11378,7 +11780,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "五分鐘" + "value" : "5 分鐘" } } } @@ -11470,6 +11872,12 @@ "state" : "translated", "value" : "Окрени екран" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "翻轉畫面" + } } } }, @@ -11480,6 +11888,12 @@ "state" : "translated", "value" : "Окрени екран вертикално" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "將螢幕畫面垂直翻轉顯示" + } } } }, @@ -11496,6 +11910,12 @@ "state" : "translated", "value" : "对于除地图报告外的所有 MQTT 功能,您还必须为希望通过 MQTT 桥接的每个信道设置上行和下行链路。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "除了地圖回報之外,若要使用其他所有 MQTT 功能,您必須為每個想透過 MQTT 橋接的頻道設定上行(Uplink)與下行(Downlink)參數。" + } } } }, @@ -11560,6 +11980,12 @@ "state" : "translated", "value" : "Измена фреквенције" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻率覆寫(Frequency Override)" + } } } }, @@ -11570,6 +11996,12 @@ "state" : "translated", "value" : "Фреквенцијски слот" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻率槽位" + } } } }, @@ -11810,6 +12242,12 @@ "state" : "translated", "value" : "Набавите прилагођене водоотпорне соларне и детекционе сензорске рутер чворове, алуминијумске десктоп чворове и издржљиве мобилне уређаје." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "提供客製化防水太陽能感測路由器節點、鋁製桌面節點,以及耐候型手持裝置。" + } } } }, @@ -12614,6 +13052,12 @@ "state" : "translated", "value" : "不存在" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "無模組" + } } } }, @@ -12678,6 +13122,12 @@ "state" : "translated", "value" : "Смер" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "朝向" + } } } }, @@ -12688,6 +13138,12 @@ "state" : "translated", "value" : "Смер: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "朝向:%@" + } } } }, @@ -12751,7 +13207,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "接收" + "value" : "通訊" } } } @@ -12816,7 +13272,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "最後通訊時間" + "value" : "最後通訊" } } } @@ -12854,7 +13310,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "隱藏通知" + "value" : "靜音通知" } } } @@ -12870,7 +13326,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "隱藏通知" + "value" : "靜音通知" } } } @@ -12934,7 +13390,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Hops 以外" + "value" : "跳數" } } } @@ -12956,7 +13412,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Hops 以外 %d" + "value" : "跳數距離 %d" } } } @@ -12978,7 +13434,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Hops 以外:" + "value" : "跳數距離:" } } } @@ -13000,7 +13456,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Hops 以外: %d" + "value" : "跳數距離:%d" } } } @@ -13078,6 +13534,12 @@ "state" : "translated", "value" : "设备指标通过网格发送的频率。默认为 30 分钟。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置指標透過網狀網路發送的頻率。預設為每 30 分鐘一次。" + } } } }, @@ -13094,6 +13556,12 @@ "state" : "translated", "value" : "通过网格发送功率指标的频率。默认为 30 分钟。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電力指標透過網狀網路發送的頻率。預設為每 30 分鐘一次。" + } } } }, @@ -13110,6 +13578,12 @@ "state" : "translated", "value" : "通过网格发送传感器指标的频率。默认为 30 分钟。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "感測器數據透過網狀網路發送的頻率。預設為每 30 分鐘一次。\n" + } } } }, @@ -13126,6 +13600,12 @@ "state" : "translated", "value" : "尝试获取 GPS 定位的频率。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "嘗試取得 GPS 位置的頻率。" + } } } }, @@ -13142,6 +13622,12 @@ "state" : "translated", "value" : "无论是否检测到,向网格发送检测传感器状态的频率。默认为从不。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "不論是否偵測到事件,將偵測感測器狀態發送至網狀網路的頻率。預設為「從不」。" + } } } }, @@ -13463,6 +13949,12 @@ "state" : "translated", "value" : "如果难以访问设备的重置按钮,请在此进入 DFU 模式。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "若無法輕易按下裝置的重置按鈕,可於此進入 DFU 模式。" + } } } }, @@ -13495,6 +13987,12 @@ "state" : "translated", "value" : "如果默认区域话题太忙,您可以选择一个更本地化的话题。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "如果預設的區域主題過於繁忙,您可以選擇一個較在地的主題。" + } } } }, @@ -13533,6 +14031,12 @@ "state" : "translated", "value" : "忽略节点" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "忽略該節點" + } } } }, @@ -14372,7 +14876,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "十八小時" + "value" : "18 小時" } } } @@ -14395,7 +14899,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "七十二小時" + "value" : "72 小時" } } } @@ -14460,7 +14964,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "十五分鐘" + "value" : "15 分鐘" } } } @@ -14525,7 +15029,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "十五秒" + "value" : "15 秒" } } } @@ -14590,7 +15094,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "五小時" + "value" : "5 小時" } } } @@ -14655,7 +15159,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "五分鐘" + "value" : "5 分鐘" } } } @@ -14720,7 +15224,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "五秒" + "value" : "5 秒" } } } @@ -14850,7 +15354,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "四十五秒" + "value" : "45 秒" } } } @@ -14915,7 +15419,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "四小時" + "value" : "4 小時" } } } @@ -14980,7 +15484,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "四秒" + "value" : "4 秒" } } } @@ -15045,7 +15549,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "一小時" + "value" : "1 小時" } } } @@ -15110,7 +15614,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "一分鐘" + "value" : "1 分鐘" } } } @@ -15175,7 +15679,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "一秒" + "value" : "1 秒" } } } @@ -15305,7 +15809,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "六小時" + "value" : "6 小時" } } } @@ -15370,7 +15874,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "十分鐘" + "value" : "10 分鐘" } } } @@ -15435,7 +15939,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "十秒" + "value" : "10 秒" } } } @@ -15500,7 +16004,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "三十分鐘" + "value" : "30 分鐘" } } } @@ -15565,7 +16069,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "三十秒" + "value" : "30 秒" } } } @@ -15630,7 +16134,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "三十六小時" + "value" : "36 小時" } } } @@ -15695,7 +16199,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "三小時" + "value" : "3 小時" } } } @@ -15760,7 +16264,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "三秒" + "value" : "3 秒" } } } @@ -15825,7 +16329,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "十二小時" + "value" : "12 小時" } } } @@ -15890,7 +16394,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "二十秒" + "value" : "20 秒" } } } @@ -15955,7 +16459,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "二十五秒" + "value" : "25 秒" } } } @@ -16020,7 +16524,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "二十四小時" + "value" : "24 小時" } } } @@ -16085,7 +16589,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "兩小時" + "value" : "2 小時" } } } @@ -16150,7 +16654,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "兩分鐘" + "value" : "2 分鐘" } } } @@ -16215,7 +16719,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "兩秒" + "value" : "2 秒" } } } @@ -16240,6 +16744,12 @@ "state" : "translated", "value" : "倒置顶栏,用于双色显示" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "雙色螢幕(頂部工具列反轉配色)" + } } } }, @@ -16301,6 +16811,12 @@ "state" : "translated", "value" : "JSON 模式是一种有限的、未加密的 MQTT 输出,用于与家庭助理进行本地集成" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "JSON 模式提供受限且未加密的 MQTT 輸出,適用於在本地端整合 Home Assistant。" + } } } }, @@ -16327,7 +16843,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "按鍵" + "value" : "金耀" } } } @@ -16355,6 +16871,12 @@ "state" : "translated", "value" : "Величина кључа" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "金鑰大小" + } } } }, @@ -16465,6 +16987,12 @@ "state" : "translated", "value" : "最后听到" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "最後通訊" + } } } }, @@ -16487,6 +17015,12 @@ "state" : "translated", "value" : "纬度" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "緯度" + } } } }, @@ -16563,6 +17097,12 @@ "state" : "translated", "value" : "持证操作员" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "持照操作員" + } } } }, @@ -16579,6 +17119,12 @@ "state" : "translated", "value" : "限制所有周期性广播间隔,尤其是遥测和位置。如果需要增加跳数,请在边缘节点而不是中间节点上进行。在占空比受限的情况下,不建议使用 MQTT,因为网关节点会承担所有工作。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "請限制所有定期廣播的間隔時間,特別是遙測(telemetry)和位置(position)指標。如果需要增加跳數(hops),應該在網路邊緣的節點上進行,而不是在中間的節點。當你受到頻率使用限制(duty cycle)時,不建議使用 MQTT,因為此時閘道節點(gateway)會承擔所有負載。" + } } } }, @@ -16609,7 +17155,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "正在加載紀錄⋯⋯" + "value" : "正在載入紀錄⋯⋯" } } } @@ -17195,7 +17741,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Long Name" + "value" : "完整名稱" } } } @@ -17223,7 +17769,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Long Name: %@" + "value" : "完整名稱:%@" } } } @@ -17338,6 +17884,12 @@ "state" : "translated", "value" : "经度" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "緯度" + } } } }, @@ -17580,7 +18132,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "無" + "value" : "未知" } } } @@ -17790,6 +18342,12 @@ "state" : "translated", "value" : "地图报告" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "地圖回報" + } } } }, @@ -20220,7 +20778,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到遠測模組設定: %@" + "value" : "收到遙測模組設定: %@" } } } @@ -20285,7 +20843,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到遠測資料: %@" + "value" : "收到遙測指標: %@" } } } @@ -20998,6 +21556,12 @@ "state" : "translated", "value" : "Опције статуса поруке" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "訊息狀態選項" + } } } }, @@ -21060,7 +21624,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "詳細訊息" + "value" : "詳細資訊" } } } @@ -21142,6 +21706,12 @@ "state" : "translated", "value" : "Поруке" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "訊息" + } } } }, @@ -21158,6 +21728,12 @@ "state" : "translated", "value" : "Поруке се раздвајају са |" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用「 | 」來隔開訊息" + } } } }, @@ -21168,6 +21744,12 @@ "state" : "translated", "value" : "Метрика" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "公制" + } } } }, @@ -21206,6 +21788,12 @@ "state" : "translated", "value" : "Минимални интервал" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "最短時間間隔" + } } } }, @@ -21306,6 +21894,12 @@ "state" : "translated", "value" : "模型" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "型號" + } } } }, @@ -21916,6 +22510,12 @@ "state" : "translated", "value" : "Пребаци се на чвор" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "導航至該節點" + } } } }, @@ -22102,6 +22702,12 @@ "state" : "translated", "value" : "Никада" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "永不" + } } } }, @@ -22113,6 +22719,12 @@ "state" : "translated", "value" : "Нови чвор" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "新節點" + } } } }, @@ -22124,6 +22736,12 @@ "state" : "translated", "value" : "Откривен је нови чвор" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已發現新節點" + } } } }, @@ -22256,6 +22874,12 @@ "state" : "translated", "value" : "Нема повезаног чвора" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "沒有已連接的節點" + } } } }, @@ -22266,6 +22890,12 @@ "state" : "translated", "value" : "Нема метрика уређаја." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "沒有裝置指標" + } } } }, @@ -22379,6 +23009,12 @@ "state" : "translated", "value" : "Нема метрике снаге" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "沒有電源指標" + } } } }, @@ -22530,6 +23166,12 @@ "state" : "translated", "value" : "Интервал емитовања информација о чвору" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "節點資訊廣播間隔" + } } } }, @@ -22546,6 +23188,12 @@ "state" : "translated", "value" : "Мапа чворова" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "節點地圖" + } } } }, @@ -22562,6 +23210,12 @@ "state" : "translated", "value" : "Број чвора" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "節點號碼" + } } } }, @@ -22894,6 +23548,12 @@ "state" : "translated", "value" : "Број записа" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "記錄數量" + } } } }, @@ -22910,6 +23570,12 @@ "state" : "translated", "value" : "Број сателита" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "衛星數量" + } } } }, @@ -23121,6 +23787,12 @@ "state" : "translated", "value" : "ОК" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } } } }, @@ -23159,6 +23831,12 @@ "state" : "translated", "value" : "OLED 类型" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "OLED 類型" + } } } }, @@ -23240,6 +23918,12 @@ "state" : "translated", "value" : "业余无线电使用需要固件 2.0.20 或更高版本。请务必参考当地法规,并联系当地业余频率协调人员咨询相关问题。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "持照操作員的需使用韌體版本 2.0.20 或以上。請務必參考當地法規,若有疑問,請聯繫當地的業餘無線電頻率協調單位。" + } } } }, @@ -23256,6 +23940,12 @@ "state" : "translated", "value" : "Један сат" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 小時" + } } } }, @@ -23272,6 +23962,12 @@ "state" : "translated", "value" : "Једна минута" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 分鐘" + } } } }, @@ -23339,6 +24035,12 @@ "state" : "translated", "value" : "Оптимизовано за двобојне дисплеје" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "為雙色螢幕最佳化" + } } } }, @@ -23355,6 +24057,12 @@ "state" : "translated", "value" : "包含的字段越多,信息就越大,导致通讯时间更长,丢包风险更高" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "組合位置訊息時可選擇加入的可選欄位。加入的欄位越多,訊息體積越大,將導致空中傳輸時間增加,並提高封包遺失的風險。" + } } } }, @@ -23471,7 +24179,14 @@ } }, "OTA Updates are not supported on this NRF Device." : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "此 NRF 裝置不支援 OTA(無線)更新。" + } + } + } }, "OTA Updates are not supported on your platform." : { "localizations" : { @@ -23486,6 +24201,12 @@ "state" : "translated", "value" : "OTA 更新不支持你的平台" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "您的平台不支援 OTA(無線)更新。" + } } } }, @@ -23496,6 +24217,12 @@ "state" : "translated", "value" : "Остали извори података" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "其他資料來源" + } } } }, @@ -23512,6 +24239,12 @@ "state" : "translated", "value" : "Излаз дебаговања уживо преко серијског интерфејса, прегледајте и извозите логове уређаја са редукованим позицијама преко блутута." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "透過序列埠輸出即時偵錯記錄,並可透過藍芽檢視與匯出經位置隱藏處理的裝置日誌。" + } } } }, @@ -23552,6 +24285,12 @@ "state" : "translated", "value" : "Премаши аутоматско откривање OLED екрана." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "覆寫自動偵測 OLED 螢幕。" + } } } }, @@ -23929,6 +24668,12 @@ "state" : "translated", "value" : "Изврши фабричко ресетовање чвора на који сте повезани" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "對目前連線的節點執行恢復原廠設定。" + } } } }, @@ -24224,6 +24969,12 @@ "state" : "translated", "value" : "Молимо изаберите регион" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "請設定地區" + } } } }, @@ -24334,6 +25085,12 @@ "state" : "translated", "value" : "Заставице позиције" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置標記" + } } } }, @@ -24344,6 +25101,12 @@ "state" : "translated", "value" : "Логови позиција" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置紀錄" + } } } }, @@ -24354,6 +25117,12 @@ "state" : "translated", "value" : "Дневник позиција %lld тачака" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置紀錄 %lld 個紀錄" + } } } }, @@ -24364,6 +25133,12 @@ "state" : "translated", "value" : "Пакети позиција" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置封包" + } } } }, @@ -24495,6 +25270,12 @@ "state" : "translated", "value" : "启用定位" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用位置" + } } } }, @@ -24772,6 +25553,12 @@ "state" : "translated", "value" : "预设" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "預設組態" + } } } }, @@ -24786,7 +25573,14 @@ } }, "Pressure" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "氣壓" + } + } + } }, "Primary" : { "localizations" : { @@ -24795,6 +25589,12 @@ "state" : "translated", "value" : "Основни" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "主要" + } } } }, @@ -24817,6 +25617,12 @@ "state" : "translated", "value" : "一级管理员密钥" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "主要管理公鑰" + } } } }, @@ -24827,6 +25633,12 @@ "state" : "translated", "value" : "Основни GPIO" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "主要 GPIO" + } } } }, @@ -24849,6 +25661,12 @@ "state" : "translated", "value" : "私钥" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "私鑰" + } } } }, @@ -24893,6 +25711,12 @@ "state" : "translated", "value" : "公钥" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "公鑰" + } } } }, @@ -24909,6 +25733,12 @@ "state" : "translated", "value" : "公钥加密" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "公鑰加密" + } } } }, @@ -24925,6 +25755,12 @@ "state" : "translated", "value" : "公钥不匹配" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "公鑰與已知不符" + } } } }, @@ -24935,6 +25771,12 @@ "state" : "translated", "value" : "PWD" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電源" + } } } }, @@ -25431,6 +26273,12 @@ "state" : "translated", "value" : "转播模式" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "中繼轉發模式" + } } } }, @@ -25503,7 +26351,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到確認" + "value" : "已接收確認" } } } @@ -25652,6 +26500,12 @@ "state" : "translated", "value" : "Пре подне" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "上午" + } } } }, @@ -25681,6 +26535,12 @@ "state" : "translated", "value" : "Вече" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "下午" + } } } }, @@ -25710,6 +26570,12 @@ "state" : "translated", "value" : "Подне" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "中午" + } } } }, @@ -25739,6 +26605,12 @@ "state" : "translated", "value" : "Јутро" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "早晨" + } } } }, @@ -25768,6 +26640,12 @@ "state" : "translated", "value" : "Ноћ" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "夜晚" + } } } }, @@ -25846,6 +26724,12 @@ "state" : "translated", "value" : "Уклони из омиљених" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "從最愛中移除" + } } } }, @@ -25878,6 +26762,12 @@ "state" : "translated", "value" : "Замени канале" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "更換頻道" + } } } }, @@ -25940,7 +26830,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "回復" + "value" : "回覆" } } } @@ -25972,6 +26862,12 @@ "state" : "translated", "value" : "Захтева да уређај има акцелерометар." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "需要您的裝置內建加速度感測器。" + } } } }, @@ -26016,6 +26912,12 @@ "state" : "translated", "value" : "Ресетовање базе чворова (NodeDB)" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "重置 NodeDB" + } } } }, @@ -26032,6 +26934,12 @@ "state" : "translated", "value" : "Поновно покретање" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "重啟" + } } } }, @@ -26922,7 +27830,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "確認" + "value" : "已確認" } } } @@ -27117,7 +28025,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到否認" + "value" : "收到 NACK(否定確認)" } } } @@ -27532,6 +28440,12 @@ "state" : "translated", "value" : "Шифровано слање није успело" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "加密傳送失敗" + } } } }, @@ -27561,6 +28475,12 @@ "state" : "translated", "value" : "未知的公钥" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "未知公鑰" + } } } }, @@ -27754,6 +28674,12 @@ "state" : "translated", "value" : "Појачање пријемника" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "接收增益強化(RX Boosted Gain)" + } } } }, @@ -27900,6 +28826,12 @@ "state" : "translated", "value" : "Сателита" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "衛星" + } } } }, @@ -27916,6 +28848,12 @@ "state" : "translated", "value" : "Процена броја сателита %lld" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "衛星估計數:%lld 顆" + } } } }, @@ -27932,6 +28870,12 @@ "state" : "translated", "value" : "Сателити на видику: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "目前可見衛星:%@ 顆" + } } } }, @@ -28012,6 +28956,12 @@ "state" : "translated", "value" : "Сачувај" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "儲存" + } } } }, @@ -28022,6 +28972,12 @@ "state" : "translated", "value" : "Сачувај подешавања канала" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "儲存頻道設定" + } } } }, @@ -28157,6 +29113,12 @@ "state" : "translated", "value" : "Претражи" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "搜尋" + } } } }, @@ -28167,6 +29129,12 @@ "state" : "translated", "value" : "Други" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "秒" + } } } }, @@ -28177,6 +29145,12 @@ "state" : "translated", "value" : "Секундарни" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "次要" + } } } }, @@ -28199,6 +29173,12 @@ "state" : "translated", "value" : "二级管理员密钥" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "次要管理公鑰" + } } } }, @@ -28221,6 +29201,12 @@ "state" : "translated", "value" : "安全" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "安全性" + } } } }, @@ -28243,6 +29229,12 @@ "state" : "translated", "value" : "安全配置" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "安全性設定" + } } } }, @@ -28265,6 +29257,12 @@ "state" : "translated", "value" : "安全配置需要固件版本 2.5+" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "安全性設定需要韌體版本 2.5 以上" + } } } }, @@ -28281,6 +29279,12 @@ "state" : "translated", "value" : "Одабери канал" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "選擇一個頻道" + } } } }, @@ -28291,6 +29295,12 @@ "state" : "translated", "value" : "Изабери разговор" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "選擇一個對話" + } } } }, @@ -28311,6 +29321,12 @@ "state" : "translated", "value" : "Изабери пут праћења кроз мрежу" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "選擇一個追蹤路由(Trace Route)紀錄" + } } } }, @@ -28321,6 +29337,12 @@ "state" : "translated", "value" : "Одабери канал" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "選擇頻道" + } } } }, @@ -28466,6 +29488,12 @@ "state" : "translated", "value" : "Пошаљи" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "發送" + } } } }, @@ -28502,6 +29530,12 @@ "state" : "translated", "value" : "Пошаљи директну поруку" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "發送私訊" + } } } }, @@ -28518,6 +29552,12 @@ "state" : "translated", "value" : "Пошаљи групну поруку" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "發送群組訊息" + } } } }, @@ -28633,6 +29673,12 @@ "state" : "translated", "value" : "发送铃声" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "傳送鈴鐺圖示" + } } } }, @@ -28687,6 +29733,12 @@ "state" : "translated", "value" : "传感器指标" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "傳感器數據" + } } } }, @@ -28735,6 +29787,12 @@ "state" : "translated", "value" : "Послато другим чворовима на меш мрежи како би им омогућило да израчунају заједнички тајни кључ." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "傳送到網路上的其他節點,以便共同計算一組共享私鑰。" + } } } }, @@ -28751,6 +29809,12 @@ "state" : "translated", "value" : "Број секвенце" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "序列編號" + } } } }, @@ -28767,6 +29831,12 @@ "state" : "translated", "value" : "Секвенца: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "序列: %@" + } } } }, @@ -28869,6 +29939,12 @@ "state" : "translated", "value" : "Серијска конзола преко Stream API-ја." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "透過串流 API 的序列主控台。" + } } } }, @@ -29266,6 +30342,12 @@ "state" : "translated", "value" : "Сервер" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "伺服器" + } } } }, @@ -29282,11 +30364,24 @@ "state" : "translated", "value" : "Адреса сервера" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "伺服器地址" + } } } }, "Server Option" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "伺服器選項" + } + } + } }, "Set" : { "localizations" : { @@ -29468,6 +30563,12 @@ "state" : "translated", "value" : "Дели QR код и линк" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "分享 QR Code 及連結" + } } } }, @@ -29613,6 +30714,12 @@ "state" : "translated", "value" : "Дељени кључ" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "共用金鑰" + } } } }, @@ -29808,6 +30915,12 @@ "state" : "translated", "value" : "Прикажи на екрану уређаја" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "在裝置螢幕上顯示" + } } } }, @@ -29850,7 +30963,14 @@ } }, "Shows information for the Lora radio connected via bluetooth. You can swipe left to disconnect the radio and long press start the live activity." : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "顯示透過藍牙連接的 LoRa 裝置資訊。您可以向左滑動來斷開裝置,長按則可啟動即時活動。" + } + } + } }, "Shut Down" : { "localizations" : { @@ -29907,6 +31027,12 @@ "state" : "translated", "value" : "Сигнал %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "訊號%@" + } } } }, @@ -29940,6 +31066,12 @@ "state" : "translated", "value" : "Паметно позиционирање" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "智慧位置" + } } } }, @@ -29951,7 +31083,8 @@ "value" : "SNR" } } - } + }, + "shouldTranslate" : false }, "SNR %@ dB" : { "localizations" : { @@ -29961,7 +31094,8 @@ "value" : "SNR %@ dB" } } - } + }, + "shouldTranslate" : false }, "SNR %@dB" : { "localizations" : { @@ -29971,13 +31105,28 @@ "value" : "SNR %@dB" } } - } + }, + "shouldTranslate" : false }, "Soil Moisture" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "土壤溼度" + } + } + } }, "Soil Temp" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "土壤溫度" + } + } + } }, "Specifies how long the monitored GPIO should output." : { "localizations" : { @@ -30002,6 +31151,12 @@ "state" : "translated", "value" : "Брзина" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "速度" + } } } }, @@ -30018,6 +31173,12 @@ "state" : "translated", "value" : "Брзина %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "速度 %@" + } } } }, @@ -30034,6 +31195,12 @@ "state" : "translated", "value" : "Брзина: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "速度:%@" + } } } }, @@ -30427,6 +31594,12 @@ "state" : "translated", "value" : "Претплаћен" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已建立連線" + } } } }, @@ -30508,6 +31681,12 @@ "state" : "translated", "value" : "Узима URL канала Meshtastic и чува подешавања канала." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "輸入一個 Meshtastic 頻道網址,並儲存該頻道的設定。" + } } } }, @@ -31344,6 +32523,12 @@ "state" : "translated", "value" : "Темп." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "溫度" + } } } }, @@ -31360,6 +32545,12 @@ "state" : "translated", "value" : "Температура" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "溫度" + } } } }, @@ -31376,6 +32567,12 @@ "state" : "translated", "value" : "Десет пинута" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "10 分鐘" + } } } }, @@ -31398,6 +32595,12 @@ "state" : "translated", "value" : "三级管理员密钥" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "第三組管理公鑰" + } } } }, @@ -31415,6 +32618,12 @@ "state" : "translated", "value" : "TFT екрани у пуној боји" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "TFT全彩螢幕" + } } } }, @@ -31448,6 +32657,12 @@ "state" : "translated", "value" : "Време чекања пре него што сматрамо да је ваш пакет завршен." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "在將您的封包視為已完成之前需等待的時間長度。" + } } } }, @@ -31496,6 +32711,12 @@ "state" : "translated", "value" : "Најбржа брзина којом ће се ажурирати позиција уколико је задовољен минимални услов за растојање." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "當達到最短距離變化時,位置更新傳送的最短間隔時間" + } } } }, @@ -31512,6 +32733,12 @@ "state" : "translated", "value" : "用于在设备屏幕上显示 GPS 坐标的格式。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "用於在裝置螢幕上顯示 GPS 座標的格式。" + } } } }, @@ -31544,6 +32771,12 @@ "state" : "translated", "value" : "Максимални интервал који може протећи без да чвор емитује позицију." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "節點在未廣播位置資訊時允許的最長間隔時間" + } } } }, @@ -31576,6 +32809,12 @@ "state" : "translated", "value" : "智能位置广播考虑的最小距离变化(以米为单位)。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "觸發智慧位置廣播時需達到的最小距離變化(以公尺為單位)" + } } } }, @@ -31592,6 +32831,12 @@ "state" : "translated", "value" : "该节点的最新公钥与之前记录的公钥不匹配。您可以删除该节点,让它重新交换公钥,但这也可能表明存在更严重的安全问题。通过其他可信渠道联系用户,以确定公钥更改是否是由于出厂重置或其他故意行为造成的。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "此節點最新的公開金鑰與先前記錄的不符。您可以刪除此節點並讓它重新交換金鑰,但這也可能代表出現了更嚴重的安全問題。請透過其他可信的聯絡方式與該使用者確認金鑰變更是否因為恢復原廠設定或其他有意的操作所導致。" + } } } }, @@ -31614,6 +32859,12 @@ "state" : "translated", "value" : "授权向该节点发送管理信息的一级管理员公钥。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "被授權向此節點發送管理訊息的主要公鑰。" + } } } }, @@ -31630,6 +32881,12 @@ "state" : "translated", "value" : "公钥与记录的公钥不匹配。您可以删除节点,让它重新交换公钥,但这可能表明存在更严重的安全问题。通过其他可信渠道联系用户,以确定公钥更改是否是由于出厂重置或其他故意行为造成的。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "公開金鑰與原先記錄的不符。您可以刪除此節點並讓它重新交換金鑰,但這可能表示存在更嚴重的安全問題。請透過其他可信的聯絡方式與該使用者確認,此次金鑰變更是否因為恢復原廠設定或其他有意的操作所造成。" + } } } }, @@ -31646,6 +32903,12 @@ "state" : "translated", "value" : "使用电台的地区。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "您將使用無線電的地區。" + } } } }, @@ -31694,6 +32957,12 @@ "state" : "translated", "value" : "授权向该节点发送管理信息的二级管理员公钥。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "被授權向此節點發送管理訊息的次要公鑰。" + } } } }, @@ -31743,6 +33012,12 @@ "state" : "translated", "value" : "授权向该节点发送管理信息的三级管理员公钥。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "被授權向此節點發送管理訊息的第三公鑰。" + } } } }, @@ -31773,6 +33048,12 @@ "state" : "translated", "value" : "Ова подешавања ће %@ канале. Тренутна LoRA конфигурација ће бити замењена. Ако дође до значајних промена у LoRA конфигурацији, уређај ће се поново покренути." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "這些設定將會 %@ 頻道。當前的 LoRa 設定將被取代,若 LoRa 設定有重大變更,裝置將會重新啟動。" + } } } }, @@ -31789,6 +33070,12 @@ "state" : "translated", "value" : "Тридесет минута" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 分鐘" + } } } }, @@ -31799,6 +33086,12 @@ "state" : "translated", "value" : "Овај разговор ће бити обрисан." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "此對話紀錄將會被刪除。" + } } } }, @@ -31809,6 +33102,12 @@ "state" : "translated", "value" : "Ово може потрајати. Одговор ће се појавити у евиденцији трасе праћења за чвор којем је послат." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "這可能需要一段時間,回應將會顯示在被發送節點的路由追蹤紀錄中。" + } } } }, @@ -31819,6 +33118,12 @@ "state" : "translated", "value" : "Ово може потрајати. Одговор ће се појавити у евиденцији трасе праћења за чвор којем је послат." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "這可能需要一段時間。回應將會顯示在被發送節點的路由追蹤紀錄中。" + } } } }, @@ -31902,6 +33207,12 @@ "state" : "translated", "value" : "Време" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "時間" + } } } }, @@ -31918,6 +33229,12 @@ "state" : "translated", "value" : "Временски жиг" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "時間戳記" + } } } }, @@ -31934,6 +33251,12 @@ "state" : "translated", "value" : "Временска зона" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "時區" + } } } }, @@ -31950,6 +33273,12 @@ "state" : "translated", "value" : "Временска зона за датуме на екрану уређаја и у евиденцији." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "用於裝置螢幕顯示與日誌記錄日期的時區設定" + } } } }, @@ -32012,7 +33341,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "超時" + "value" : "逾時長度" } } } @@ -32024,6 +33353,12 @@ "state" : "translated", "value" : "временска ознака" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "時間戳記" + } } } }, @@ -32098,6 +33433,12 @@ "state" : "translated", "value" : "Време и формат" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "時序與格式" + } } } }, @@ -32626,6 +33967,12 @@ "state" : "translated", "value" : "启用 TLS" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用 TLS" + } } } }, @@ -32667,7 +34014,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Trace Route" + "value" : "追蹤路由(Trace Route)" } } } @@ -32683,7 +34030,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Trace Route 紀錄" + "value" : "追蹤路由(Trace Route)紀錄" } } } @@ -32699,7 +34046,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Trace Route 已送出" + "value" : "追蹤路由(Trace Route)已送出" } } } @@ -32715,7 +34062,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Trace Route 已送給 %@" + "value" : "追蹤路由(Trace Route)已送給 %@" } } } @@ -32731,7 +34078,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "給 %@ 的 Trace Route 未送出。" + "value" : "給 %@ 的追蹤路由(Trace Route)未送出。" } } } @@ -32743,6 +34090,12 @@ "state" : "translated", "value" : "Праћење руте комуникације је било ограничено по брзини. Можете послати захтев за праћење руте комуникације највише једном у сваких тридесет секунди." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "路由追蹤(Trace Route)已被限速。你每 30 秒最多只能發送一次路由追蹤請求。" + } } } }, @@ -32924,6 +34277,12 @@ "state" : "translated", "value" : "Два сата" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "2 小時" + } } } }, @@ -32983,6 +34342,12 @@ "state" : "translated", "value" : "Уклони са фаворита" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "移除最愛" + } } } }, @@ -33026,6 +34391,12 @@ "state" : "translated", "value" : "непознато" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "未知" + } } } }, @@ -33260,6 +34631,12 @@ "state" : "translated", "value" : "Интервал ажурирања" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "更新間隔" + } } } }, @@ -33430,6 +34807,12 @@ "state" : "translated", "value" : "启用上传" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用上行(Uplink)" + } } } }, @@ -33464,6 +34847,12 @@ "state" : "translated", "value" : "Време рада" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已開機時間" + } } } }, @@ -33474,6 +34863,12 @@ "state" : "translated", "value" : "Време рада" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已開機時間" + } } } }, @@ -33516,6 +34911,12 @@ "state" : "translated", "value" : "使用预设" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用預設組態" + } } } }, @@ -33542,6 +34943,12 @@ "state" : "translated", "value" : "Користи се за креирање заједничког кључа са удаљеним уређајем." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "用於與遠端裝置建立共用金鑰。" + } } } }, @@ -33780,6 +35187,12 @@ "state" : "translated", "value" : "利用手机上的网络连接到 MQTT。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "透過手機的網路連線來連接至 MQTT 伺服器。" + } } } }, @@ -33796,6 +35209,12 @@ "state" : "translated", "value" : "Правац возила" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "載具朝向" + } } } }, @@ -33812,6 +35231,12 @@ "state" : "translated", "value" : "Брзина возила" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "載具速度" + } } } }, @@ -34036,7 +35461,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "%@ 伏特" + "value" : "%@ V" } } } @@ -34112,6 +35537,12 @@ "state" : "translated", "value" : "Чека се на потврду пријема..." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "等待確認中⋯⋯" + } } } }, @@ -34122,6 +35553,12 @@ "state" : "translated", "value" : "Пробуди екран додиром или покретом" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "輕觸或移動時喚醒螢幕" + } } } }, @@ -34209,7 +35646,14 @@ } }, "Weight" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "重量" + } + } + } }, "What does the lock mean?" : { "localizations" : { @@ -34230,6 +35674,12 @@ "state" : "translated", "value" : "锁意味着什么?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "鎖頭圖示代表什麼意思?" + } } } }, @@ -34274,6 +35724,12 @@ "state" : "translated", "value" : "业余无线电模式的作用:\n* 将节点名称设置为您的呼号 \n* 每 10 分钟广播一次节点信息 \n* 覆盖频率、占空比和发射功率 \n* 禁用加密" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "持照操作員模式的功能如下:\n* 將節點名稱自動設定為你的業餘無線電呼號\n* 每 10 分鐘定期廣播節點資訊(如位置、狀態等)\n* 自動覆蓋頻率、頻率使用時間限制及發射功率設定,符合當地業餘無線電規範\n* 關閉通訊加密功能,以符合透明通訊的法規要求" + } } } }, @@ -34326,7 +35782,14 @@ } }, "Wind" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "風" + } + } + } }, "Wind Direction" : { "localizations" : { @@ -34341,6 +35804,12 @@ "state" : "translated", "value" : "Правац ветра" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "風向" + } } } }, @@ -34357,6 +35826,12 @@ "state" : "translated", "value" : "Брзина ветра" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "風速" + } } } }, @@ -34391,7 +35866,8 @@ "value" : "X: %1$@, Y: %2$d" } } - } + }, + "shouldTranslate" : false }, "X: %@, Y: %f" : { "localizations" : { @@ -34413,7 +35889,8 @@ "value" : "X: %1$@, Y: %2$f" } } - } + }, + "shouldTranslate" : false }, "X: %@, Y: %lld" : { "localizations" : { @@ -34435,7 +35912,8 @@ "value" : "X: %1$@, Y: %2$lld" } } - } + }, + "shouldTranslate" : false }, "y" : { "localizations" : { @@ -34489,6 +35967,12 @@ "state" : "translated", "value" : "您还可以使用 Nordic DFU 应用程序通过蓝牙更新 Meshtastic 设备。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "您亦可透過藍牙,使用 Nordic DFU 應用程式來更新您的 Meshtastic 裝置。" + } } } }, @@ -34505,6 +35989,12 @@ "state" : "translated", "value" : "您当前的位置将被设置为固定位置,并以定位间隔向 Mesh 网络广播。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "您的目前位置將被設定為固定位置,並按照位置廣播間隔在Mesh網路中定期發送。" + } } } }, @@ -34543,6 +36033,12 @@ "state" : "translated", "value" : "Ваш MQTT сервер мора подржавати TLS." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "您所使用的 MQTT 伺服器需支援 TLS 加密傳輸。" + } } } }, @@ -34553,6 +36049,12 @@ "state" : "translated", "value" : "Оперативна фреквенција вашег нода се израчунава на основу региона, модемског пресета и овог поља. Када је 0, слот се аутоматски израчунава на основу назива примарног канала." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "您的節點運作頻率是根據地區、數據機預設值,以及此欄位共同計算得出。當此欄位設為 0 時,系統會根據主要頻道名稱自動計算頻率槽位。" + } } } }, @@ -34569,6 +36071,12 @@ "state" : "translated", "value" : "您的位置已发送,并请求对方回复其位置。位置返回后,您将收到通知。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "您的位置已發送並附帶回傳位置的請求。當對方回傳其位置時,系統將通知您。" + } } } }, @@ -34585,6 +36093,12 @@ "state" : "translated", "value" : "您所在地区的占空比为 %lld%%。在占空比受限的情况下,不建议使用 MQTT,因为额外的流量会很快压垮您的 LoRa 网格。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "您所在地區的占空比限制為 %lld%%。在占空比受限的情況下,不建議啟用 MQTT,因為額外的通訊流量可能迅速造成您的 LoRa 網狀網路過載。" + } } } }, @@ -34595,6 +36109,12 @@ "state" : "translated", "value" : "Ваш регион има %lld%% радни циклус по сату, ваш радио ће престати да шаље пакете када достигне ограничење по сату." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "你的地區每小時的頻率使用限制為 %lld%%,當無線電達到該上限時,將會停止傳送封包。" + } } } }, @@ -34605,6 +36125,12 @@ "state" : "translated", "value" : "Ваша датотека руте мора имати колоне и заглавља и ширину и дужину." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "您的路線檔案必須包含緯度(Latitude)與經度(Longitude)欄位及其標題。" + } } } } From 2e04321d5b7ce8244b06a653b43e69e5e5babc11 Mon Sep 17 00:00:00 2001 From: unojazz Date: Sat, 26 Apr 2025 15:35:26 -0400 Subject: [PATCH 31/93] fixed file type This reverts commit 29f8aa06e636ba805a3d56ec2062d2ae5a70399b. --- Localizable.xcstrings | 145 ++++++++++++++---------------------------- 1 file changed, 49 insertions(+), 96 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 237efc86..2a734d14 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -2,7 +2,7 @@ "sourceLanguage" : "en", "strings" : { "" : { - "shouldTranslate" : false + }, "\t%@" : { "localizations" : { @@ -18,8 +18,7 @@ "value" : "\t%@" } } - }, - "shouldTranslate" : false + } }, " %@" : { "localizations" : { @@ -35,11 +34,10 @@ "value" : " %@" } } - }, - "shouldTranslate" : false + } }, " %@%%" : { - "shouldTranslate" : false + }, ": %@" : { "localizations" : { @@ -55,8 +53,7 @@ "value" : ": %@" } } - }, - "shouldTranslate" : false + } }, ": %d" : { "localizations" : { @@ -72,8 +69,7 @@ "value" : ": %d" } } - }, - "shouldTranslate" : false + } }, "(Re)define PIN_GPS_EN for your board." : { "localizations" : { @@ -111,8 +107,7 @@ "value" : "%@" } } - }, - "shouldTranslate" : false + } }, "%@ - %@" : { "localizations" : { @@ -134,8 +129,7 @@ "value" : "%1$@ - %2$@" } } - }, - "shouldTranslate" : false + } }, "%@ - %@ - %@" : { "localizations" : { @@ -157,8 +151,7 @@ "value" : "%1$@ - %2$@ - %3$@" } } - }, - "shouldTranslate" : false + } }, "%@ - %@ Towards %@ Back" : { "localizations" : { @@ -264,8 +257,7 @@ "value" : "%1$@ (%2$@)" } } - }, - "shouldTranslate" : false + } }, "%@ %@" : { "localizations" : { @@ -287,8 +279,7 @@ "value" : "%1$@ %2$@" } } - }, - "shouldTranslate" : false + } }, "%@ %lld" : { "localizations" : { @@ -310,8 +301,7 @@ "value" : "%1$@ %2$lld" } } - }, - "shouldTranslate" : false + } }, "%@ away" : { "localizations" : { @@ -421,8 +411,7 @@ "value" : "%@ dB" } } - }, - "shouldTranslate" : false + } }, "%@ Please try connecting again and check the PIN carefully." : { "extractionState" : "migrated", @@ -621,8 +610,7 @@ "value" : "%1$@, %2$@" } } - }, - "shouldTranslate" : false + } }, "%@: %lld / %lld" : { "localizations" : { @@ -644,8 +632,7 @@ "value" : "%1$@: %2$lld / %3$lld" } } - }, - "shouldTranslate" : false + } }, "%@%%" : { "localizations" : { @@ -661,8 +648,7 @@ "value" : "%@%%" } } - }, - "shouldTranslate" : false + } }, "%@°F" : { "localizations" : { @@ -678,8 +664,7 @@ "value" : "%@°F" } } - }, - "shouldTranslate" : false + } }, "%@mA" : { "localizations" : { @@ -689,8 +674,7 @@ "value" : "%@mA" } } - }, - "shouldTranslate" : false + } }, "%@V" : { "localizations" : { @@ -700,8 +684,7 @@ "value" : "%@V" } } - }, - "shouldTranslate" : false + } }, "%d" : { "localizations" : { @@ -717,8 +700,7 @@ "value" : "%d" } } - }, - "shouldTranslate" : false + } }, "%d Hops" : { "localizations" : { @@ -828,8 +810,7 @@ "value" : "%d%%" } } - }, - "shouldTranslate" : false + } }, "%lf" : { "localizations" : { @@ -845,8 +826,7 @@ "value" : "%lf" } } - }, - "shouldTranslate" : false + } }, "%lld" : { "localizations" : { @@ -862,8 +842,7 @@ "value" : "%lld" } } - }, - "shouldTranslate" : false + } }, "%lld or less hops away" : { "localizations" : { @@ -933,8 +912,7 @@ "value" : "%lld%%" } } - }, - "shouldTranslate" : false + } }, "%llddb Transmit Power" : { "localizations" : { @@ -1000,8 +978,7 @@ "value" : "< 1%" } } - }, - "shouldTranslate" : false + } }, "🦕 End of life Version 🦖 ☄️" : { "localizations" : { @@ -1033,8 +1010,7 @@ "value" : "1 byte" } } - }, - "shouldTranslate" : false + } }, "1 hop away" : { "localizations" : { @@ -1067,8 +1043,7 @@ "value" : "2.4 GHz" } } - }, - "shouldTranslate" : false + } }, "7" : { "localizations" : { @@ -1084,8 +1059,7 @@ "value" : "7" } } - }, - "shouldTranslate" : false + } }, "8" : { "localizations" : { @@ -1101,8 +1075,7 @@ "value" : "8" } } - }, - "shouldTranslate" : false + } }, "25" : { "localizations" : { @@ -1118,8 +1091,7 @@ "value" : "25" } } - }, - "shouldTranslate" : false + } }, "50" : { "localizations" : { @@ -1135,8 +1107,7 @@ "value" : "50" } } - }, - "shouldTranslate" : false + } }, "75" : { "localizations" : { @@ -1152,8 +1123,7 @@ "value" : "75" } } - }, - "shouldTranslate" : false + } }, "100" : { "localizations" : { @@ -1169,8 +1139,7 @@ "value" : "100" } } - }, - "shouldTranslate" : false + } }, "128 bit" : { "localizations" : { @@ -1186,8 +1155,7 @@ "value" : "128 bit" } } - }, - "shouldTranslate" : false + } }, "256 bit" : { "localizations" : { @@ -1203,8 +1171,7 @@ "value" : "256 bit" } } - }, - "shouldTranslate" : false + } }, "A Trace Route was sent, no response has been received." : { "localizations" : { @@ -1284,8 +1251,7 @@ "value" : "Ack SNR: %@ dB" } } - }, - "shouldTranslate" : false + } }, "Ack Time: %@" : { "localizations" : { @@ -2334,8 +2300,7 @@ "value" : "Apple Apps" } } - }, - "shouldTranslate" : false + } }, "Approximate Location" : { "localizations" : { @@ -12431,8 +12396,7 @@ "value" : "GPS EN GPIO" } } - }, - "shouldTranslate" : false + } }, "GPS Format" : { "localizations" : { @@ -13879,8 +13843,7 @@ "value" : "IAQ %lld" } } - }, - "shouldTranslate" : false + } }, "Icon" : { "localizations" : { @@ -24652,8 +24615,7 @@ "value" : "ВајФај" } } - }, - "shouldTranslate" : false + } }, "Perform a factory reset on the node you are connected to" : { "localizations" : { @@ -31083,8 +31045,7 @@ "value" : "SNR" } } - }, - "shouldTranslate" : false + } }, "SNR %@ dB" : { "localizations" : { @@ -31094,8 +31055,7 @@ "value" : "SNR %@ dB" } } - }, - "shouldTranslate" : false + } }, "SNR %@dB" : { "localizations" : { @@ -31105,8 +31065,7 @@ "value" : "SNR %@dB" } } - }, - "shouldTranslate" : false + } }, "Soil Moisture" : { "localizations" : { @@ -35620,8 +35579,7 @@ "value" : "Веб флашер" } } - }, - "shouldTranslate" : false + } }, "Website" : { "localizations" : { @@ -35843,8 +35801,7 @@ "value" : "x" } } - }, - "shouldTranslate" : false + } }, "X: %@, Y: %d" : { "localizations" : { @@ -35866,8 +35823,7 @@ "value" : "X: %1$@, Y: %2$d" } } - }, - "shouldTranslate" : false + } }, "X: %@, Y: %f" : { "localizations" : { @@ -35889,8 +35845,7 @@ "value" : "X: %1$@, Y: %2$f" } } - }, - "shouldTranslate" : false + } }, "X: %@, Y: %lld" : { "localizations" : { @@ -35912,8 +35867,7 @@ "value" : "X: %1$@, Y: %2$lld" } } - }, - "shouldTranslate" : false + } }, "y" : { "localizations" : { @@ -35929,8 +35883,7 @@ "value" : "y" } } - }, - "shouldTranslate" : false + } }, "Yesterday" : { "localizations" : { From ec9a7ff764015931403ce262dc41b37db41f3ba5 Mon Sep 17 00:00:00 2001 From: unojazz Date: Sat, 26 Apr 2025 15:57:44 -0400 Subject: [PATCH 32/93] some translations --- Localizable.xcstrings | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 2a734d14..f2feaf1c 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -13842,6 +13842,12 @@ "state" : "translated", "value" : "IAQ %lld" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "IAQ %lld" + } } } }, @@ -16806,7 +16812,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "金耀" + "value" : "金鑰" } } } From 285dc8ea160394dcef6fe5b07e43e36379054ae3 Mon Sep 17 00:00:00 2001 From: unojazz Date: Sat, 26 Apr 2025 16:19:38 -0400 Subject: [PATCH 33/93] some translation --- Localizable.xcstrings | 74 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index f2feaf1c..538ab8c1 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -12257,6 +12257,12 @@ "state" : "translated", "value" : "从 App Store 获取 NRF DFU" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "從 App Store 下載 NRF DFU" + } } } }, @@ -19014,6 +19020,12 @@ "state" : "translated", "value" : "Ambient Lighting module config received: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ambient Lighting module config received: %@" + } } } }, @@ -19073,6 +19085,12 @@ "state" : "translated", "value" : "Bluetooth config received: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth config received: %@" + } } } }, @@ -19126,6 +19144,12 @@ "state" : "translated", "value" : "Canned Message module config received: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canned Message module config received: %@" + } } } }, @@ -19179,6 +19203,12 @@ "state" : "translated", "value" : "Requested Canned Messages Module Messages for node: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Requested Canned Messages Module Messages for node: %@" + } } } }, @@ -19232,6 +19262,12 @@ "state" : "translated", "value" : "Canned Messages Messages Received For: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canned Messages Messages Received For: %@" + } } } }, @@ -19285,6 +19321,12 @@ "state" : "translated", "value" : "Sent a Channel for: %@ Channel Index %d" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sent a Channel for: %@ Channel Index %d" + } } } }, @@ -20051,7 +20093,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到節點訊息: %@" + "value" : "收到節點資訊: %@" } } } @@ -20141,6 +20183,12 @@ "state" : "translated", "value" : "Конфигурација PAX бројача примљена: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX Counter config received: %@" + } } } }, @@ -20300,6 +20348,12 @@ "state" : "translated", "value" : "Конфигурација напајања примљена: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Power config received: %@" + } } } }, @@ -21409,6 +21463,12 @@ "state" : "translated", "value" : "Meshtastic чвор %@ је поделио канале са вама." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meshtastic 節點 %@ 向您分享頻道資訊" + } } } }, @@ -25418,6 +25478,12 @@ "state" : "translated", "value" : "Напајано" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用電源" + } } } }, @@ -29279,6 +29345,12 @@ "state" : "translated", "value" : "Изабери тип разговора" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "選擇對話類型" + } } } }, From 7ed1a97dd61829bec5a416ebfb7749828649150c Mon Sep 17 00:00:00 2001 From: unojazz Date: Sat, 26 Apr 2025 16:29:38 -0400 Subject: [PATCH 34/93] some translation --- Localizable.xcstrings | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 538ab8c1..63dd9685 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -326,7 +326,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "%@ 遠" + "value" : "距離%@" } } } @@ -861,7 +861,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "%lld 個挑數以內" + "value" : "%lld 個跳數以內" } } } @@ -1029,7 +1029,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "一個跳數遠" + "value" : "距離一個跳數" } } } @@ -2369,7 +2369,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "你確定要將此節點恢復原廠設定嗎?" + "value" : "您確定要將此節點恢復原廠設定嗎?" } } } @@ -2427,7 +2427,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "是否確定?" + "value" : "您確定嗎?" } } } @@ -2482,7 +2482,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "可用的數據機預設值,預設為 Long Fast" + "value" : "可用的數據機預設組態,預設為 Long Fast" } } } @@ -10154,7 +10154,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "拖放(Drag & Drop)是更新 NRF 裝置韌體的建議方式。如果你的 iPhone 或 iPad 是 USB-C 版本,可以直接使用一般的 USB-C 充電線。若是 Lightning 裝置,則需要使用 Apple 的 Lightning 對 USB 相機轉接器。" + "value" : "拖放(Drag & Drop)是更新 NRF 裝置韌體的建議方式。如果您的 iPhone 或 iPad 是 USB-C 版本,可以直接使用一般的 USB-C 充電線。若是 Lightning 裝置,則需要使用 Apple 的 Lightning 對 USB 相機轉接器。" } } } @@ -11248,7 +11248,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "要將你的裝置與應用程式恢復原廠設定嗎?" + "value" : "要將您的裝置與應用程式恢復原廠設定嗎?" } } } @@ -16850,7 +16850,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "金鑰大小" + "value" : "金鑰長度" } } } @@ -17098,7 +17098,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "請限制所有定期廣播的間隔時間,特別是遙測(telemetry)和位置(position)指標。如果需要增加跳數(hops),應該在網路邊緣的節點上進行,而不是在中間的節點。當你受到頻率使用限制(duty cycle)時,不建議使用 MQTT,因為此時閘道節點(gateway)會承擔所有負載。" + "value" : "請限制所有定期廣播的間隔時間,特別是遙測(telemetry)和位置(position)指標。如果需要增加跳數(hops),應該在網路邊緣的節點上進行,而不是在中間的節點。當您受到頻率使用限制(duty cycle)時,不建議使用 MQTT,因為此時閘道節點(gateway)會承擔所有負載。" } } } @@ -25302,7 +25302,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "啟用位置" + "value" : "發送位置" } } } @@ -28712,7 +28712,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "接收增益強化(RX Boosted Gain)" + "value" : "訊號接收增益(RX Boosted Gain)" } } } @@ -29637,6 +29637,12 @@ "state" : "translated", "value" : "当用户按钮被点击三次时,在主通道上发送定位。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "當使用者按鈕被連續按下三次時,透過主要頻道傳送位置資料。" + } } } }, @@ -34131,7 +34137,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "路由追蹤(Trace Route)已被限速。你每 30 秒最多只能發送一次路由追蹤請求。" + "value" : "路由追蹤(Trace Route)已被限速。您每 30 秒最多只能發送一次路由追蹤請求。" } } } @@ -35764,7 +35770,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "持照操作員模式的功能如下:\n* 將節點名稱自動設定為你的業餘無線電呼號\n* 每 10 分鐘定期廣播節點資訊(如位置、狀態等)\n* 自動覆蓋頻率、頻率使用時間限制及發射功率設定,符合當地業餘無線電規範\n* 關閉通訊加密功能,以符合透明通訊的法規要求" + "value" : "持照操作員模式的功能如下:\n* 將節點名稱自動設定為您的業餘無線電呼號\n* 每 10 分鐘定期廣播節點資訊(如位置、狀態等)\n* 自動覆蓋頻率、頻率使用時間限制及發射功率設定,符合當地業餘無線電規範\n* 關閉通訊加密功能,以符合透明通訊的法規要求" } } } @@ -36144,7 +36150,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "你的地區每小時的頻率使用限制為 %lld%%,當無線電達到該上限時,將會停止傳送封包。" + "value" : "您的地區每小時的頻率使用限制為 %lld%%,當無線電達到該上限時,將會停止傳送封包。" } } } From 3af397b413bcf2835dce8182ff932ac4bec54ff7 Mon Sep 17 00:00:00 2001 From: unojazz Date: Sat, 26 Apr 2025 16:39:42 -0400 Subject: [PATCH 35/93] some translation --- Localizable.xcstrings | 89 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 80 insertions(+), 9 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 63dd9685..828cc953 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -1884,6 +1884,12 @@ "state" : "translated", "value" : "Дозволи захтеве позиција" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "允許請求位置" + } } } }, @@ -7725,6 +7731,12 @@ "state" : "translated", "value" : "检测传感器配置" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "檢測感應器設定" + } } } }, @@ -10394,7 +10406,14 @@ } }, "Enable this device as a Store and Forward server. Requires an ESP32 device with PSRAM." : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用此裝置作為儲存與轉送伺服器。需使用具備 PSRAM 的 ESP32 裝置。" + } + } + } }, "enabled" : { "localizations" : { @@ -10499,7 +10518,14 @@ } }, "Enables the store and forward module." : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用儲存與轉送(Store and Forward)模組" + } + } + } }, "Enabling Ethernet will disable the bluetooth connection to the app." : { "localizations" : { @@ -13382,7 +13408,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "跳數距離 %d" + "value" : "%d 個跳數" } } } @@ -18123,7 +18149,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "LOW" + "value" : "低" } } } @@ -23243,7 +23269,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "節點號碼" + "value" : "節點編號" } } } @@ -27313,6 +27339,12 @@ "state" : "translated", "value" : "Путања назад: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "路徑(返): %@" + } } } }, @@ -27377,6 +27409,12 @@ "state" : "translated", "value" : "Рута: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "路徑(往): %@ " + } } } }, @@ -29602,7 +29640,14 @@ } }, "Send a heartbeat to advertise the server's presence." : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "發送心跳訊號來宣告伺服器的存在。" + } + } + } }, "Send a message to a certain meshtastic channel" : { "localizations" : { @@ -30594,7 +30639,14 @@ } }, "Settings" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定" + } + } + } }, "Share QR Code & Link" : { "localizations" : { @@ -31538,6 +31590,12 @@ "state" : "translated", "value" : "储存 & 转发" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "儲存與轉送" + } } } }, @@ -31554,11 +31612,24 @@ "state" : "translated", "value" : "储存 & 转发设置" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "儲存與轉送設定" + } } } }, "Store and forward servers require an ESP32 device with PSRAM or Linux Native." : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "儲存與轉送伺服器需要使用具有 PSRAM 的 ESP32 裝置或是原生 Linux 系統。" + } + } + } }, "storeforward.heartbeat" : { "localizations" : { @@ -31619,7 +31690,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "發送心跳包" + "value" : "發送心跳訊號(Heartbeat)" } } } From af32de3c72f31388d4d7a64f4133f804c15c1847 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sat, 26 Apr 2025 15:32:34 -0700 Subject: [PATCH 36/93] Missing key --- Localizable.xcstrings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 1d170efb..819b2ff7 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -15603,6 +15603,9 @@ } } } + }, + "Jump to present" : { + }, "Key" : { "localizations" : { From 63e739f761f87e153fd89d3f130ea3f7c0be3ded Mon Sep 17 00:00:00 2001 From: unojazz Date: Sat, 26 Apr 2025 16:45:02 -0400 Subject: [PATCH 37/93] some translation --- Localizable.xcstrings | 554 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 550 insertions(+), 4 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 828cc953..8918216a 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -17,6 +17,12 @@ "state" : "translated", "value" : "\t%@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "\t%@" + } } } }, @@ -33,11 +39,24 @@ "state" : "translated", "value" : " %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } } } }, " %@%%" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : " %@%%" + } + } + } }, ": %@" : { "localizations" : { @@ -52,6 +71,12 @@ "state" : "translated", "value" : ": %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : ": %@" + } } } }, @@ -68,6 +93,12 @@ "state" : "translated", "value" : ": %d" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : ": %d" + } } } }, @@ -106,6 +137,12 @@ "state" : "translated", "value" : "%@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } } } }, @@ -128,6 +165,12 @@ "state" : "translated", "value" : "%1$@ - %2$@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ - %2$@" + } } } }, @@ -150,6 +193,12 @@ "state" : "translated", "value" : "%1$@ - %2$@ - %3$@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ - %2$@ - %3$@" + } } } }, @@ -256,6 +305,12 @@ "state" : "translated", "value" : "%1$@ (%2$@)" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ (%2$@)" + } } } }, @@ -278,6 +333,12 @@ "state" : "translated", "value" : "%1$@ %2$@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } } } }, @@ -300,6 +361,12 @@ "state" : "translated", "value" : "%1$@ %2$lld" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$lld" + } } } }, @@ -410,6 +477,12 @@ "state" : "translated", "value" : "%@ dB" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ dB" + } } } }, @@ -609,6 +682,12 @@ "state" : "translated", "value" : "%1$@, %2$@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@" + } } } }, @@ -631,6 +710,12 @@ "state" : "translated", "value" : "%1$@: %2$lld / %3$lld" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$lld / %3$lld" + } } } }, @@ -647,6 +732,12 @@ "state" : "translated", "value" : "%@%%" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@%%" + } } } }, @@ -663,6 +754,12 @@ "state" : "translated", "value" : "%@°F" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@°F" + } } } }, @@ -673,6 +770,12 @@ "state" : "translated", "value" : "%@mA" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@mA" + } } } }, @@ -683,6 +786,12 @@ "state" : "translated", "value" : "%@V" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@V" + } } } }, @@ -699,6 +808,12 @@ "state" : "translated", "value" : "%d" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d" + } } } }, @@ -809,6 +924,12 @@ "state" : "translated", "value" : "%d%%" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d%%" + } } } }, @@ -825,6 +946,12 @@ "state" : "translated", "value" : "%lf" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lf" + } } } }, @@ -841,6 +968,12 @@ "state" : "translated", "value" : "%lld" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld" + } } } }, @@ -911,6 +1044,12 @@ "state" : "translated", "value" : "%lld%%" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld%%" + } } } }, @@ -977,6 +1116,12 @@ "state" : "translated", "value" : "< 1%" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "< 1%" + } } } }, @@ -1009,6 +1154,12 @@ "state" : "translated", "value" : "1 byte" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 byte" + } } } }, @@ -1042,6 +1193,12 @@ "state" : "translated", "value" : "2.4 GHz" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "2.4 Ghz" + } } } }, @@ -1058,6 +1215,12 @@ "state" : "translated", "value" : "7" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "7" + } } } }, @@ -1074,6 +1237,12 @@ "state" : "translated", "value" : "8" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "8" + } } } }, @@ -1090,6 +1259,12 @@ "state" : "translated", "value" : "25" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "25" + } } } }, @@ -1106,6 +1281,12 @@ "state" : "translated", "value" : "50" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "50" + } } } }, @@ -1122,6 +1303,12 @@ "state" : "translated", "value" : "75" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "75" + } } } }, @@ -1138,6 +1325,12 @@ "state" : "translated", "value" : "100" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "100" + } } } }, @@ -1154,6 +1347,12 @@ "state" : "translated", "value" : "128 bit" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "128 bit" + } } } }, @@ -1170,6 +1369,12 @@ "state" : "translated", "value" : "256 bit" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "256 bit" + } } } }, @@ -1250,6 +1455,12 @@ "state" : "translated", "value" : "Ack SNR: %@ dB" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ack SNR: %@ dB" + } } } }, @@ -2305,6 +2516,12 @@ "state" : "translated", "value" : "Apple Apps" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apple Apps" + } } } }, @@ -4521,6 +4738,12 @@ "state" : "translated", "value" : "ПУЊ" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "充電中" + } } } }, @@ -4554,6 +4777,12 @@ "state" : "translated", "value" : "清除" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "清除" + } } } }, @@ -7439,6 +7668,12 @@ "state" : "translated", "value" : "Избрисати све позиције?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "刪除所有位置資料?" + } } } }, @@ -13346,6 +13581,12 @@ "state" : "translated", "value" : "高" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "高" + } } } }, @@ -13900,7 +14141,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Icon" + "value" : "圖示" } } } @@ -16821,6 +17062,16 @@ } } }, + "Jump to present" : { + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "跳至最新訊息" + } + } + } + }, "Key" : { "localizations" : { "de" : { @@ -22533,6 +22784,12 @@ "state" : "translated", "value" : "名称" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "名稱" + } } } }, @@ -22555,6 +22812,12 @@ "state" : "translated", "value" : "名称必须少于 30 字节" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "名稱必須小於 30 bytes 。" + } } } }, @@ -22581,6 +22844,12 @@ "state" : "translated", "value" : "Теме у окружењу" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "鄰近的主題" + } } } }, @@ -22661,6 +22930,12 @@ "state" : "translated", "value" : "网络状态 橙色" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "網路狀態 橘" + } } } }, @@ -22677,6 +22952,12 @@ "state" : "translated", "value" : "网络状态 红色" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "網路狀態 紅" + } } } }, @@ -23054,6 +23335,12 @@ "state" : "translated", "value" : "Нема позиција" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "沒有位置" + } } } }, @@ -23151,6 +23438,12 @@ "state" : "translated", "value" : "Чвор" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "節點" + } } } }, @@ -23173,6 +23466,12 @@ "state" : "translated", "value" : "节点核心数据备份 %1$@/%2$@ - %3$@ - %4$@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Node Core Data Backup %1$@/%2$@ - %3$@ - %4$@" + } } } }, @@ -23189,6 +23488,12 @@ "state" : "translated", "value" : "Чвор нема позиције" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "節點沒有位置資訊" + } } } }, @@ -23334,7 +23639,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "距離達 %@ 以內" + "value" : "距離%@以內" } } } @@ -23469,6 +23774,12 @@ "state" : "translated", "value" : "Није валидна датотека путања" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "不是一個有效的路徑檔案" + } } } }, @@ -23549,6 +23860,12 @@ "state" : "translated", "value" : "Белешке" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "筆記" + } } } }, @@ -23565,6 +23882,12 @@ "state" : "translated", "value" : "Број: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Num: %@" + } } } }, @@ -23864,6 +24187,12 @@ "state" : "translated", "value" : "Ok to MQTT" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ok to MQTT" + } } } }, @@ -24566,6 +24895,12 @@ "state" : "translated", "value" : "БЛЕ" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "BLE" + } } } }, @@ -24706,6 +25041,12 @@ "state" : "translated", "value" : "ВајФај" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "WiFi" + } } } }, @@ -24936,6 +25277,12 @@ "state" : "translated", "value" : "Пин %lld" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin %lld" + } } } }, @@ -24946,6 +25293,12 @@ "state" : "translated", "value" : "Пин А" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin A" + } } } }, @@ -24956,6 +25309,12 @@ "state" : "translated", "value" : "Пин Б" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin B" + } } } }, @@ -25209,6 +25568,12 @@ "state" : "translated", "value" : "Позиција послата" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置資料已送出" + } } } }, @@ -25308,6 +25673,12 @@ "state" : "translated", "value" : "У кругу %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 之內" + } } } }, @@ -27466,6 +27837,12 @@ "state" : "translated", "value" : "自行车" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "自行車" + } } } }, @@ -27501,6 +27878,12 @@ "state" : "translated", "value" : "驾驶" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "開車" + } } } }, @@ -27705,6 +28088,12 @@ "state" : "translated", "value" : "步行" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "步行" + } } } }, @@ -27740,6 +28129,12 @@ "state" : "translated", "value" : "徒步" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "登山" + } } } }, @@ -27804,6 +28199,12 @@ "state" : "translated", "value" : "滑雪" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑雪" + } } } }, @@ -27839,6 +28240,12 @@ "state" : "translated", "value" : "步行" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "步行" + } } } }, @@ -28693,6 +29100,12 @@ "state" : "translated", "value" : "RSSI %@ dBm" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "RSSI %@ dBm" + } } } }, @@ -28703,6 +29116,12 @@ "state" : "translated", "value" : "RSSI %ddB" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "RSSI %ddB" + } } } }, @@ -28713,6 +29132,12 @@ "state" : "translated", "value" : "RSSI %llddB" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "RSSI %llddB" + } } } }, @@ -29072,6 +29497,12 @@ "state" : "translated", "value" : "保存用户配置到 %@?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "將使用者設定儲存到 %@?" + } } } }, @@ -30407,6 +30838,12 @@ "state" : "translated", "value" : "文本消息" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "文字訊息" + } } } }, @@ -30481,6 +30918,12 @@ "state" : "translated", "value" : "Подеси" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定" + } } } }, @@ -30959,6 +31402,12 @@ "state" : "translated", "value" : "Прикажи узбуне" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "顯示通知" + } } } }, @@ -30975,6 +31424,12 @@ "state" : "translated", "value" : "Прикажи узбуне" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "顯示通知" + } } } }, @@ -31035,6 +31490,12 @@ "state" : "translated", "value" : "Прикажи на мапи меш мреже." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 Mesh 地圖上顯示" + } } } }, @@ -31083,6 +31544,12 @@ "state" : "translated", "value" : "Искључи" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "關機" + } } } }, @@ -31099,6 +31566,12 @@ "state" : "translated", "value" : "Искључити чвор?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "關機?" + } } } }, @@ -31115,6 +31588,12 @@ "state" : "translated", "value" : "Искључити чвор?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "關機?" + } } } }, @@ -31180,6 +31659,12 @@ "state" : "translated", "value" : "SNR" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "SNR" + } } } }, @@ -31190,6 +31675,12 @@ "state" : "translated", "value" : "SNR %@ dB" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "SNR %@ dB" + } } } }, @@ -31200,6 +31691,12 @@ "state" : "translated", "value" : "SNR %@dB" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "SNR %@dB" + } } } }, @@ -34114,6 +34611,12 @@ "state" : "translated", "value" : "Укупно" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "總共" + } } } }, @@ -34316,6 +34819,12 @@ "state" : "translated", "value" : "Покушај поново" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "請再試一次" + } } } }, @@ -34401,7 +34910,14 @@ } }, "UDP Broadcast" : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "UDP 廣播" + } + } + } }, "Ukraine 433mhz" : { "extractionState" : "manual", @@ -35955,6 +36471,12 @@ "state" : "translated", "value" : "x" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "x" + } } } }, @@ -35977,6 +36499,12 @@ "state" : "translated", "value" : "X: %1$@, Y: %2$d" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "X: %1$@, Y: %2$d" + } } } }, @@ -35999,6 +36527,12 @@ "state" : "translated", "value" : "X: %1$@, Y: %2$f" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "X: %1$@, Y: %2$f" + } } } }, @@ -36021,6 +36555,12 @@ "state" : "translated", "value" : "X: %1$@, Y: %2$lld" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "X: %1$@, Y: %2$lld" + } } } }, @@ -36037,6 +36577,12 @@ "state" : "translated", "value" : "y" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "y" + } } } }, From 973216374f2a6a97740f38432cea13418156d6a0 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sat, 26 Apr 2025 16:00:00 -0700 Subject: [PATCH 38/93] MQTT config cleanup --- Localizable.xcstrings | 238 +++++------------- .../Settings/Config/Module/MQTTConfig.swift | 14 +- 2 files changed, 73 insertions(+), 179 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 819b2ff7..dd928ae9 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -5956,6 +5956,9 @@ } } } + }, + "Connect to MQTT via Proxy" : { + }, "Connect to new radio?" : { "localizations" : { @@ -20185,180 +20188,6 @@ } } }, - "mqtt.connect" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verbunden mit MQTT" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connect to MQTT" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connecter à MQTT" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "התחבר ל-MQTT" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connettersi a MQTT" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connect to MQTT" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anslut till MQTT" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Повежи се на MQTT" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "连接至 MQTT" - } - } - } - }, - "mqtt.disconnect" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trennen von MQTT" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Disconnect from MQTT" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Déconnecter le MQTT" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "התנתק מ-MQTT" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Disconnessione da MQTT" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Disconnect from MQTT" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Koppla från MQTT" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Развежи се од MQTT" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "断开 MQTT 连接" - } - } - } - }, - "mqtt.username" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Benutzername" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Username" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nom d'utilisateur" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שם משתמש" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome utente" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nazwa użytkownika" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Användarnamn" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Корисничко име" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "用户名称" - } - } - } - }, "Must be a single emoji" : { "localizations" : { "it" : { @@ -22134,6 +21963,9 @@ } }, "password" : { + + }, + "Password" : { "localizations" : { "de" : { "stringUnit" : { @@ -32331,6 +32163,64 @@ } } }, + "Username" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Benutzername" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Username" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nom d'utilisateur" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שם משתמש" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome utente" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nazwa użytkownika" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Användarnamn" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Корисничко име" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "用户名称" + } + } + } + }, "Uses pullup resistor" : { "localizations" : { "it" : { diff --git a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift index e9b184b3..3b184548 100644 --- a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift @@ -67,7 +67,7 @@ struct MQTTConfig: View { if enabled && proxyToClientEnabled && node?.mqttConfig?.proxyToClientEnabled ?? false == true { Toggle(isOn: $mqttConnected) { - Label(mqttConnected ? "mqtt.disconnect".localized : "mqtt.connect".localized, systemImage: "server.rack") + Label("Connect to MQTT via Proxy", systemImage: "server.rack") if bleManager.mqttError.count > 0 { Text(bleManager.mqttError) .fixedSize(horizontal: false, vertical: true) @@ -200,8 +200,8 @@ struct MQTTConfig: View { .autocorrectionDisabled() if address != "mqtt.meshtastic.org" { HStack { - Label("mqtt.username", systemImage: "person.text.rectangle") - TextField("mqtt.username", text: $username) + Label("Username", systemImage: "person.text.rectangle") + TextField("Username", text: $username) .foregroundColor(.gray) .autocapitalization(.none) .disableAutocorrection(true) @@ -219,8 +219,8 @@ struct MQTTConfig: View { .keyboardType(.default) .scrollDismissesKeyboard(.interactively) HStack { - Label("password", systemImage: "wallet.pass") - TextField("password", text: $password) + Label("Password", systemImage: "wallet.pass") + TextField("Password", text: $password) .foregroundColor(.gray) .autocapitalization(.none) .disableAutocorrection(true) @@ -288,6 +288,10 @@ struct MQTTConfig: View { if newProxyToClientEnabled != node?.mqttConfig?.proxyToClientEnabled { hasChanges = true } } .onChange(of: address) { _, newAddress in + if address.lowercased() == "mqtt.meshtastic.org" { + username = "meshdev" + password = "large4cats" + } if newAddress != node?.mqttConfig?.address ?? "" { hasChanges = true } } .onChange(of: username) { _, newUsername in From b8f874439dfd03bbd4c37569697b97db12d069f9 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sat, 26 Apr 2025 16:05:09 -0700 Subject: [PATCH 39/93] Get rid of a few more translation keys --- Localizable.xcstrings | 4 ++-- Meshtastic/Views/Settings/Config/BluetoothConfig.swift | 4 ++-- Meshtastic/Views/Settings/Config/DeviceConfig.swift | 2 +- .../Settings/Config/Module/AmbientLightingConfig.swift | 2 +- .../Views/Settings/Config/Module/CannedMessagesConfig.swift | 4 ++-- .../Settings/Config/Module/DetectionSensorConfig.swift | 4 ++-- .../Settings/Config/Module/ExternalNotificationConfig.swift | 4 ++-- Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift | 6 +++--- .../Views/Settings/Config/Module/PaxCounterConfig.swift | 4 ++-- .../Views/Settings/Config/Module/RangeTestConfig.swift | 4 ++-- Meshtastic/Views/Settings/Config/Module/RtttlConfig.swift | 2 +- Meshtastic/Views/Settings/Config/Module/SerialConfig.swift | 4 ++-- .../Views/Settings/Config/Module/StoreForwardConfig.swift | 4 ++-- .../Views/Settings/Config/Module/TelemetryConfig.swift | 4 ++-- Meshtastic/Views/Settings/Config/NetworkConfig.swift | 6 +++--- Meshtastic/Views/Settings/Routes.swift | 2 +- 16 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index dd928ae9..42700843 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -9799,7 +9799,7 @@ } } }, - "enabled" : { + "Enabled" : { "localizations" : { "de" : { "stringUnit" : { @@ -21656,7 +21656,7 @@ } } }, - "options" : { + "Options" : { "localizations" : { "de" : { "stringUnit" : { diff --git a/Meshtastic/Views/Settings/Config/BluetoothConfig.swift b/Meshtastic/Views/Settings/Config/BluetoothConfig.swift index 63fdf327..82b4f628 100644 --- a/Meshtastic/Views/Settings/Config/BluetoothConfig.swift +++ b/Meshtastic/Views/Settings/Config/BluetoothConfig.swift @@ -29,9 +29,9 @@ struct BluetoothConfig: View { Form { ConfigHeader(title: "Bluetooth", config: \.bluetoothConfig, node: node, onAppear: setBluetoothValues) - Section(header: Text("options")) { + Section(header: Text("Options")) { Toggle(isOn: $enabled) { - Label("enabled", systemImage: "antenna.radiowaves.left.and.right") + Label("Enabled", systemImage: "antenna.radiowaves.left.and.right") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) Picker("Pairing Mode", selection: $mode ) { diff --git a/Meshtastic/Views/Settings/Config/DeviceConfig.swift b/Meshtastic/Views/Settings/Config/DeviceConfig.swift index abce6e9a..3fdc73b9 100644 --- a/Meshtastic/Views/Settings/Config/DeviceConfig.swift +++ b/Meshtastic/Views/Settings/Config/DeviceConfig.swift @@ -40,7 +40,7 @@ struct DeviceConfig: View { Form { ConfigHeader(title: "Device", config: \.deviceConfig, node: node, onAppear: setDeviceValues) - Section(header: Text("options")) { + Section(header: Text("Options")) { VStack(alignment: .leading) { Picker("Device Role", selection: $deviceRole ) { ForEach(DeviceRoles.allCases) { dr in diff --git a/Meshtastic/Views/Settings/Config/Module/AmbientLightingConfig.swift b/Meshtastic/Views/Settings/Config/Module/AmbientLightingConfig.swift index 8e3a0f02..24c0ada3 100644 --- a/Meshtastic/Views/Settings/Config/Module/AmbientLightingConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/AmbientLightingConfig.swift @@ -30,7 +30,7 @@ struct AmbientLightingConfig: View { Form { ConfigHeader(title: "Ambient Lighting", config: \.ambientLightingConfig, node: node, onAppear: setAmbientLightingConfigValue) - Section(header: Text("options")) { + Section(header: Text("Options")) { Toggle(isOn: $ledState) { Label("LED State", systemImage: ledState ? "lightbulb.led.fill" : "lightbulb.led") diff --git a/Meshtastic/Views/Settings/Config/Module/CannedMessagesConfig.swift b/Meshtastic/Views/Settings/Config/Module/CannedMessagesConfig.swift index 99a28a32..e95d524f 100644 --- a/Meshtastic/Views/Settings/Config/Module/CannedMessagesConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/CannedMessagesConfig.swift @@ -42,11 +42,11 @@ struct CannedMessagesConfig: View { Form { ConfigHeader(title: "Canned messages", config: \.cannedMessageConfig, node: node, onAppear: setCannedMessagesValues) - Section(header: Text("options")) { + Section(header: Text("Options")) { Toggle(isOn: $enabled) { - Label("enabled", systemImage: "list.bullet.rectangle.fill") + Label("Enabled", systemImage: "list.bullet.rectangle.fill") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) diff --git a/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift b/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift index 1c53b495..21e24177 100644 --- a/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift @@ -47,10 +47,10 @@ struct DetectionSensorConfig: View { Form { ConfigHeader(title: "Detection Sensor", config: \.detectionSensorConfig, node: node, onAppear: setDetectionSensorValues) - Section(header: Text("options")) { + Section(header: Text("Options")) { Toggle(isOn: $enabled) { - Label("enabled", systemImage: "dot.radiowaves.right") + Label("Enabled", systemImage: "dot.radiowaves.right") Text("Enables the detection sensor module, it needs to be enabled on both the node with the sensor, and any nodes that you want to receive detection sensor text messages or view the detection sensor log and chart.") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) diff --git a/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift b/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift index 9602c44b..01d2f247 100644 --- a/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift @@ -39,10 +39,10 @@ struct ExternalNotificationConfig: View { Form { ConfigHeader(title: "External notification", config: \.externalNotificationConfig, node: node, onAppear: setExternalNotificationValues) - Section(header: Text("options")) { + Section(header: Text("Options")) { Toggle(isOn: $enabled) { - Label("enabled", systemImage: "megaphone") + Label("Enabled", systemImage: "megaphone") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) diff --git a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift index 3b184548..21297a16 100644 --- a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift @@ -51,10 +51,10 @@ struct MQTTConfig: View { ConfigHeader(title: "MQTT", config: \.mqttConfig, node: node, onAppear: setMqttValues) - Section(header: Text("options")) { + Section(header: Text("Options")) { Toggle(isOn: $enabled) { - Label("enabled", systemImage: "dot.radiowaves.up.forward") + Label("Enabled", systemImage: "dot.radiowaves.up.forward") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) @@ -94,7 +94,7 @@ struct MQTTConfig: View { Section(header: Text("Map Report")) { Toggle(isOn: $mapReportingEnabled) { - Label("enabled", systemImage: "map") + Label("Enabled", systemImage: "map") Text("Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name.") .foregroundColor(.gray) .font(.caption) diff --git a/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift b/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift index 24af3504..5f78379e 100644 --- a/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift @@ -26,7 +26,7 @@ struct PaxCounterConfig: View { Section { Toggle(isOn: $enabled) { - Label("enabled", systemImage: "figure.walk.motion") + Label("Enabled", systemImage: "figure.walk.motion") Text("config.module.paxcounter.enabled.description") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) @@ -46,7 +46,7 @@ struct PaxCounterConfig: View { .font(.callout) } } header: { - Text("options") + Text("Options") } } .disabled(self.bleManager.connectedPeripheral == nil || node?.powerConfig == nil) diff --git a/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift b/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift index 979eb736..7ac35423 100644 --- a/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift @@ -27,9 +27,9 @@ struct RangeTestConfig: View { Form { ConfigHeader(title: "Range", config: \.rangeTestConfig, node: node, onAppear: setRangeTestValues) - Section(header: Text("options")) { + Section(header: Text("Options")) { Toggle(isOn: $enabled) { - Label("enabled", systemImage: "figure.walk") + Label("Enabled", systemImage: "figure.walk") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) .listRowSeparator(.visible) diff --git a/Meshtastic/Views/Settings/Config/Module/RtttlConfig.swift b/Meshtastic/Views/Settings/Config/Module/RtttlConfig.swift index b81e2348..669add34 100644 --- a/Meshtastic/Views/Settings/Config/Module/RtttlConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/RtttlConfig.swift @@ -24,7 +24,7 @@ struct RtttlConfig: View { Form { ConfigHeader(title: "ringtone", config: \.rtttlConfig, node: node, onAppear: setRtttLConfigValue) - Section(header: Text("options")) { + Section(header: Text("Options")) { HStack { Label("ringtone", systemImage: "music.quarternote.3") TextField("config.ringtone.label", text: $ringtone, axis: .vertical) diff --git a/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift b/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift index fd2c0c99..d8ca379d 100644 --- a/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift @@ -33,10 +33,10 @@ struct SerialConfig: View { Form { ConfigHeader(title: "Serial", config: \.serialConfig, node: node, onAppear: setSerialValues) - Section(header: Text("options")) { + Section(header: Text("Options")) { Toggle(isOn: $enabled) { - Label("enabled", systemImage: "terminal") + Label("Enabled", systemImage: "terminal") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) diff --git a/Meshtastic/Views/Settings/Config/Module/StoreForwardConfig.swift b/Meshtastic/Views/Settings/Config/Module/StoreForwardConfig.swift index fe6abcd1..3f2e66f6 100644 --- a/Meshtastic/Views/Settings/Config/Module/StoreForwardConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/StoreForwardConfig.swift @@ -34,9 +34,9 @@ struct StoreForwardConfig: View { Form { ConfigHeader(title: "Store & Forward", config: \.storeForwardConfig, node: node, onAppear: setStoreAndForwardValues) - Section(header: Text("options")) { + Section(header: Text("Options")) { Toggle(isOn: $enabled) { - Label("enabled", systemImage: "envelope.arrow.triangle.branch") + Label("Enabled", systemImage: "envelope.arrow.triangle.branch") Text("Enables the store and forward module.") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) diff --git a/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift b/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift index ad173dae..6d78316c 100644 --- a/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift @@ -64,7 +64,7 @@ struct TelemetryConfig: View { .foregroundColor(.gray) .font(.callout) Toggle(isOn: $environmentMeasurementEnabled) { - Label("enabled", systemImage: "chart.xyaxis.line") + Label("Enabled", systemImage: "chart.xyaxis.line") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) Toggle(isOn: $environmentScreenEnabled) { @@ -78,7 +78,7 @@ struct TelemetryConfig: View { } Section(header: Text("Power Options")) { Toggle(isOn: $powerMeasurementEnabled) { - Label("enabled", systemImage: "bolt") + Label("Enabled", systemImage: "bolt") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) .listRowSeparator(.visible) diff --git a/Meshtastic/Views/Settings/Config/NetworkConfig.swift b/Meshtastic/Views/Settings/Config/NetworkConfig.swift index c63e95be..b8e51fe3 100644 --- a/Meshtastic/Views/Settings/Config/NetworkConfig.swift +++ b/Meshtastic/Views/Settings/Config/NetworkConfig.swift @@ -36,7 +36,7 @@ struct NetworkConfig: View { Section(header: Text("WiFi Options")) { Toggle(isOn: $wifiEnabled) { - Label("enabled", systemImage: "wifi") + Label("Enabled", systemImage: "wifi") Text("Enabling WiFi will disable the bluetooth connection to the app.") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) @@ -82,7 +82,7 @@ struct NetworkConfig: View { if node.metadata?.hasEthernet ?? false { Section(header: Text("Ethernet Options")) { Toggle(isOn: $ethEnabled) { - Label("enabled", systemImage: "network") + Label("Enabled", systemImage: "network") Text("Enabling Ethernet will disable the bluetooth connection to the app.") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) @@ -92,7 +92,7 @@ struct NetworkConfig: View { if node.metadata?.hasEthernet ?? false || node.metadata?.hasWifi ?? false { Section(header: Text("UDP Broadcast")) { Toggle(isOn: $udpEnabled) { - Label("enabled", systemImage: "point.3.connected.trianglepath.dotted") + Label("Enabled", systemImage: "point.3.connected.trianglepath.dotted") Text("Enable broadcasting packets via UDP over the local network.") } } diff --git a/Meshtastic/Views/Settings/Routes.swift b/Meshtastic/Views/Settings/Routes.swift index 52b00fa0..7e6407bc 100644 --- a/Meshtastic/Views/Settings/Routes.swift +++ b/Meshtastic/Views/Settings/Routes.swift @@ -184,7 +184,7 @@ struct Routes: View { } Toggle(isOn: $enabled) { - Label("enabled", systemImage: "point.topleft.filled.down.to.point.bottomright.curvepath") + Label("Enabled", systemImage: "point.topleft.filled.down.to.point.bottomright.curvepath") Text("Show on the mesh map.") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) From 3d92afbab72c5718dcc9cc605ae5bed4f7becb92 Mon Sep 17 00:00:00 2001 From: unojazz Date: Sat, 26 Apr 2025 19:12:12 -0400 Subject: [PATCH 40/93] some translation --- Localizable.xcstrings | 428 ++++++++++++++++++++++-------------------- 1 file changed, 229 insertions(+), 199 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 8918216a..52559fc0 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -1951,6 +1951,12 @@ "state" : "translated", "value" : "收到铃声时发出警报 GPIO 蜂鸣器" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "接收鈴鐺通知時觸發 GPIO 蜂鳴器警報" + } } } }, @@ -1961,6 +1967,12 @@ "state" : "translated", "value" : "Упозорите GPIO зујалицу када примите поруку" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "接收訊息時觸發 GPIO 蜂鳴器警報" + } } } }, @@ -1977,6 +1989,12 @@ "state" : "translated", "value" : "收到铃声时提醒 GPIO 振动电机" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "接收鈴鐺通知時觸發 GPIO 振動馬達警報" + } } } }, @@ -1987,6 +2005,12 @@ "state" : "translated", "value" : "Упозорите GPIO вибра мотор када примите поруку" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "接收訊息時觸發 GPIO 振動馬達警報" + } } } }, @@ -2003,6 +2027,12 @@ "state" : "translated", "value" : "收到铃声时发出警报" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "接收鈴鐺通知時觸發通知" + } } } }, @@ -2013,6 +2043,12 @@ "state" : "translated", "value" : "Упозори када примиш поруку" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "接收訊息時觸發通知" + } } } }, @@ -2847,6 +2883,12 @@ "state" : "translated", "value" : "气压" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "大氣壓力" + } } } }, @@ -3853,6 +3895,12 @@ "state" : "translated", "value" : "Интервал карусела" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "輪播時間間隔" + } } } }, @@ -4712,6 +4760,12 @@ "state" : "translated", "value" : "通过二维码添加的频道无法保存。添加频道时,名称必须唯一。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "從 QR Code 新增的頻道未成功儲存。新增頻道時,頻道名稱不能重複。" + } } } }, @@ -4728,6 +4782,12 @@ "state" : "translated", "value" : "图表" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "圖表" + } } } }, @@ -6756,7 +6816,14 @@ } }, "Connecting to a new radio will clear all app data on the phone." : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "連接到新的設備時,手機上的 App 資料將會被清除。" + } + } + } }, "Connection Attempt %lld of 10" : { "localizations" : { @@ -6994,6 +7061,12 @@ "state" : "translated", "value" : "控制类型" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "控制模式" + } } } }, @@ -7010,6 +7083,12 @@ "state" : "translated", "value" : "控制设备上闪烁的 LED。 对大多数设备而言,这将控制最多 4 个 LED 中的一个,充电指示灯和 GPS 状态灯无法控制。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "控制裝置上的閃爍 LED。對於大多數裝置而言,這將能控制最多 4 顆 LED 其中之一,但充電指示燈和 GPS 指示燈無法被控制。" + } } } }, @@ -7358,6 +7437,12 @@ "state" : "translated", "value" : "目前,更新 ESP32 设备的推荐方法是在电脑上使用基于 Chrome 浏览器的 Web Flasher。该方法不适用于移动设备或通过 BLE 进行更新。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "目前建議使用電腦透過以 Chrome 為基礎的瀏覽器,使用網頁刷機工具來更新 ESP32 裝置。此方法無法在行動裝置上或透過 BLE 使用。" + } } } }, @@ -7814,6 +7899,12 @@ "state" : "translated", "value" : "Откривање" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "檢測感測器" + } } } }, @@ -7824,6 +7915,12 @@ "state" : "translated", "value" : "Догађај откривања" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "檢測感測器事件" + } } } }, @@ -7856,6 +7953,12 @@ "state" : "translated", "value" : "检测传感器信息以文本信息的形式接收。如果启用通知功能,则每收到一条检测信息都会收到一条通知,并显示相应的未读信息。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "偵測感測器的訊息會以文字訊息的形式接收。若啟用通知功能,每當接收到偵測訊息時,您將會收到一則通知,並顯示對應的未讀訊息標記。" + } } } }, @@ -10315,6 +10418,12 @@ "state" : "translated", "value" : "双击作为按钮" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "將雙擊作為按鈕使用" + } } } }, @@ -10413,6 +10522,12 @@ "state" : "translated", "value" : "Постави ознаку на мапама" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "在地圖上放置圖釘" + } } } }, @@ -10503,6 +10618,12 @@ "state" : "translated", "value" : "Повећање надморске висине" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "爬升高度" + } } } }, @@ -10616,7 +10737,14 @@ } }, "Enable broadcasting packets via UDP over the local network." : { - + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用透過本地網路以 UDP 廣播封包。" + } + } + } }, "Enable Notifications" : { "localizations" : { @@ -10650,7 +10778,7 @@ } } }, - "enabled" : { + "Enabled" : { "localizations" : { "de" : { "stringUnit" : { @@ -12158,6 +12286,12 @@ "state" : "translated", "value" : "За све" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "對所有人" + } } } }, @@ -12174,6 +12308,12 @@ "state" : "translated", "value" : "За мене" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "對自己" + } } } }, @@ -12244,6 +12384,12 @@ "state" : "translated", "value" : "友好名称" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "友善名稱" + } } } }, @@ -12260,6 +12406,12 @@ "state" : "translated", "value" : "用于格式化发送到 Mesh 网络的信息的友好名称。例如名称为 “运动”时,发送的信息为 “检测到运动”。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "用來格式化發送到 Mesh 網路的友善名稱。例如:名稱設定為「移動」,則傳送的訊息將會是「偵測到移動」。" + } } } }, @@ -13311,6 +13463,12 @@ "state" : "translated", "value" : "群聊" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "群組訊息" + } } } }, @@ -13321,6 +13479,12 @@ "state" : "translated", "value" : "Јаки удари ветра %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "陣風 %@" + } } } }, @@ -13755,6 +13919,12 @@ "state" : "translated", "value" : "按下用户按钮或收到消息后屏幕保持亮屏的时间。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用者按下按鈕或收到訊息後,螢幕維持亮起的時間長度。" + } } } }, @@ -17289,6 +17459,12 @@ "state" : "translated", "value" : "LED 心跳" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "LED 心跳燈 (Heartbeat)" + } } } }, @@ -22487,200 +22663,6 @@ } } }, - "mqtt.connect" : { - "extractionState" : "migrated", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verbunden mit MQTT" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connect to MQTT" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connecter à MQTT" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "התחבר ל-MQTT" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connect to MQTT" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Conectar ao MQTT" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anslut till MQTT" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Повежи се на MQTT" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "连接至 MQTT" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "連線到 MQTT" - } - } - } - }, - "mqtt.disconnect" : { - "extractionState" : "migrated", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trennen von MQTT" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Disconnect from MQTT" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Déconnecter le MQTT" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "התנתק מ-MQTT" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Disconnect from MQTT" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desconectar do MQTT" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Koppla från MQTT" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Развежи се од MQTT" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "断开 MQTT 连接" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "是否與 MQTT 連接" - } - } - } - }, - "mqtt.username" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Benutzername" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Username" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nom d'utilisateur" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שם משתמש" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nazwa użytkownika" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome de Utilizador" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Användarnamn" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Корисничко име" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "用户名称" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "用戶名稱" - } - } - } - }, "Must be a single emoji" : { "localizations" : { "sr" : { @@ -22688,6 +22670,12 @@ "state" : "translated", "value" : "Мора бити један емотикон" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "必須只使用一個表情符號" + } } } }, @@ -24457,10 +24445,16 @@ "state" : "translated", "value" : "Опциони GPIO" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "可選 GPIO" + } } } }, - "options" : { + "Options" : { "localizations" : { "de" : { "stringUnit" : { @@ -25478,6 +25472,12 @@ "state" : "translated", "value" : "Неуспела размена позиција" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "位置交換失敗" + } } } }, @@ -25488,6 +25488,12 @@ "state" : "translated", "value" : "Захтевана размена позиција" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已請求位置交換" + } } } }, @@ -25813,6 +25819,12 @@ "state" : "translated", "value" : "Снага екрана" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電源畫面" + } } } }, @@ -26222,6 +26234,12 @@ "state" : "translated", "value" : "Радио веза је прекинута" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已斷線" + } } } }, @@ -26624,6 +26642,12 @@ "state" : "translated", "value" : "Поново покрени чвор?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "重啟節點?" + } } } }, @@ -27139,6 +27163,12 @@ "state" : "translated", "value" : "Уклони" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "移除" + } } } }, @@ -36790,4 +36820,4 @@ } }, "version" : "1.0" -} \ No newline at end of file +} From ade85af1fb74c563f00b57ae371dfed438236693 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sat, 26 Apr 2025 16:18:21 -0700 Subject: [PATCH 41/93] Bump version --- Meshtastic.xcodeproj/project.pbxproj | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 62cf1085..4f451b2d 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -1787,12 +1787,12 @@ INFOPLIST_FILE = Meshtastic/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Meshtastic; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.5.23; + MARKETING_VERSION = 2.6.0; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; @@ -1821,12 +1821,12 @@ INFOPLIST_FILE = Meshtastic/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Meshtastic; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.5.23; + MARKETING_VERSION = 2.6.0; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; @@ -1852,13 +1852,13 @@ INFOPLIST_FILE = Widgets/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Widgets; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.5.23; + MARKETING_VERSION = 2.6.0; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient.Widgets; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1885,13 +1885,13 @@ INFOPLIST_FILE = Widgets/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Widgets; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.5.23; + MARKETING_VERSION = 2.6.0; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient.Widgets; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; From 0b46724c27ba879c8c273254dff4507b068d6e01 Mon Sep 17 00:00:00 2001 From: unojazz Date: Sat, 26 Apr 2025 20:24:59 -0400 Subject: [PATCH 42/93] some translation --- Localizable.xcstrings | 11446 +++++++++++++++++++++++++--------------- 1 file changed, 7204 insertions(+), 4242 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 52559fc0..a29691fb 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -6,6 +6,12 @@ }, "\t%@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28,6 +34,12 @@ }, " %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -50,6 +62,12 @@ }, " %@%%" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@%%" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -60,6 +78,12 @@ }, ": %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : ": %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -82,6 +106,12 @@ }, ": %d" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : ": %d" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -104,6 +134,12 @@ }, "(Re)define PIN_GPS_EN for your board." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "(Ri)definire il PIN_GPS_EN per la propria scheda." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -126,6 +162,12 @@ }, "%@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -150,7 +192,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "%1$@ - %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "%1$@ - %2$@" } }, @@ -178,7 +226,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "%1$@ - %2$@ - %3$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "%1$@ - %2$@ - %3$@" } }, @@ -206,10 +260,16 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", "value" : "%1$@ - %2$@ Towards %3$@ Back" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ - %2$@ Verso %3$@ Indietro" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -238,6 +298,12 @@ "value" : "%@ - Keine Antwort" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ - Nessuna risposta" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -253,7 +319,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "%@ - 沒有回應" + "value" : "%1$@ - %2$@ 往 %3$@ 返" } } } @@ -266,6 +332,12 @@ "value" : "%@ - Nicht gesendet" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ - Non inviato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -290,7 +362,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "%1$@ (%2$@)" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "%1$@ (%2$@)" } }, @@ -318,7 +396,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "%1$@ %2$@" } }, @@ -346,7 +430,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "%1$@ %2$lld" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "%1$@ %2$lld" } }, @@ -378,6 +468,12 @@ "value" : "%@ entfernt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ via" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -400,6 +496,12 @@ }, "%@ can be up to %@ bytes long." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ può essere lungo fino a %@ byte." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -422,6 +524,12 @@ }, "%@ Channels?" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ Canali?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -444,6 +552,12 @@ }, "%@ config data was requested over the admin channel but no response has been returned from the remote node." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "i dati di configurazione %@ sono stati richiesti attraverso il canale di amministrazione, ma non è stata fornita alcuna risposta dal nodo remoto." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -466,6 +580,12 @@ }, "%@ dB" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ dB" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -487,7 +607,6 @@ } }, "%@ Please try connecting again and check the PIN carefully." : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -507,18 +626,18 @@ "value" : "%@ בבקשה נסה שנית להתחבר למכשיר ובדוק את הקוד." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ Si prega di provare a connettersi nuovamente e di controllare attentamente il PIN." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "%@ Spróbuj połączyć się ponownie i dokładnie sprawdź PIN." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ Por favor, tente conectar novamente e verifique cuidadosamente o PIN." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -546,7 +665,6 @@ } }, "%@ The app will automatically reconnect to the preferred radio if it comes back in range." : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -566,18 +684,18 @@ "value" : "%@ האפליקציה תנסה אוטומטית להתחבר מחדש למכשיר המועדף אם ייראה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ L'applicazione si riconnette automaticamente alla radio preferita se torna nel raggio d'azione." + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "%@ Aplikacja automatycznie ponownie połączy się z preferowanym radiem, jeśli wróci w zasięg." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@ O App vai reconetar automaticamente ao rádio preferido se ele voltar ao alcance." - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -605,7 +723,6 @@ } }, "%@ This error usually cannot be fixed without forgetting the device unders Settings > Bluetooth and re-connecting to the radio." : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -625,18 +742,18 @@ "value" : "%@ שגיאה זו בדרך כלל אינה ניתנת לתיקון ללא שכחחת המכשיר בהגדרות מכשיר > בלוטוס ואז להתחבר מחדש למכשיר." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ Questo errore di solito non può essere risolto senza dimenticare il dispositivo sotto Impostazioni > Bluetooth e riconnettersi alla radio." + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "%@ Ten błąd zwykle nie może być naprawiony bez zapomnienia urządzenia w Ustawienia > Bluetooth i ponownego połączenia z radiem." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "%@ Esse erro geralmente não pode ser corrigido sem esquecer o dispositivo em Configurações > Bluetooth e reconetar ao rádio." - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -667,7 +784,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "%1$@, %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "%1$@, %2$@" } }, @@ -695,7 +818,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "%1$@: %2$lld / %3$lld" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "%1$@: %2$lld / %3$lld" } }, @@ -721,6 +850,12 @@ }, "%@%%" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@%%" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -743,6 +878,12 @@ }, "%@°F" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@°F" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -765,6 +906,12 @@ }, "%@mA" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@mA" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -781,6 +928,12 @@ }, "%@V" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@V" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -797,6 +950,12 @@ }, "%d" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -830,14 +989,32 @@ }, "other" : { "stringUnit" : { - "state" : "new", + "state" : "translated", "value" : "%d Hops" } - }, - "zero" : { + } + } + } + }, + "it" : { + "variations" : { + "plural" : { + "many" : { "stringUnit" : { "state" : "translated", - "value" : "Direct" + "value" : "%d Hop" + } + }, + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d Hop" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d Hop" } } } @@ -863,12 +1040,6 @@ "state" : "translated", "value" : "%d скокова" } - }, - "zero" : { - "stringUnit" : { - "state" : "translated", - "value" : "Директно" - } } } } @@ -877,15 +1048,9 @@ "variations" : { "plural" : { "other" : { - "stringUnit" : { - "state" : "new", - "value" : "%d Hops" - } - }, - "zero" : { "stringUnit" : { "state" : "translated", - "value" : "Direct" + "value" : "%d Hops" } } } @@ -899,12 +1064,6 @@ "state" : "translated", "value" : "%d 跳數" } - }, - "zero" : { - "stringUnit" : { - "state" : "translated", - "value" : "直連" - } } } } @@ -913,6 +1072,12 @@ }, "%d%%" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d%%" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -935,6 +1100,12 @@ }, "%lf" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lf" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -957,6 +1128,12 @@ }, "%lld" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -985,6 +1162,12 @@ "value" : "%lld oder weniger Hops entfernt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld o meno hops di distanza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1001,6 +1184,12 @@ }, "%lld Readings Total" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Letture Totale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1017,6 +1206,12 @@ }, "%lld Total Detection Events" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Totale eventi di rilevamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1033,6 +1228,12 @@ }, "%lld%%" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld%%" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1061,6 +1262,12 @@ "value" : "%llddb Übertragungsleistung" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%llddb Potenza di trasmissione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1089,6 +1296,12 @@ "value" : "%llddBm Übertragungsleistung" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%llddBm Potenza di trasmissione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1105,6 +1318,12 @@ }, "< 1%" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "< 1%" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1127,6 +1346,12 @@ }, "🦕 End of life Version 🦖 ☄️" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "🦕 Versione di fine vita 🦖 ☄️" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1143,6 +1368,12 @@ }, "1 byte" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 byte" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1165,6 +1396,12 @@ }, "1 hop away" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "a 1 salto di distanza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1186,8 +1423,13 @@ } }, "2.4 Ghz" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "2.4 Ghz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1204,6 +1446,12 @@ }, "7" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "7" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1226,6 +1474,12 @@ }, "8" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "8" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1248,6 +1502,12 @@ }, "25" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "25" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1270,6 +1530,12 @@ }, "50" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "50" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1292,6 +1558,12 @@ }, "75" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "75" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1314,6 +1586,12 @@ }, "100" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "100" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1336,6 +1614,12 @@ }, "128 bit" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "128 bit" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1358,6 +1642,12 @@ }, "256 bit" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "256 bit" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1380,6 +1670,12 @@ }, "A Trace Route was sent, no response has been received." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È stata inviata una rotta di tracciamento, ma non è stata ricevuta alcuna risposta." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1396,6 +1692,12 @@ }, "About" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Circa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1412,6 +1714,12 @@ }, "About Meshtastic" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Informazioni su Meshtastic" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1434,6 +1742,12 @@ "value" : "Genauigkeit %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Precisione %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1450,6 +1764,12 @@ }, "Ack SNR: %@ dB" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "SNR Ack: %@ dB" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1466,6 +1786,12 @@ }, "Ack Time: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempo di risposta: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1482,6 +1808,12 @@ }, "Acknowledged by another node" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riconosciuto da un altro nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1504,6 +1836,12 @@ "value" : "Aktionen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Azioni" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1526,6 +1864,12 @@ "value" : "Aktiv" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1548,6 +1892,12 @@ "value" : "Aktivität" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attività" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1570,6 +1920,12 @@ }, "Add Channel" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1586,6 +1942,12 @@ }, "Add Channels" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi canali" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1608,6 +1970,12 @@ "value" : "Zu Favoriten hinzufügen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi ai preferiti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1624,6 +1992,12 @@ }, "Additional help" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aiuto supplementare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1646,6 +2020,12 @@ }, "Address" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indirizzo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1674,6 +2054,12 @@ "value" : "Schlüssel für Administrator und Direktnachrichten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tasti amministratore e messaggi diretti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1696,6 +2082,12 @@ }, "Administration" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amministrazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1718,6 +2110,12 @@ }, "Advanced" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avanzato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1740,6 +2138,12 @@ }, "Advanced Device GPS" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo avanzato GPS" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1762,6 +2166,12 @@ }, "Advanced GPIO Options" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni GPIO avanzate" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1784,6 +2194,12 @@ }, "Advanced Position Flags" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Flags di posizione avanzati" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1804,66 +2220,6 @@ } } }, - "ago" : { - "comment" : "Three hours ago = Три сата пре", - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "her" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "auparavant" - } - }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "עברו" - } - }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "temu" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "há" - } - }, - "se" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "sedan" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "пре" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "之前" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "之前" - } - } - } - }, "Airtime" : { "localizations" : { "de" : { @@ -1884,18 +2240,18 @@ "value" : "זמן אוויר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ora d'aria" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Czas nadawania" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Tempo ao Ár" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -1924,6 +2280,12 @@ }, "Alert" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Allarme" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1940,6 +2302,12 @@ }, "Alert GPIO buzzer when receiving a bell" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avvisare il buzzer GPIO quando si riceve un campanello" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1962,6 +2330,12 @@ }, "Alert GPIO buzzer when receiving a message" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avvisare il cicalino GPIO quando si riceve un messaggio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -1978,6 +2352,12 @@ }, "Alert GPIO vibra motor when receiving a bell" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avviso GPIO del motore a vibrazione quando si riceve una campana" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2000,6 +2380,12 @@ }, "Alert GPIO vibra motor when receiving a message" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avviso GPIO del motore vibrante alla ricezione di un messaggio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2016,6 +2402,12 @@ }, "Alert when receiving a bell" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avviso di ricezione di un campanello" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2038,6 +2430,12 @@ }, "Alert when receiving a message" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avviso di ricezione di un messaggio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2060,6 +2458,12 @@ "value" : "Alle" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tutti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2082,6 +2486,12 @@ }, "All device and app data will be deleted." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tutti i dati del dispositivo e delle app verranno eliminati." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2110,6 +2520,12 @@ "value" : "Erlaubt die eingehende Gerätesteuerung über den unsicheren Legacy-Admin-Kanal." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Consentire il controllo del dispositivo in entrata attraverso il canale di amministrazione legacy non sicuro." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2126,6 +2542,12 @@ }, "Allow Position Requests" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Consentire le richieste di posizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2142,6 +2564,12 @@ }, "Alt" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alt" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2164,6 +2592,12 @@ "value" : "Höhe" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Altitudine" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2186,6 +2620,12 @@ "value" : "Höhe %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Altitudine %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2202,6 +2642,12 @@ }, "Altitude Geoidal Separation" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Altitudine Separazione geoidale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2218,6 +2664,12 @@ }, "Altitude is Mean Sea Level" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'altitudine è il livello medio del mare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2233,7 +2685,6 @@ } }, "Always On" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -2253,18 +2704,18 @@ "value" : "תמיד דלוק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sempre acceso" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Zawsze włączone" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Sempre Ligado" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2299,6 +2750,12 @@ "value" : "Immer nach Norden zeigen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Punta sempre verso nord" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2333,18 +2790,18 @@ "value" : "תאורת סביבה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Illuminazione ambientale" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Ambient Lighting" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Iluminação Ambiental" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2391,18 +2848,18 @@ "value" : "הגדרות תאורת סביבה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione dell'illuminazione ambientale" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Ambient Lighting Config" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Configuração Iluminação Ambiental" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2437,6 +2894,12 @@ "value" : "Ein quelloffenes, netzunabhängiges, dezentrales Mesh-Netzwerk, das auf kostengünstigen, stromsparenden Funkgeräten läuft." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Una rete mesh open source, off-grid, decentralizzata, che funziona con radio a basso costo e a bassa potenza." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2459,6 +2922,12 @@ }, "Any missed messages will be delivered again." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I messaggi persi saranno consegnati nuovamente." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2470,11 +2939,23 @@ "state" : "translated", "value" : "任何错过的信息都会再次发送。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "任何未送出的訊息都會重新傳送。" + } } } }, "App Data" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dati dell'applicazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2497,6 +2978,12 @@ }, "App Files" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "File dell'applicazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2519,6 +3006,12 @@ }, "App Settings" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impostazioni dell'app" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2541,6 +3034,12 @@ }, "Apple Apps" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Applicazioni Apple" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2569,6 +3068,12 @@ "value" : "Ungefährer Standort" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione approssimativa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2585,6 +3090,12 @@ }, "Are you sure you want to delete this message?" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sei sicuro di voler cancellare questo messaggio?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2613,6 +3124,12 @@ "value" : "Bist du sicher dass du den Knoten auf die Werkseinstellungen zurücksetzen willst?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Siete sicuri di voler resettare il nodo?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2653,18 +3170,18 @@ "value" : "האם אתה בטוח?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sei sicuro?" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Jesteś pewny?" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Tem a certeza?" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2692,8 +3209,13 @@ } }, "Australia / New Zealand" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Australia / Nuova Zelanda" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2710,6 +3232,12 @@ }, "Automatically toggles to the next page on the screen like a carousel, based the specified interval." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Passa automaticamente alla pagina successiva sullo schermo come un carosello, in base all'intervallo specificato." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2721,11 +3249,23 @@ "state" : "translated", "value" : "根据指定的时间间隔,像旋转木马一样自动切换到屏幕上的下一页。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "依照設定的間隔時間,自動切換至螢幕上的下一頁,類似輪播效果。" + } } } }, "Available modem presets, default is Long Fast." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preimpostazioni modem disponibili, l'impostazione predefinita è Lungo veloce." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2766,18 +3306,18 @@ "value" : "מכשירים זמינים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radio disponibili" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Dostępne radia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Rádios Disponíveis" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2812,6 +3352,12 @@ "value" : "Bandbreite" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Larghezza di banda" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2834,6 +3380,12 @@ }, "Bar" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bar" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2856,6 +3408,12 @@ }, "Bar Series" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serie Bar" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2867,11 +3425,23 @@ "state" : "translated", "value" : "Bar Series" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "長條圖系列" + } } } }, "Barometric Pressure" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pressione barometrica" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2912,18 +3482,18 @@ "value" : "רמת סוללה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Livello della batteria" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Poziom naładowania baterii" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Nível de Bataria" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -2952,6 +3522,12 @@ }, "Battery Level %" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Livello della batteria %" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2974,6 +3550,12 @@ }, "Baud" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baud" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3014,18 +3596,18 @@ "value" : "שם בלוטוס" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome BLE" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Nazwa BLE" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Nome BLE" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -3072,18 +3654,18 @@ "value" : "קוד בלוטוס חייבת להיות בת 6 ספרות." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il pin BLE deve essere composto da 6 cifre." + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Pin BLE musi mieć długość 6 cyfr." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "O Pin do BLE deve ter 6 dígitos." - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -3112,6 +3694,12 @@ }, "BLE RSSI: %lld" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "RSSI BLE: %lld" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3134,6 +3722,12 @@ }, "BLE: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "BLE: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3174,13 +3768,13 @@ "value" : "בלוטוס" } }, - "pl" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "Bluetooth" } }, - "pt-PT" : { + "pl" : { "stringUnit" : { "state" : "translated", "value" : "Bluetooth" @@ -3232,18 +3826,18 @@ "value" : "הגדרות בלוטוס" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione Bluetooth" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Konfiguracja Bluetooth" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Configuração Bluetooth" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -3290,18 +3884,18 @@ "value" : "בלוטוס כבוי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il Bluetooth è spento" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Bluetooth jest wyłączony" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Bluetooth está desligado" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -3330,6 +3924,12 @@ }, "Broadcast Interval" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo di trasmissione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3352,6 +3952,12 @@ }, "Button GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pulsante GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3374,6 +3980,12 @@ }, "Buy Complete Radios" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Acquistare radio complete" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3396,6 +4008,12 @@ }, "Buzzer GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buzzer GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3416,8 +4034,17 @@ } } }, + "By enabling this feature, you acknowledge and expressly consent to the transmission of your device’s real-time geographic location over the MQTT protocol without encryption. This location data may be used for purposes such as live map reporting, device tracking, and related telemetry functions." : { + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用此功能即表示您已知悉並明確同意,您的裝置即時地理位置將透過 MQTT 協議以未加密的方式傳輸。這些位置資料可能會用於即時地圖報告、裝置追蹤及相關的遙測功能。" + } + } + } + }, "Bytes" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -3437,18 +4064,18 @@ "value" : "בייטים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Byte" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Bajty" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Bytes" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -3477,6 +4104,12 @@ }, "Call Sign" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Segnale di chiamata" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3499,6 +4132,12 @@ }, "Call Sign must not be empty" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il nominativo non deve essere vuoto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3539,18 +4178,18 @@ "value" : "בטל" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annullamento" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Anuluj" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Cancelar" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -3597,18 +4236,18 @@ "value" : "הודעות קבועות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi in scatola" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Gotowe wiadomości" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Mensagens Enlatados" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -3655,18 +4294,18 @@ "value" : "הגדרות הודעות קבועות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione dei messaggi in scatola" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Konfiguracja gotowych wiadomości" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Configuração dos Mensagens Enlatados" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -3694,7 +4333,6 @@ } }, "canned.messages.preset.cardkb" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -3720,18 +4358,18 @@ "value" : "M5 Stack Card KB / RAK Keypad" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "M5 Stack Card KB / Tastiera RAK" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "M5 Stack Card KB / RAK Keypad" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "M5 Stack Card KB / Teclado RAK" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -3759,7 +4397,6 @@ } }, "canned.messages.preset.manual" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -3785,18 +4422,18 @@ "value" : "הגדרה ידנית" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione manuale" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja ręczna" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração Manual" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -3824,7 +4461,6 @@ } }, "canned.messages.preset.rakrotary" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -3850,18 +4486,18 @@ "value" : "RAK Rotary Encoder Module" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modulo encoder rotativo RAK" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Moduł kodera obrotowego RAK" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Module Codificador do RAK Rotary" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -3890,6 +4526,12 @@ }, "Carousel Interval" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo del carosello" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3912,6 +4554,12 @@ "value" : "Kategorien" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Categorie" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3934,6 +4582,12 @@ }, "Ch1 Current" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corrente Ch1" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3950,6 +4604,12 @@ }, "Ch1 Voltage" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tensione Ch1" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3966,6 +4626,12 @@ }, "Ch2 Current" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corrente Ch2" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3982,6 +4648,12 @@ }, "Ch2 Voltage" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tensione Ch2" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -3998,6 +4670,12 @@ }, "Ch3 Current" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corrente Ch3" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4014,6 +4692,12 @@ }, "Ch3 Voltage" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tensione Ch3" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4048,18 +4732,18 @@ "value" : "ערוץ" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale" + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Kanał" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Canal" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -4088,6 +4772,12 @@ }, "Channel 0 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 0 Incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4110,6 +4800,12 @@ }, "Channel 1" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 1" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4126,6 +4822,12 @@ }, "Channel 1 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 1 Incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4148,6 +4850,12 @@ }, "Channel 2" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 2" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4164,6 +4872,12 @@ }, "Channel 2 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 2 incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4186,6 +4900,12 @@ }, "Channel 3" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 3" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4202,6 +4922,12 @@ }, "Channel 3 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 3 incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4224,6 +4950,12 @@ }, "Channel 4 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 4 Incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4246,6 +4978,12 @@ }, "Channel 5 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 5 Incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4268,6 +5006,12 @@ }, "Channel 6 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 6 Incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4290,6 +5034,12 @@ }, "Channel 7 Included" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale 7 Incluso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4312,6 +5062,12 @@ }, "channel details" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "dettagli del canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4334,6 +5090,12 @@ }, "Channel Name" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome del canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4356,6 +5118,12 @@ }, "Channel number must be between 0 and 7." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il numero del canale deve essere compreso tra 0 e 7." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4378,6 +5146,12 @@ }, "Channel Role" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ruolo del canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4400,6 +5174,12 @@ }, "Channel URL" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "URL del canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4416,6 +5196,12 @@ }, "Channel Utilization %@%%" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizzo del canale %@%%" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -4425,7 +5211,6 @@ } }, "channel.role.disabled" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -4451,18 +5236,18 @@ "value" : "כבוי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disattivato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wyłączony" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desativado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4490,7 +5275,6 @@ } }, "channel.role.primary" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -4516,18 +5300,18 @@ "value" : "עיקרי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Primario" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Podstawowy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Primário" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4555,7 +5339,6 @@ } }, "channel.role.secondary" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -4581,18 +5364,18 @@ "value" : "משני" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Secondario" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wtórny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Secundária" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4645,18 +5428,18 @@ "value" : "שימוש ערוץ" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizzo del canale" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wykorzystanie kanału" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Utilização do Canal" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4709,18 +5492,18 @@ "value" : "ערוצים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canali" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Kanały" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canais" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4749,6 +5532,12 @@ }, "Channels being added from the QR code did not save. When adding channels the names must be unique." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I canali aggiunti dal codice QR non venivano salvati. Quando si aggiungono canali, i nomi devono essere unici." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4771,6 +5560,12 @@ }, "Chart" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Grafico" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4793,6 +5588,12 @@ }, "CHG" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "CHG" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4808,8 +5609,13 @@ } }, "China" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cina" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4826,6 +5632,12 @@ }, "Clear" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Libero" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4848,6 +5660,12 @@ }, "Clear Log" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancella registro" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4888,18 +5706,18 @@ "value" : "אפס הגדרות אפליקציה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancella i dati dell'app" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wyczyść dane aplikacji" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apagar os dados do App" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4928,6 +5746,12 @@ }, "Client" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cliente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4950,6 +5774,12 @@ }, "Client History" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Storia del cliente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4972,6 +5802,12 @@ }, "Client History Request Sent" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Richiesta di cronologia clienti inviata" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -4994,6 +5830,12 @@ }, "Client options" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni del cliente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -5016,6 +5858,12 @@ }, "Clockwise Rotary Event" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Evento rotariano in senso orario" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -5027,6 +5875,12 @@ "state" : "translated", "value" : "顺时针旋转活动" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "順時針旋轉操作" + } } } }, @@ -5056,18 +5910,18 @@ "value" : "סגור" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiudere" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zamknij" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fechar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5096,6 +5950,12 @@ }, "Coding Rate" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tasso di codifica" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -5107,6 +5967,12 @@ "state" : "translated", "value" : "编码率" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "編碼率" + } } } }, @@ -5118,6 +5984,12 @@ "value" : "Farbe" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Colore" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -5140,6 +6012,12 @@ }, "Communicating" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Comunicare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -5156,6 +6034,12 @@ }, "Community Support" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supporto alla community" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -5166,6 +6050,12 @@ }, "Config" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -5206,18 +6096,18 @@ "value" : "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quando è abilitato, il modulo PAX Counter conta il numero di persone che passano utilizzando il WiFi e il Bluetooth. Per il funzionamento del contatore PAX, sia il WiFI che il Bluetooth devono essere disattivati." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quando ativado, o módulo de Contador de PAX conta o número de pessoas que passam usando Wi-Fi e Bluetooth. Tanto o Wi-Fi quanto o Bluetooth devem estar desativados para que o contador de PAX funcione." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5264,18 +6154,18 @@ "value" : "PAX Counter" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Contatore PAX" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "PAX Counter" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contador de PAX" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5322,18 +6212,18 @@ "value" : "PAX Counter Config" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del contatore PAX" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "PAX Counter Config" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do Contador de PAX" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5380,18 +6270,18 @@ "value" : "Update Interval" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo di aggiornamento" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Update Interval" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervalo de Atualização" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5438,18 +6328,18 @@ "value" : "How often we can send a message to the mesh when people are detected." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quanto spesso possiamo inviare un messaggio alla rete quando le persone vengono rilevate." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "How often we can send a message to the mesh when people are detected." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Com que frequência podemos enviar uma mensagem para a malha quando as pessoas são detectadas." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5496,18 +6386,18 @@ "value" : "Multiplier" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Moltiplicatore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Multiplier" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Multiplicador" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5548,18 +6438,18 @@ "value" : "ADC Override" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Override ADC" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "ADC Override" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Substituir ADC" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5580,112 +6470,6 @@ } } }, - "config.power.ls.secs" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Light Sleep Interval" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Light Sleep Interval" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Light Sleep Interval" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervalo de Dormir Leve" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervall för Ljussömn" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Интервал благог спавања" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "轻度睡眠间隔" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "輕度休眠間隔" - } - } - } - }, - "config.power.min.wake.secs" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Minimum Wake Interval" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Minimum Wake Interval" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Minimum Wake Interval" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervalo Mínimo de Despertar" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Minsta Väckningsintervall" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Минимални интервал будног стања" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "最小唤醒间隔" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "最小的喚醒間隔時間" - } - } - } - }, "config.power.saving" : { "localizations" : { "de" : { @@ -5706,18 +6490,18 @@ "value" : "Power Saving" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Risparmio energetico" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Power Saving" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Poupar a Energia" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5758,18 +6542,18 @@ "value" : "Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sospenderà tutto il più possibile, per il ruolo di tracker e sensore questo includerà anche la radio lora. Non utilizzare questa impostazione se si desidera utilizzare il dispositivo con le applicazioni del telefono o se si utilizza un dispositivo senza pulsante utente." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vai por dormir o máximo possível, para o papel do rastreador e o papel do sensor isso incluirá também o rádio lora. Não use essa configuração se deseja usar seu dispositivo com os aplicativos do telefone ou está usando um dispositivo sem um botão do usuário." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5816,18 +6600,18 @@ "value" : "Battery" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Batteria" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Battery" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bataria" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5854,65 +6638,6 @@ } } }, - "config.power.section.sleep" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Schlafmodus" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sleep" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sleep" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sleep" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dormir" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sömn" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Стане спавања" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "休眠" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "休眠" - } - } - } - }, "config.power.settings" : { "localizations" : { "de" : { @@ -5933,18 +6658,18 @@ "value" : "Power" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Potenza" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Power" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Energia" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -5966,7 +6691,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "電源" + "value" : "休眠" } } } @@ -5991,18 +6716,18 @@ "value" : "After" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dopo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "After" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Após" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6018,7 +6743,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "間隔之後" + "value" : "之後" } } } @@ -6043,18 +6768,18 @@ "value" : "Shutdown on Power Loss" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spegnimento in caso di perdita di alimentazione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Shutdown on Power Loss" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desligar em caso de Perda de Energia" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6101,18 +6826,18 @@ "value" : "Power Config" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione dell'alimentazione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Power Config" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de Energia" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6139,124 +6864,6 @@ } } }, - "config.power.wait.bluetooth.secs" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth Aus nach" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth Off After" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth Off After" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth Off After" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desligar o Bluetooth Após" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth Stängs Av Efter" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Блутут се искључује након" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "蓝牙关闭 After" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "關閉藍芽" - } - } - } - }, - "config.ringtone" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Klingelton" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Ringtone" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Ringtone" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Ringtone" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toque RTTTL" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Ringsignal" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL мелодија звона" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL 铃声" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL 鈴聲" - } - } - } - }, "config.ringtone.description" : { "localizations" : { "en" : { @@ -6271,18 +6878,18 @@ "value" : "Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ringtone Transfer Language(RTTTL) Stringa di suoneria utilizzata dai cicalini supportati nelle notifiche esterne." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Idioma de Transferência de Toque (RTTTL) Sequência de Toque usada por campainhas suportadas em notificações externas." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6323,18 +6930,18 @@ "value" : "Ringtone Transfer Language" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lingua di trasferimento della suoneria" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Ringtone Transfer Language" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Idioma de Transferência de Toque" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6381,18 +6988,18 @@ "value" : "Ringtone Config" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della suoneria" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Ringtone Config" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de Toque" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6445,18 +7052,18 @@ "value" : "לאחר שמירת הגדרות המכשיר יתחיל מחדש." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dopo il salvataggio dei valori di configurazione, il nodo si riavvia." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Po zapisaniu wartości konfiguracji węzeł zostanie zrestartowany." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Após salvar os valores de configuração, o nó reiniciará" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6491,6 +7098,12 @@ "value" : "Konfiguration für: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione per: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6507,6 +7120,12 @@ }, "Configuration Presets" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preset di configurazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6535,6 +7154,12 @@ "value" : "Konfigurieren" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6551,6 +7176,12 @@ }, "Confirm" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conferma" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -6567,6 +7198,12 @@ "value" : "Verbunden mit einem Knoten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Collegarsi a un nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6581,8 +7218,24 @@ } } }, + "Connect to MQTT via Proxy" : { + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "透過Proxy連接到MQTT" + } + } + } + }, "Connect to new radio?" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Collegare alla nuova radio?" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -6617,18 +7270,18 @@ "value" : "מחובר בבלוטוס" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth collegato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Podłączony" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth Connectado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6663,6 +7316,12 @@ "value" : "Verbunden mit Knoten %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodo collegato %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6679,6 +7338,12 @@ }, "Connected Radio" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radio connessa" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -6713,18 +7378,18 @@ "value" : "מכשיר מחובר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radio connessa" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Podłączone radio" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rádio Conectado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6777,18 +7442,18 @@ "value" : "מתחבר . ." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Collegamento. ." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Łączenie . ." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Conectando . ." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6810,13 +7475,19 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "連接中..." + "value" : "連接中⋯⋯" } } } }, "Connecting to a new radio will clear all app data on the phone." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La connessione a una nuova radio cancellerà tutti i dati delle app sul telefono." + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -6833,6 +7504,12 @@ "value" : "Verbindungsversuch %lld von 10" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tentativo di connessione %lld di 10" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -6854,7 +7531,6 @@ } }, "Connection failed after %d attempts to connect to %@. You may need to forget your device under Settings > Bluetooth." : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -6880,18 +7556,18 @@ "value" : "התחברות נכשלה לאחר %d נסיונות להתחבר ל%@. יתכן ויש צורך 'לשכוח' את המכשיר בהגדרות מכשיר > בלוטוס." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Connessione fallita dopo %d tentativi di connessione a %@. Potrebbe essere necessario disaccoppiare il tuo dispositivo in Impostazioni > Bluetooth." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Połączenie nie powiodło się po %d próbach połączenia z %@. Zapomnij o urządzeniu w Ustawienia > Bluetooth." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Falha de conexão após %d tentativas de conectar a %@. Você pode precisar esquecer seu dispositivo em Configurações > Bluetooth." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -6918,73 +7594,17 @@ } } }, - "contacts" : { - "extractionState" : "manual", + "Consent to Share Unencrypted Node Data via MQTT" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontakte" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contacts" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contacts" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אנשי קשר" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontakty" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contactos" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontakter" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Контакти" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "联系人" - } - }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "聯絡人" + "value" : "同意透過 MQTT 傳輸未加密的節點資料" } } } }, "contacts %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -7010,18 +7630,18 @@ "value" : "אנשי קשר (%@)" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Contatti (%@)" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Kontakty (%@)" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contactos (%@)" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -7050,6 +7670,12 @@ }, "Control Type" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tipo di controllo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7072,6 +7698,12 @@ }, "Controls the blinking LED on the device. For most devices this will control one of the up to 4 LEDS, the charger and GPS LEDs are not controllable." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controlla il LED lampeggiante del dispositivo. Per la maggior parte dei dispositivi controlla uno dei 4 LED, mentre i LED del caricatore e del GPS non sono controllabili." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7100,6 +7732,12 @@ "value" : "Konvexe Hülle" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scafo convesso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7122,6 +7760,12 @@ "value" : "Koordinate" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Coordinare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7144,6 +7788,12 @@ "value" : "Koordinate %1$@, %2$@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Coordinate %@, %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7172,6 +7822,12 @@ "value" : "Koordinaten:" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Coordinate:" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7206,18 +7862,18 @@ "value" : "העתק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copia" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Kopiuj" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Copiar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -7252,6 +7908,12 @@ "value" : "Knoten nicht gefunden" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile trovare il nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7274,11 +7936,23 @@ }, "Counter Clockwise Rotary Event" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Evento rotativo antiorario" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Ротациони догађај у смеру супротном од казаљке на сату" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "逆時針旋轉操作" + } } } }, @@ -7290,6 +7964,12 @@ "value" : "Wegpunkt erstellen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Creare un waypoint" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7312,16 +7992,34 @@ "value" : "Erstellt: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Creato: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Креирано : %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "建立: %@" + } } } }, "Current" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attuale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7344,6 +8042,12 @@ "value" : "Aktuelle Firmware Version: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versione attuale del firmware: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7372,6 +8076,12 @@ "value" : "Aktuelle Firmware Version: %1$@, neuste Firmware Version %2$@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versione attuale del firmware: %@, Ultima versione del firmware: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7400,6 +8110,12 @@ "value" : "Aktuell: %lld" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corrente: %lld" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7416,6 +8132,12 @@ }, "Currently showing modules that may not be supported by this node." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attualmente mostra i moduli che potrebbero non essere supportati da questo nodo." + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -7426,6 +8148,12 @@ }, "Currently the recommended way to update ESP32 devices is using the web flasher on a desktop computer from a chrome based browser. It does not work on mobile devices or over BLE." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attualmente il modo consigliato per aggiornare i dispositivi ESP32 è quello di utilizzare il flasher web su un computer desktop da un browser basato su chrome. Non funziona su dispositivi mobili o tramite BLE." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7454,6 +8182,12 @@ "value" : "Datum" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Data" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7470,6 +8204,12 @@ }, "Debug" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Debug" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7498,6 +8238,12 @@ "value" : "Fehlersuchprotokolle" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registri di debug" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7514,6 +8260,12 @@ }, "Debug Logs%@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registri di debug%@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7529,7 +8281,6 @@ } }, "default" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -7555,18 +8306,18 @@ "value" : "ברירת מחדל" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predefinito" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Domyślny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Padrão" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -7601,6 +8352,12 @@ "value" : "Standard" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predefinito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7616,7 +8373,6 @@ } }, "default.128x64.screen.layout" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -7624,6 +8380,12 @@ "value" : "Default 128x64 screen layout" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Layout dello schermo 128x64 predefinito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7670,18 +8432,18 @@ "value" : "מחק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Usuń" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apagar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -7710,6 +8472,12 @@ }, "Delete all environment metrics?" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare tutte le metriche dell'ambiente?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7730,24 +8498,14 @@ } } }, - "Delete all map tiles?" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Избрисати све плочице мапе?" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "删除所有瓦片地图?" - } - } - } - }, "Delete all positions?" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare tutte le posizioni?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7764,6 +8522,12 @@ }, "Delete Message" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare il messaggio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7780,6 +8544,12 @@ }, "Delete Messages" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare i messaggi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7802,6 +8572,12 @@ "value" : "Knoten löschen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare il nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7824,6 +8600,12 @@ "value" : "Knoten löschen?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare il nodo?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7840,6 +8622,12 @@ }, "Delete Power metrics?" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare le metriche di potenza?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7856,6 +8644,12 @@ }, "Description" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Descrizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7872,6 +8666,12 @@ }, "Description must be less than 100 bytes" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La descrizione deve essere inferiore a 100 byte" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7894,6 +8694,12 @@ }, "Detection" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rilevamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7910,6 +8716,12 @@ }, "Detection event" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Evento di rilevamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7926,6 +8738,12 @@ }, "Detection Sensor Log" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro del sensore di rilevamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7942,6 +8760,12 @@ }, "Detection sensor messages are received as text messages. If you enable notifications you will recieve a notification for each detection message received and a corresponding unread message badge." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I messaggi del sensore di rilevamento vengono ricevuti come messaggi di testo. Se si attivano le notifiche, si riceverà una notifica per ogni messaggio di rilevamento ricevuto e un badge per il messaggio non letto corrispondente." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7988,18 +8812,18 @@ "value" : "חיישן זיהוי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sensore di rilevamento" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Detection Sensor" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sensor de Detecção" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8046,10 +8870,10 @@ "value" : "הגדרות חיישן זיהוי" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Configuração do Sensor de Detecção" + "value" : "Configurazione del sensore di rilevamento" } }, "se" : { @@ -8098,10 +8922,10 @@ "value" : "יומן חיישן זיהוי" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Log Sensor de Detecção" + "value" : "Registro del sensore di rilevamento" } }, "se" : { @@ -8132,6 +8956,12 @@ }, "Developers" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sviluppatori" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8178,18 +9008,18 @@ "value" : "מכשיר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Urządzenie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dispositivo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8224,6 +9054,12 @@ "value" : "Geräte-GPS" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo GPS" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8246,6 +9082,12 @@ }, "Device is managed by a mesh administrator, the user is unable to access any of the device settings." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il dispositivo è gestito da un amministratore di rete, ma l'utente non può accedere alle impostazioni del dispositivo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8268,6 +9110,12 @@ }, "Device Metrics" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metriche del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8290,6 +9138,12 @@ }, "Device Metrics Log" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro delle metriche del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8318,6 +9172,12 @@ "value" : "Gerätemodell: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modello dispositivo: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8340,6 +9200,12 @@ }, "Device Role" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ruolo del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8362,6 +9228,12 @@ }, "Device Screen" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schermata del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8408,18 +9280,18 @@ "value" : "הגדרות מכשיר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del dispositivo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja urządzenia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do Dispositivo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8466,18 +9338,18 @@ "value" : "Device Configuration" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del dispositivo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Device Configuration" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do Dispositivo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8524,18 +9396,18 @@ "value" : "נקה יומן מכשיר?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare tutte le metriche del dispositivo?" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Usunąć wszystkie metryki urządzenia?" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apagar todas as métricas do dispositivo?" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8588,18 +9460,18 @@ "value" : "יומן מכשיר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro delle metriche del dispositivo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dziennik metryk urządzenia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Log g de Métricas do Dispositivo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8627,7 +9499,6 @@ } }, "device.role.client" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -8653,18 +9524,18 @@ "value" : "אפליקציה מחוברת או מכשיר תקשורת עצמאי." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo di messaggistica collegato all'app o indipendente." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Klient (domyślnie) - Klient połączony z aplikacją." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dispositivo conectado ao App ou independente para mensagens." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8692,7 +9563,6 @@ } }, "device.role.clienthidden" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -8718,18 +9588,18 @@ "value" : "מכשיר שרק משדר לפי צורך בכדי לחסוך בחשמל או לשמור על חשאיות." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo che trasmette solo quando è necessario, per non dare nell'occhio o per risparmiare energia." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : " Used for nodes that \"only speak when spoken to\" Turns all of the routine broadcasts but allows for ad-hoc communication. Still rebroadcasts, but with local only rebroadcast mode (known meshes only). Can be used for private operation or to dramatically reduce airtime / power consumption." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dispositivo que apenas transmite conforme necessário em modo furtivo ou economia de energia." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8757,7 +9627,6 @@ } }, "device.role.clientmute" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -8783,18 +9652,18 @@ "value" : "מכשיר שאינו מעביר הודעות ממכשירים אחרים הלאה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo che non inoltra pacchetti da altri dispositivi." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wyciszenie klienta - To samo, co klient, z wyjątkiem pakietów, które nie przeskakują przez ten węzeł, nie przyczynia się do routingu pakietów dla siatki." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dispositivo que não encaminha pacotes de outros dispositivos." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8822,7 +9691,6 @@ } }, "device.role.lostandfound" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -8848,18 +9716,18 @@ "value" : "משדר מיקום כהודעה לערוץ ברירת מחדל לעיתים קבועות בכדי לסייע במציאת המכשיר." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmette regolarmente la posizione come messaggio al canale predefinito per assistere il recupero del dispositivo." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Broadcasts location as message to default channel regularly for to assist with device recovery." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Transmite a localização como mensagem para o canal padrão regularmente para auxiliar na recuperação do dispositivo." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -8887,7 +9755,6 @@ } }, "device.role.name.client" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -8901,6 +9768,12 @@ "value" : "Client" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cliente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8922,7 +9795,6 @@ } }, "device.role.name.clientHidden" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -8936,6 +9808,12 @@ "value" : "Client Hidden" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cliente Nascosto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8957,7 +9835,6 @@ } }, "device.role.name.clientMute" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -8965,6 +9842,12 @@ "value" : "Client Mute" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cliente Muto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -8986,7 +9869,6 @@ } }, "device.role.name.lostAndFound" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -9000,6 +9882,12 @@ "value" : "Lost and Found" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oggetti smarriti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9021,7 +9909,6 @@ } }, "device.role.name.repeater" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -9035,6 +9922,12 @@ "value" : "Repeater" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ripetitore" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9056,7 +9949,6 @@ } }, "device.role.name.router" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -9070,6 +9962,12 @@ "value" : "Router" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9091,7 +9989,6 @@ } }, "device.role.name.routerClient" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -9105,6 +10002,12 @@ "value" : "Router & Client" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router & Client" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9126,7 +10029,6 @@ } }, "device.role.name.routerlate" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -9140,6 +10042,12 @@ "value" : "Router Late" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router tardivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9155,7 +10063,6 @@ } }, "device.role.name.sensor" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -9169,6 +10076,12 @@ "value" : "Sensor" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sensore" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9190,7 +10103,6 @@ } }, "device.role.name.tak" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -9204,6 +10116,12 @@ "value" : "TAK" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "TAK" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9225,7 +10143,6 @@ } }, "device.role.name.takTracker" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -9239,6 +10156,12 @@ "value" : "TAK Tracker" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tracker TAK" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9260,7 +10183,6 @@ } }, "device.role.name.tracker" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -9274,6 +10196,12 @@ "value" : "Tracker" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tracker" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9295,7 +10223,6 @@ } }, "device.role.repeater" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -9321,18 +10248,18 @@ "value" : "מכשיר תשתית להרחבת המש על ידי העברת הודעות עם דאטה נוסף מינימלי." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodo infrastrutturale solo su una torre o sulla cima di una montagna. Non deve essere utilizzato per tetti o nodi mobili. Trasmette i messaggi con un overhead minimo. Non visibile nell'elenco dei nodi." + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Przekaźnik - Pakiety siatki będą preferować trasowanie przez ten węzeł. Ta rola eliminuje niepotrzebny nadmiar, taki jak NodeInfo, DeviceTelemetry i inne pakiety siatki, skutkując tym, że urządzenie nie będzie widoczne jako część sieci. Proszę zobaczyć tryb Rebroadcast dla dodatkowych ustawień specyficznych dla tej roli." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Nó de infraestrutura para ampliar a cobertura da rede transmitindo mensagens com sobrecarga mínima. Não visível na lista de Nós." - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -9360,7 +10287,6 @@ } }, "device.role.router" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -9386,18 +10312,18 @@ "value" : "מכשיר תשתית להרחבת המש על ידי העברת הודעות. מופיע ברשימת מכשירים." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodo infrastrutturale solo su una torre o sulla cima di una montagna. Non deve essere utilizzato per tetti o nodi mobili. Necessita di una copertura eccezionale. Visibile nell'elenco dei nodi." + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Router - Pakiety siatki będą preferować trasowanie przez ten węzeł. Zakłada, że urządzenie będzie działać samodzielnie, umieszczone w miejscu z przewagą zasięgu. UWAGA: Radia BLE/Wi-Fi i ekran OLED zostaną uśpione." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Nó de infraestrutura para ampliar a cobertura da rede transmitindo mensagens. Visível na lista de Nós." - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -9425,7 +10351,6 @@ } }, "device.role.routerclient" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -9451,18 +10376,18 @@ "value" : "קומבינציה של ROUTER וCLIENT. לא למכשירים ניידים." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ruolo deprecato utilizzare il client." + } + }, "pl" : { "stringUnit" : { "state" : "needs_review", "value" : "Router Client - Hybryda ról klienta i routera. Podobnie jak w przypadku routera, z tym że Router Client może być używany zarówno jako router, jak i klient połączony z aplikacją. Radia BLE/Wi-Fi i ekran OLED nie zostaną uśpione." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Combinação de ROTEADOR e CLIENTE. Não para dispositivos móveis." - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -9484,13 +10409,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "已不再使用,請選擇 CLIENT。" + "value" : "已不再使用,請選擇 Client。" } } } }, "device.role.routerlate" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -9504,6 +10428,12 @@ "value" : "Infrastructure node that always rebroadcasts packets once but only after all other modes, ensuring additional coverage for local clusters. Visible in Nodes list." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodo infrastruttura che ritrasmette sempre i pacchetti una volta, ma solo dopo tutte le altre modalità, garantendo una copertura aggiuntiva per i cluster locali. Visibile nell'elenco dei nodi." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9519,7 +10449,6 @@ } }, "device.role.sensor" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -9545,18 +10474,18 @@ "value" : "משדר טלמטריה בעדיפות גבוהה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmette i pacchetti di telemetria come priorità." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Broadcasts telemetry packets as priority." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Transmite pacotes de telemetria como prioridade." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -9584,7 +10513,6 @@ } }, "device.role.tak" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -9610,18 +10538,18 @@ "value" : "מותאם למערכת ATAK, מקטין תקשורת קבועה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ottimizzato per la comunicazione del sistema ATAK, riduce le trasmissioni di routine." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Optimized for ATAK system communication, reduces routine broadcasts." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otimizado para comunicação do sistema ATAK, reduz transmissões rotineiras." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -9649,7 +10577,6 @@ } }, "device.role.taktracker" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -9675,18 +10602,18 @@ "value" : "Enables automatic TAK PLI broadcasts and reduces routine broadcasts." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilita le trasmissioni automatiche di TAK PLI e riduce le trasmissioni di routine." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Enables automatic TAK PLI broadcasts and reduces routine broadcasts." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Permite transmissões automáticas de TAK PLI e reduz transmissões rotineiras." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -9714,7 +10641,6 @@ } }, "device.role.tracker" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -9740,18 +10666,18 @@ "value" : "משדר מיקום GPS בעדיפות גבוהה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmette i pacchetti di posizione GPS come priorità." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Tracker - Do użytku z urządzeniami przeznaczonymi jako śledzenie GPS. Pakiety pozycyjne wysyłane z tego urządzenia będą miały wyższy priorytet, z nadawaniem pozycji co dwie minuty. Inteligentna transmisja pozycji będzie domyślnie wyłączona." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Transmite pacotes de posição GPS como prioridade." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -9780,11 +10706,23 @@ }, "Dilution of precision (DOP) PDOP used by default" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diluizione della precisione (DOP) PDOP utilizzato per impostazione predefinita" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Разређење прецизности (DOP) PDOP се користи као подразумевано" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "精度稀釋(DOP),預設使用 PDOP" + } } } }, @@ -9796,6 +10734,12 @@ "value" : "Direkt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diretto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9818,6 +10762,12 @@ }, "Direct Message Help" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aiuto per i messaggi diretti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9840,6 +10790,12 @@ }, "Direct messages are using the new public key infrastructure for encryption. Requires firmware version 2.5 or greater." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I messaggi diretti utilizzano la nuova infrastruttura a chiave pubblica per la crittografia. Richiede la versione firmware 2.5 o superiore." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9862,6 +10818,12 @@ }, "Direct messages are using the shared key for the channel." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I messaggi diretti utilizzano la chiave condivisa del canale." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -9908,18 +10870,18 @@ "value" : "הודעה פרטית" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi diretti" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Bezpośrednie Wiadomości" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagens Directas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -9954,6 +10916,12 @@ "value" : "Ausgeschaltet" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disabili" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10000,18 +10968,18 @@ "value" : "התנתק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disconnessione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Rozłącz" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desconectar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10064,18 +11032,18 @@ "value" : "סגור מקלדת" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sospendere" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zamknij" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dispensar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10128,18 +11096,18 @@ "value" : "צג מכשיר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Display" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wyświetlacz (Ekran Urządzenia)" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Icrã" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10168,6 +11136,12 @@ }, "Display Fahrenheit" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Display Fahrenheit" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10190,6 +11164,12 @@ }, "Display Mode" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modalità di visualizzazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10212,6 +11192,12 @@ }, "Display Units" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unità di visualizzazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10252,18 +11238,18 @@ "value" : "הגדרות צג" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del display" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja Wyświetlacza" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do Icrãn" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10291,7 +11277,6 @@ } }, "distance" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -10317,18 +11302,18 @@ "value" : "מרחק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Distanza" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odległość" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Distância" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10363,6 +11348,12 @@ "value" : "Distanz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Distanza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10385,6 +11376,12 @@ }, "Documentation" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Documentazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10407,6 +11404,12 @@ }, "Double Tap as Button" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doppio tocco come pulsante" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10429,6 +11432,12 @@ }, "Downlink Enabled" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Downlink abilitato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10451,6 +11460,12 @@ }, "Drag & Drop Firmware Update" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornamento del firmware con il drag & drop" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10473,6 +11488,12 @@ }, "Drag & Drop Firmware Update Documentation" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Documentazione sull'aggiornamento del firmware con il drag & drop" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10495,6 +11516,12 @@ }, "Drag & Drop is the recommended way to update firmware for NRF devices. If your iPhone or iPad is USB-C it will work with your regular USB-C charging cable, for lightning devices you need the Apple Lightning to USB camera adaptor." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il Drag & Drop è il metodo consigliato per aggiornare il firmware dei dispositivi NRF. Se l'iPhone o l'iPad è USB-C funzionerà con il normale cavo di ricarica USB-C, mentre per i dispositivi lightning è necessario l'adattatore Apple Lightning to USB camera." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10517,6 +11544,12 @@ }, "Drop Pin in Maps" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spillo in Mappe" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10557,18 +11590,18 @@ "value" : "הד" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eco" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Echo" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eco" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10597,6 +11630,12 @@ }, "Editing Waypoint" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modifica di Waypoint" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10613,6 +11652,12 @@ }, "Elev. Gain" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elev. Guadagno" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10627,73 +11672,14 @@ } } }, - "email.address" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email Adresse" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email Address" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adresse mail" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "כתובת דואר אלקטרוני" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adres Email" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Endereço de Email" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-postadress" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Имејл адреса" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "邮件地址" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電子信箱" - } - } - } - }, "Emoji" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Emoji" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10716,6 +11702,12 @@ }, "Empty" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vuoto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10738,6 +11730,12 @@ }, "Enable broadcasting packets via UDP over the local network." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilita la trasmissione di pacchetti via UDP sulla rete locale." + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -10748,6 +11746,12 @@ }, "Enable Notifications" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilita le notifiche" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10770,6 +11774,12 @@ }, "Enable this device as a Store and Forward server. Requires an ESP32 device with PSRAM." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilita questo dispositivo come server Store and Forward. Richiede un dispositivo ESP32 con PSRAM." + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -10804,18 +11814,18 @@ "value" : "מופעל" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilitato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Włączony" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10844,6 +11854,12 @@ }, "Enables devices with native I2S audio output to use the RTTTL over speaker like a buzzer. T-Watch S3 and T-Deck for example have this capability." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Consente ai dispositivi con uscita audio I2S nativa di utilizzare l'RTTTL tramite altoparlante come un cicalino. T-Watch S3 e T-Deck, ad esempio, dispongono di questa funzionalità." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10855,11 +11871,23 @@ "state" : "translated", "value" : "使具有本地 I2S 音频输出的设备能够通过扬声器使用 RTTTL,就像使用蜂鸣器一样。例如,T-Watch S3 和 T-Deck 就具有这种功能。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用具備原生 I2S 音訊輸出的裝置,透過喇叭以類似蜂鳴器的方式播放 RTTTL。以 T-Watch S3 和 T-Deck 為例,它們就具備此功能。" + } } } }, "Enables the detection sensor module, it needs to be enabled on both the node with the sensor, and any nodes that you want to receive detection sensor text messages or view the detection sensor log and chart." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilita il modulo del sensore di rilevamento; deve essere abilitato sia sul nodo con il sensore, sia su tutti i nodi che si desidera ricevere messaggi di testo del sensore di rilevamento o visualizzare il registro e il grafico del sensore di rilevamento." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10892,6 +11920,12 @@ }, "Enabling Ethernet will disable the bluetooth connection to the app." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilitando l'Ethernet si disabilita la connessione bluetooth all'applicazione." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10914,6 +11948,12 @@ }, "Enabling WiFi will disable the bluetooth connection to the app." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'attivazione del WiFi disabilita la connessione bluetooth all'applicazione." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -10936,11 +11976,23 @@ }, "Encoder Press Event" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Evento di pressione dell'encoder" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Догађај притиска енкодера" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "編碼器按壓事件" + } } } }, @@ -10970,18 +12022,18 @@ "value" : "מוצפן" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crittografato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zaszyfrowany" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Encriptado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -11016,6 +12068,12 @@ "value" : "Verschlüsselt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crittografato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11038,6 +12096,12 @@ }, "Encryption Enabled" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crittografia abilitata" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11066,6 +12130,12 @@ "value" : "DFÜ-Modus aktivieren" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entrare in modalità DFU" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11088,6 +12158,12 @@ }, "environment" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "ambiente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11116,6 +12192,12 @@ "value" : "Umgebung" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ambiente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11138,6 +12220,12 @@ }, "Environment Metrics Log" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro delle metriche ambientali" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11166,6 +12254,12 @@ "value" : "Alle App-Daten löschen?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare tutti i dati delle app?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11194,6 +12288,12 @@ "value" : "Alle Geräte- und App-Daten löschen?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare tutti i dati del dispositivo e delle app?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11216,6 +12316,12 @@ }, "Error: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Errore: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11238,6 +12344,12 @@ }, "ESP 32 OTA update is a work in progress, click the button below to send your device a reboot into ota admin message." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'aggiornamento OTA di ESP 32 è in corso, fare clic sul pulsante qui sotto per inviare al dispositivo un messaggio di riavvio in amministrazione ota." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11260,6 +12372,12 @@ }, "ESP32 Device Firmware Update" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornamento del firmware del dispositivo ESP32" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11282,6 +12400,12 @@ }, "Ethernet Options" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni Ethernet" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11297,7 +12421,6 @@ } }, "European Union 433MHz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -11305,6 +12428,12 @@ "value" : "European Union 433MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unione Europea 433MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11320,7 +12449,6 @@ } }, "European Union 868MHz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -11328,6 +12456,12 @@ "value" : "European Union 868MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unione Europea 868MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11344,6 +12478,12 @@ }, "Exchange Positions" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scambio di posizioni" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11360,6 +12500,12 @@ }, "Expire" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scadenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11376,6 +12522,12 @@ }, "Expires" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scadenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11392,6 +12544,12 @@ }, "Expires: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scadenza: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11432,18 +12590,18 @@ "value" : "Export" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esportazione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Export" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Exportar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -11496,18 +12654,18 @@ "value" : "נוטיפיקציה חיצונית" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notifica esterna" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zewnętrzne Powiadomienie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notificação Externa" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -11560,18 +12718,18 @@ "value" : "הגדרות נוטיפיקציה חיצונית" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della notifica esterna" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja Zewnętrznego Powiadomienia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de Notificação Externa" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -11606,6 +12764,12 @@ "value" : "Werkseinstellungen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reset di fabbrica" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11628,6 +12792,12 @@ "value" : "Gerät und App auf Werkseinstellungen zurücksetzen?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resettare il dispositivo e l'applicazione? " + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11644,31 +12814,67 @@ }, "Failed to encode message content" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile codificare il contenuto del messaggio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Неуспело кодирање садржаја поруке" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "訊息內容編碼失敗" + } } } }, "Failed to get a valid position to exchange" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile ottenere una posizione valida per lo scambio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Добијање важеће позиције за размену није успело" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "無法取得有效的位置進行交換。" + } } } }, "Failed to get a valid position to exchange." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile ottenere una posizione valida per lo scambio." + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Добијање важеће позиције за размену није успело." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "無法取得有效的位置進行交換。" + } } } }, @@ -11680,6 +12886,12 @@ "value" : "Favorit" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preferito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11702,6 +12914,12 @@ "value" : "Favoriten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preferiti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11718,6 +12936,12 @@ }, "Favorites and nodes with recent messages show up at the top of the contact list." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I preferiti e i nodi con messaggi recenti appaiono in cima all'elenco dei contatti." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11733,7 +12957,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "已加為最愛的聯絡人與最近有訊息的節點會顯示在聯絡人清單的最上方。" + "value" : "收藏項目和最近有訊息的節點會顯示在聯絡人列表的最上方。" } } } @@ -11746,16 +12970,34 @@ "value" : "Letzte Position eines Knotens holen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Recuperare l'ultima posizione di un nodo cetaneo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Преузмите најновију позицију одређеног чвора" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "取得某個節點的最新位置" + } } } }, "Fifteen Minutes" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quindici minuti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11772,6 +13014,12 @@ }, "File Storage" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Archiviazione dei file" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11794,6 +13042,12 @@ "value" : "Kontakt suchen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trova un contatto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11816,6 +13070,12 @@ "value" : "Einen Knoten finden" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trovare un nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11856,18 +13116,18 @@ "value" : "סיים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fine" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Finish" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Terminar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -11902,6 +13162,12 @@ "value" : "Firmware" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Firmware" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11924,6 +13190,12 @@ }, "Firmware update docs" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Documentazione sull'aggiornamento del firmware" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11952,6 +13224,12 @@ "value" : "Firmwareaktualisierungen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornamenti del firmware" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -11998,18 +13276,18 @@ "value" : "גרסת קושחה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versione del firmware" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wersja Oprogramowania" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Versão do Firmware" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -12037,7 +13315,6 @@ } }, "firmware.version.unsupported" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -12063,18 +13340,18 @@ "value" : "גרסת קושחה אינה נתמכת, לא ניתן להתחבר למכשיר." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rilevata versione firmware non supportata, impossibile connettersi al dispositivo." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wykryto nieobsługiwany wersję oprogramowania, brak możliwości połączenia z urządzeniem." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Versão de Firmware não suportada detetada, impossível conectar ao dispositivo." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -12103,6 +13380,12 @@ }, "First heard" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sentito per la prima volta" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12125,6 +13408,12 @@ "value" : "Fünf Minuten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cinque minuti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12165,18 +13454,18 @@ "value" : "קוד קבוע" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "PIN fisso" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Stały PIN" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "PIN fixo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -12205,6 +13494,12 @@ }, "Fixed Position" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione fissa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12221,6 +13516,12 @@ }, "Flip Screen" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schermo ribaltabile" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12237,6 +13538,12 @@ }, "Flip screen vertically" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Capovolgere lo schermo in verticale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12253,6 +13560,12 @@ }, "For all Mqtt functionality other than the map report you must also set uplink and downlink for each channel you want to bridge over Mqtt." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per tutte le funzionalità Mqtt diverse dal rapporto sulle mappe, è necessario impostare anche l'uplink e il downlink per ogni canale che si desidera collegare tramite Mqtt." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12281,6 +13594,12 @@ "value" : "Für alle" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per tutti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12303,6 +13622,12 @@ "value" : "Für mich" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per me" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12325,6 +13650,12 @@ "value" : "Frequenz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Frequenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12341,6 +13672,12 @@ }, "Frequency Override" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Override di frequenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12357,6 +13694,12 @@ }, "Frequency Slot" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slot di frequenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12373,6 +13716,12 @@ }, "Friendly name" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome amichevole" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12395,6 +13744,12 @@ }, "Friendly name used to format message sent to mesh. Example: A name \"Motion\" would result in a message \"Motion detected\"" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome amichevole usato per formattare il messaggio inviato alla rete. Esempio: Il nome \"Movimento\" si tradurrebbe nel messaggio \"Movimento rilevato\"" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12417,6 +13772,12 @@ }, "Full Support" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supporto completo" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -12425,130 +13786,6 @@ } } }, - "gas" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gaz" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "דלק" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gaz" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Гас" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "气体" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas" - } - } - } - }, - "gas.resistance" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas Resistance" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Résistence du gaz" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas Resistance" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odporność na Gaz" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Resistência ao Gas" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gasmotstånd" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Отпорност на гас" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "气体阻抗" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gas Resistance" - } - } - } - }, "generate.qr.code" : { "localizations" : { "de" : { @@ -12575,18 +13812,18 @@ "value" : "צור קוד QR" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Generare un codice QR" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Generuj Kod QR" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerar Código QR" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -12615,6 +13852,12 @@ }, "Get custom waterproof solar and detection sensor router nodes, aluminium desktop nodes and rugged handsets." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodi router con sensori solari e di rilevamento personalizzati e impermeabili, nodi da tavolo in alluminio e portatili robusti." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12637,6 +13880,12 @@ "value" : "Knotenposition ermitteln" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ottenere la posizione del nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12659,6 +13908,12 @@ }, "Get NRF DFU from the App Store" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scarica NRF DFU dall'App Store" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12681,6 +13936,12 @@ }, "Get the latest alpha firmware" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ottenere l'ultimo firmware alfa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12703,6 +13964,12 @@ }, "Get the latest stable firmware" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ottenere l'ultimo firmware stabile" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12725,6 +13992,12 @@ }, "GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12747,6 +14020,12 @@ }, "GPIO Output Duration" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Durata dell'uscita GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12763,46 +14042,100 @@ }, "GPIO pin for rotary encoder A port." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin GPIO per la porta A dell'encoder rotativo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "GPIO пин за A порт ротационог енкодера." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "旋轉編碼器 A 埠對應的 GPIO 腳位。" + } } } }, "GPIO pin for rotary encoder B port." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin GPIO per la porta B dell'encoder rotativo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "GPIO пин за Б порт ротационог енкодера." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "旋轉編碼器 B 埠對應的 GPIO 腳位。" + } } } }, "GPIO pin for rotary encoder Press port." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin GPIO per encoder rotativo Porta di stampa." + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "GPIO пин за порт клика ротационог енкодера." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "旋轉編碼器按壓埠對應的 GPIO 腳位。" + } } } }, "GPIO Pin to monitor" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin GPIO da monitorare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "GPIO пин за надгледање" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "要監控的 GPIO 腳位" + } } } }, "GPS EN GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "GPS IT GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12814,11 +14147,23 @@ "state" : "translated", "value" : "GPS EN GPIO" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "GPS 啟用 GPIO" + } } } }, "GPS Format" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Formato GPS" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12841,6 +14186,12 @@ }, "GPS Receive GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ricezione GPS GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12863,6 +14214,12 @@ }, "GPS Transmit GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmissione GPS GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12884,7 +14241,6 @@ } }, "gpsformat.dec" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -12910,18 +14266,18 @@ "value" : "פורמט קואורדינטות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Formato dei gradi decimali" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Format Dziesiętny Stopni" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Formato de Graus Decimais" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -12949,7 +14305,6 @@ } }, "gpsformat.dms" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -12975,18 +14330,18 @@ "value" : "מעלות דקות שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gradi Minuti Secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Stopnie Minuty Sekundy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Graus Minutos Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13014,7 +14369,6 @@ } }, "gpsformat.mgrs" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13040,18 +14394,18 @@ "value" : "Military Grid Reference System" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sistema di riferimento della griglia militare" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wojskowa siatka odniesienia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sistema de Referência de Grelha Militar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13079,7 +14433,6 @@ } }, "gpsformat.olc" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13105,18 +14458,18 @@ "value" : "Open Location Code (aka Plus Codes)" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Codice di localizzazione aperto (alias Codice Plus)" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otwarty Kod Lokalizacji (tzw. Plus Kody)" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Código de Localização Aberto (também conhecido como Plus Codes)" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13144,7 +14497,6 @@ } }, "gpsformat.osgr" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13170,18 +14522,18 @@ "value" : "Ordnance Survey Grid Reference" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riferimento di griglia Ordnance Survey" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brytyjski Układ Odniesienia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Referência de Grelha da Ordnance Survey" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13209,7 +14561,6 @@ } }, "gpsformat.utm" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13235,18 +14586,18 @@ "value" : "Universal Transverse Mercator" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mercatore Universale Trasverso" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Uniwersalny Układ Transwersalny Mercatora" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Universal Transverse Mercator" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13274,7 +14625,6 @@ } }, "gpsmode.disabled" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13300,10 +14650,10 @@ "value" : "כבוי" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Desativado" + "value" : "Disabili" } }, "se" : { @@ -13333,7 +14683,6 @@ } }, "gpsmode.enabled" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13359,10 +14708,10 @@ "value" : "מופעל" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Ativado" + "value" : "Abilitato" } }, "se" : { @@ -13392,7 +14741,6 @@ } }, "gpsmode.notPresent" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -13412,10 +14760,10 @@ "value" : "לא קיים" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Não Presente" + "value" : "Non presente" } }, "se" : { @@ -13452,6 +14800,12 @@ "value" : "Gruppennachricht" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio di gruppo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13474,6 +14828,12 @@ }, "Gusts %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Raffiche %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13490,6 +14850,12 @@ }, "Hardware" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hardware" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13512,6 +14878,12 @@ }, "Heading" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intestazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13528,6 +14900,12 @@ }, "Heading: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intestazione: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13543,7 +14921,6 @@ } }, "heard" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -13569,18 +14946,18 @@ "value" : "נשמע" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ascoltato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Usłyszano" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ouvido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -13607,73 +14984,14 @@ } } }, - "heard.last" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zuletzt gehört" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Last Heard" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Capté pour la dernière fois" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "נשמע לאחרונה" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ostatnio Słyszane" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Último Ouvido" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Senast Hörd" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Прво откривање" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "最后收到" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "最後通訊" - } - } - } - }, "Help with App Development" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aiuto per lo sviluppo di app" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13696,6 +15014,12 @@ }, "Hide alerts" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nascondere gli avvisi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13712,6 +15036,12 @@ }, "Hide Alerts" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nascondi avvisi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13734,6 +15064,12 @@ "value" : "HOCH" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "ALTO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13756,21 +15092,45 @@ }, "History Return Max" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Storia Rendimento Max" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Максимални повратак историје" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "歷史返回最大值" + } } } }, "History Return Window" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Finestra di restituzione della cronologia" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Временски прозор поврата историје" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "歷史返回時間範圍\n" + } } } }, @@ -13782,6 +15142,12 @@ "value" : "Hops Entfernt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Via il luppolo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13804,6 +15170,12 @@ "value" : "Hops Entfernt %d" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Luppolo lontano %d" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13826,6 +15198,12 @@ "value" : "Hops Entfernt:" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Via il luppolo:" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13848,6 +15226,12 @@ "value" : "Hops Entfernt: %d" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Luppolo in partenza: %d" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13870,6 +15254,12 @@ "value" : "Stunde" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ora" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13892,6 +15282,12 @@ }, "Hourly Duty Cycle" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ciclo di lavoro orario" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13908,6 +15304,12 @@ }, "How long the screen remains on after the user button is pressed or messages are received." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per quanto tempo lo schermo rimane acceso dopo la pressione del tasto utente o la ricezione di messaggi." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13930,6 +15332,12 @@ }, "How often device metrics are sent out over the mesh. Default is 30 minutes." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con quale frequenza vengono inviate le metriche del dispositivo attraverso la rete. L'impostazione predefinita è 30 minuti." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13952,6 +15360,12 @@ }, "How often power metrics are sent out over the mesh. Default is 30 minutes." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con quale frequenza vengono inviate le metriche di potenza attraverso la rete. L'impostazione predefinita è 30 minuti." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13974,6 +15388,12 @@ }, "How often sensor metrics are sent out over the mesh. Default is 30 minutes." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con quale frequenza vengono inviate le metriche dei sensori sulla rete. L'impostazione predefinita è 30 minuti." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13996,6 +15416,12 @@ }, "How often should we try to get a GPS position." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con quale frequenza dobbiamo cercare di ottenere una posizione GPS." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14018,6 +15444,12 @@ }, "How often to send detection sensor state to mesh regardless of detection. Default is Never." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con quale frequenza inviare lo stato del sensore di rilevamento alla rete, indipendentemente dal rilevamento. L'impostazione predefinita è Mai." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14046,6 +15478,12 @@ "value" : "Wie wird die Firmware aktualisiert" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Come aggiornare il firmware" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14068,11 +15506,23 @@ }, "Hum" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Um" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Влажност" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "濕度" + } } } }, @@ -14084,6 +15534,12 @@ "value" : "Luftfeuchtigkeit" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Umidità" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14099,7 +15555,6 @@ } }, "hybrid" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14125,18 +15580,18 @@ "value" : "היברידי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ibrido" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Hybrydowy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Híbrido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14164,7 +15619,6 @@ } }, "hybrid.flyover" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14190,18 +15644,18 @@ "value" : "היברידי מלמעלה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Flyover ibrido" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Hybrydowy Przelot" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Híbrido o de Sobrevoo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14228,8 +15682,24 @@ } } }, + "I have read and understand the above. I voluntarily consent to the unencrypted transmission of my node data via MQTT." : { + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "我已閱讀並理解上述內容,並自願同意透過 MQTT 未加密地傳輸我的節點資料。" + } + } + } + }, "IAQ" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "IAQ" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14252,6 +15722,12 @@ }, "IAQ " : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "IAQ " + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14274,6 +15750,12 @@ }, "IAQ %lld" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "IAQ %lld" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14296,6 +15778,12 @@ }, "Icon" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Icona" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14318,6 +15806,12 @@ }, "If DOP is set, use HDOP / VDOP values instead of PDOP" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se è impostato DOP, utilizzare i valori HDOP / VDOP invece di PDOP" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14329,11 +15823,23 @@ "state" : "translated", "value" : "如果设置了 DOP,则使用 HDOP / VDOP 值而不是 PDOP" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "若已設定 DOP,則使用 HDOP / VDOP 值取代 PDOP。" + } } } }, "If enabled, the 'output' Pin will be pulled active high, disabled means active low." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se abilitato, il pin di 'uscita' sarà tirato attivo alto, mentre se disabilitato significa attivo basso." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14345,11 +15851,23 @@ "state" : "translated", "value" : "如果启用,“输出 ”引脚将被拉高,禁用则表示拉低。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "若啟用,則「輸出」腳位將被拉為高電位;若停用,則為低電位。" + } } } }, "If it is hard to access your device's reset button enter DFU mode here." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se è difficile accedere al pulsante di ripristino del dispositivo, accedere alla modalità DFU." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14372,6 +15890,12 @@ }, "If set, any packets you send will be echoed back to your device." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se è impostata, i pacchetti inviati saranno ritrasmessi al dispositivo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14383,11 +15907,23 @@ "state" : "translated", "value" : "如果设置了,您发送的任何数据包都会回传到设备。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "若啟用,您傳送的所有封包都會回傳至您的裝置。" + } } } }, "If the default region topic is too busy you can choose a more local topic." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se l'argomento predefinito della regione è troppo frequentato, è possibile scegliere un argomento più locale." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14410,6 +15946,12 @@ }, "Ignore MQTT" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ignorare MQTT" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14432,6 +15974,12 @@ }, "Ignore Node" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ignorare il nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14454,6 +16002,12 @@ }, "Ignored" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ignorato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14476,6 +16030,12 @@ }, "Import Route" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Percorso di importazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14522,18 +16082,18 @@ "value" : "כלול" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Includere" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dołącz" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Incluir" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14561,7 +16121,6 @@ } }, "incomplete" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -14587,6 +16146,12 @@ "value" : "Incomplete" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Incompleto" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -14620,7 +16185,6 @@ } }, "India" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -14628,6 +16192,12 @@ "value" : "India" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "India" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14644,6 +16214,12 @@ }, "Indoor Air Quality" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Qualità dell'aria interna" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14666,6 +16242,12 @@ }, "Indoor Air Quality (IAQ)" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Qualità dell'aria interna (IAQ)" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -14687,7 +16269,6 @@ } }, "inputevent.back" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14713,18 +16294,18 @@ "value" : "אחרוה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indietro" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wstecz" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voltar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14752,7 +16333,6 @@ } }, "inputevent.cancel" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14778,18 +16358,18 @@ "value" : "בטל" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annullamento" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Anuluj" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancelar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14817,7 +16397,6 @@ } }, "inputevent.down" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14843,18 +16422,18 @@ "value" : "למטה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In basso" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "W Dół" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Para Baixo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14882,7 +16461,6 @@ } }, "inputevent.left" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14908,18 +16486,18 @@ "value" : "שמאלה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "A sinistra" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "W Lewo" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Esquerda" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -14947,7 +16525,6 @@ } }, "inputevent.none" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -14973,18 +16550,18 @@ "value" : "ללא" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuno" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhum" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15012,7 +16589,6 @@ } }, "inputevent.right" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15038,18 +16614,18 @@ "value" : "ימינה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diritto" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "W Prawo" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Direita" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15077,7 +16653,6 @@ } }, "inputevent.select" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15103,18 +16678,18 @@ "value" : "בחר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wybierz" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecionar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15142,7 +16717,6 @@ } }, "inputevent.up" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15168,18 +16742,18 @@ "value" : "למעלה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Su" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "W Górę" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Para Cima" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15208,6 +16782,12 @@ }, "Inputs" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingressi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15229,7 +16809,6 @@ } }, "interval.eighteen.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15255,18 +16834,18 @@ "value" : "שמונה עשר שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diciotto ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Osiemnaście Godzin" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dezoito Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15293,31 +16872,7 @@ } } }, - "interval.eventytwo.hours" : { - "extractionState" : "manual", - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Двадесет и два сата" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "七十二小时" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "72 小時" - } - } - } - }, "interval.fifteen.minutes" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15343,18 +16898,18 @@ "value" : "חמש עשרה דקות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quindici minuti" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Piętnaście Minut" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quinze Minutos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15382,7 +16937,6 @@ } }, "interval.fifteen.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15408,18 +16962,18 @@ "value" : "חמש עשרה שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quindici secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Piętnaście Sekund" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quinze Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15447,7 +17001,6 @@ } }, "interval.five.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15473,18 +17026,18 @@ "value" : "חמש שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cinque ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Pięć Godzin" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cinco Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15512,7 +17065,6 @@ } }, "interval.five.minutes" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15538,18 +17090,18 @@ "value" : "חמש דקות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cinque minuti" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Pięć Minut" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cinco Minutos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15577,7 +17129,6 @@ } }, "interval.five.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15603,18 +17154,18 @@ "value" : "חמש שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cinque secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Pięć Sekund" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cinco Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15642,7 +17193,6 @@ } }, "interval.fortyeight.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15668,18 +17218,18 @@ "value" : "ארבעים ושמונה שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quarantotto ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Czterdzieści Osiem Godzin" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quarenta e Oito Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15707,7 +17257,6 @@ } }, "interval.fortyfive.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15733,18 +17282,18 @@ "value" : "ארבעים וחמש שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quarantacinque secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Czterdzieści Pięć Sekund" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quarenta e Cinco Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15772,7 +17321,6 @@ } }, "interval.four.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15798,18 +17346,18 @@ "value" : "ארבע שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quattro ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Cztery Godziny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quatro Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15837,7 +17385,6 @@ } }, "interval.four.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15863,18 +17410,18 @@ "value" : "ארבע שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quattro secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Cztery Sekundy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quatro Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15902,7 +17449,6 @@ } }, "interval.one.hour" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15928,18 +17474,18 @@ "value" : "שעה אחת" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un'ora" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Jedna Godzina" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uma Hora" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -15967,7 +17513,6 @@ } }, "interval.one.minute" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -15993,18 +17538,18 @@ "value" : "דקה אחת" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un minuto" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Jedna Minuta" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Um Minuto" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16032,7 +17577,6 @@ } }, "interval.one.second" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16058,18 +17602,18 @@ "value" : "שניה אחת" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un secondo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Jedna Sekunda" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Um Segundo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16097,7 +17641,6 @@ } }, "interval.seventytwo.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16123,18 +17666,18 @@ "value" : "שבעים ושתיים שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Settantadue ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Siedemdziesiąt Dwie Godziny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Setenta e Duas Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16162,7 +17705,6 @@ } }, "interval.six.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16188,18 +17730,18 @@ "value" : "שש שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sei ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Sześć Godzin" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seis Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16227,7 +17769,6 @@ } }, "interval.ten.minutes" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16253,18 +17794,18 @@ "value" : "עשר דקות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dieci minuti" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dziesięć Minut" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dez Minutos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16292,7 +17833,6 @@ } }, "interval.ten.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16318,18 +17858,18 @@ "value" : "עשר שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dieci secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dziesięć Sekund" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dez Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16357,7 +17897,6 @@ } }, "interval.thirty.minutes" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16383,18 +17922,18 @@ "value" : "שלושים דקות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trenta minuti" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Trzydzieści Minut" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trinta Minutos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16422,7 +17961,6 @@ } }, "interval.thirty.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16448,18 +17986,18 @@ "value" : "שלושים שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trenta secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Trzydzieści Sekund" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trinta Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16487,7 +18025,6 @@ } }, "interval.thirtysix.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16513,18 +18050,18 @@ "value" : "שלושים ושש שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trentasei ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Trzydzieści Sześć Godzin" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trinta e Seis Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16552,7 +18089,6 @@ } }, "interval.three.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16578,18 +18114,18 @@ "value" : "שלוש שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tre ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Trzy Godziny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Três Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16617,7 +18153,6 @@ } }, "interval.three.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16643,18 +18178,18 @@ "value" : "שלוש שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tre secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Trzy Sekundy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Três Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16682,7 +18217,6 @@ } }, "interval.twelve.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16708,18 +18242,18 @@ "value" : "שניים עשר שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dodici ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dwanaście Godzin" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Doze Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16746,138 +18280,7 @@ } } }, - "interval.twenty.seconds" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zwanzig Sekunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twenty Seconds" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vingt secondes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "עשרים שניות" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dwadzieścia Sekund" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vinte Segundos" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tjugo Sekunder" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Двадесет секунди" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "二十秒" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "20 秒" - } - } - } - }, - "interval.twentyfive.seconds" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fünfundzwanzig Sekunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twenty Five Seconds" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vingt cinq secondes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "עשרים וחמש שניות" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dwadzieścia Pięć Sekund" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vinte e Cinco Segundos" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tjugofem Sekunder" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Двадесет пет секунди" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "二十五秒" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "25 秒" - } - } - } - }, "interval.twentyfour.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16903,18 +18306,18 @@ "value" : "עשרים וארבע שעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ventiquattro ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dwadzieścia Cztery Godziny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vinte e Quatro Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -16942,7 +18345,6 @@ } }, "interval.two.hours" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -16968,18 +18370,18 @@ "value" : "שעתיים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Due ore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dwie Godziny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Duas Horas" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17007,7 +18409,6 @@ } }, "interval.two.minutes" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -17033,18 +18434,18 @@ "value" : "שתי דקות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Due minuti" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dwie Minuty" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dois Minutos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17072,7 +18473,6 @@ } }, "interval.two.seconds" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -17098,18 +18498,18 @@ "value" : "שתי שניות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Due secondi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dwie Sekundy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dois Segundos" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -17137,7 +18537,6 @@ } }, "inverted.top.bar.for.2.color.display" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -17145,6 +18544,12 @@ "value" : "Inverted top bar for 2 Color display" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Barra superiore invertita per la visualizzazione a 2 colori" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17166,7 +18571,6 @@ } }, "Japan" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -17174,6 +18578,12 @@ "value" : "Japan" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Giappone" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17190,6 +18600,12 @@ }, "JSON Enabled" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "JSON abilitato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17212,6 +18628,12 @@ }, "JSON mode is a limited, unencrypted MQTT output for locally integrating with home assistant" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La modalità JSON è un output MQTT limitato e non criptato per l'integrazione locale con l'assistente domestico" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17250,6 +18672,12 @@ "value" : "Schlüssel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17272,11 +18700,23 @@ }, "Key Mapping" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mappatura delle chiavi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Мапирање кључева" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "按鍵綁定" + } } } }, @@ -17288,6 +18728,12 @@ "value" : "Schlüsselgröße" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dimensione della chiave" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17302,73 +18748,7 @@ } } }, - "keyboard.type" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keyboard Typ" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keyboard Type" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Type de clavier" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "סוג מקלדת" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Typ Klawiatury" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo de Teclado" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tangentbordstyp" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Тип тастатуре" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "键盘类型" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "鍵盤類型" - } - } - } - }, "Korea" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -17376,6 +18756,12 @@ "value" : "Korea" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corea" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17398,6 +18784,12 @@ "value" : "Zuletzt gehört" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'ultima volta che si è sentito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17426,6 +18818,12 @@ "value" : "Breitengrad" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Latitudine" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17448,6 +18846,12 @@ }, "LED Heartbeat" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Battito cardiaco a LED" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17470,6 +18874,12 @@ }, "LED State" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stato del LED" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17498,6 +18908,12 @@ "value" : "Alte Administrationsart" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amministrazione del patrimonio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17514,6 +18930,12 @@ }, "Licensed Operator" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Operatore con licenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17536,6 +18958,12 @@ }, "Limit all periodic broadcast intervals especially telemetry and position. If you need to increase hops, do it on nodes at the edges, not the ones in the middle. MQTT is not advised when you are duty cycle restricted because the gateway node is then doing all the work." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Limitare tutti gli intervalli di trasmissione periodica, in particolare la telemetria e la posizione. Se è necessario aumentare gli hop, farlo sui nodi ai margini, non su quelli al centro. MQTT è sconsigliato quando il ciclo di lavoro è limitato, perché è il nodo gateway a svolgere tutto il lavoro." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17558,16 +18986,34 @@ }, "Line Series" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serie di linee" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Линијска серија" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "折線圖系列" + } } } }, "Loading Logs. . ." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Caricamento dei log. . ." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17596,6 +19042,12 @@ "value" : "Standort" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17624,6 +19076,12 @@ "value" : "Standrot:" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione:" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17652,6 +19110,12 @@ "value" : "Gesperrt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bloccato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17674,6 +19138,12 @@ }, "Log Levels" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Livelli del registro" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -17685,6 +19155,12 @@ "state" : "translated", "value" : "日志等级" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "日誌等級" + } } } }, @@ -17714,6 +19190,12 @@ "value" : "Category" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Categoria" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -17772,6 +19254,12 @@ "value" : "Level" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Livello" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -17830,6 +19318,12 @@ "value" : "Message" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -17863,7 +19357,6 @@ } }, "log.process" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -17889,6 +19382,12 @@ "value" : "Process" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Processo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -17922,7 +19421,6 @@ } }, "log.subsystem" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -17948,6 +19446,12 @@ "value" : "Subsystem" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sottosistema" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -18006,6 +19510,12 @@ "value" : "Time" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", @@ -18064,18 +19574,18 @@ "value" : "רישום" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registrazione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Rejestracja" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Registo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18097,13 +19607,19 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "紀錄" + "value" : "Logging" } } } }, "Logs" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registri" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18126,6 +19642,12 @@ }, "Logs:" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registri:" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18154,6 +19676,12 @@ "value" : "Langer Name" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome lungo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18182,6 +19710,12 @@ "value" : "Langer Name: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome lungo: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18204,6 +19738,12 @@ }, "Long press to favorite or mute the contact or delete a conversation." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Premere a lungo per privilegiare o silenziare il contatto o eliminare una conversazione." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18225,7 +19765,6 @@ } }, "long.range.fast" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -18233,6 +19772,12 @@ "value" : "Long Range - Fast" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "A lungo raggio - Veloce" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18248,7 +19793,6 @@ } }, "long.range.moderate" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -18256,6 +19800,12 @@ "value" : "Long Range - Moderate" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lungo raggio - Moderato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18271,7 +19821,6 @@ } }, "long.range.slow" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -18279,6 +19828,12 @@ "value" : "Long Range - Slow" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lungo raggio - Lento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18301,6 +19856,12 @@ "value" : "Längengrad" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Longitudine" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18347,13 +19908,13 @@ "value" : "לורה" } }, - "pl" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "LoRa" } }, - "pt-PT" : { + "pl" : { "stringUnit" : { "state" : "translated", "value" : "LoRa" @@ -18411,18 +19972,18 @@ "value" : "הגדרות לורה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione LoRa" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja LoRa" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração LoRa" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18450,7 +20011,6 @@ } }, "lora.signal.strength.bad" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -18464,6 +20024,12 @@ "value" : "Bad" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pessimo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18479,7 +20045,6 @@ } }, "lora.signal.strength.fair" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -18493,6 +20058,12 @@ "value" : "Fair" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiera" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18508,7 +20079,6 @@ } }, "lora.signal.strength.good" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -18522,6 +20092,12 @@ "value" : "Good" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buono" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18537,7 +20113,6 @@ } }, "lora.signal.strength.none" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -18551,6 +20126,12 @@ "value" : "None" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuno" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18567,6 +20148,12 @@ }, "LOW" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "BASSO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18582,7 +20169,6 @@ } }, "Malaysia 433mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -18590,6 +20176,12 @@ "value" : "Malaysia 433MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Malesia 433MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18605,7 +20197,6 @@ } }, "Malaysia 919mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -18613,6 +20204,12 @@ "value" : "Malaysia 919MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Malesia 919MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18629,6 +20226,12 @@ }, "Managed Device" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo gestito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18675,18 +20278,18 @@ "value" : "מפת מש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mappa della mesh" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Mapa Sieci" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mapa do Mesh" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -18721,6 +20324,12 @@ "value" : "Kartenoptionen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni mappa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18743,6 +20352,12 @@ }, "Map Publish Interval" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo di pubblicazione della mappa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18754,11 +20369,23 @@ "state" : "translated", "value" : "地图发布间隔" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "地圖回報間隔" + } } } }, "Map Report" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rapporto sulla mappa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -18779,337 +20406,7 @@ } } }, - "Map Tile Data" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подаци плочица мапе" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "瓦片地图数据" - } - } - } - }, - "map.centering" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Centering Mode" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mode centré" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מכשיר במרכז" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tryb Wyśrodkowania" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modo de Centralização" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Centreringsläge" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Режим центрирања" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "居中" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "置中" - } - } - } - }, - "map.tiles.delete" : { - "extractionState" : "migrated", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete All Map Tiles" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Supprimer toutes les tuiles de carte" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מחק כל חלקי מפה שמורים" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Usuń Wszystkie Kafle Mapy" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apagar Todas as Imagens da Mapa" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Radera Alla Kartplattor" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Обриши све плочице мапе" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "删除所有瓦片地图" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "刪除已緩存的地圖區塊" - } - } - } - }, - "map.type" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kartentyp" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Default Type" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Type par défaut" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "סוג ברירת מחדל" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Domyślny Typ" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo Padrão" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Standardtyp" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подразумевани тип" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "地图类型" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "地圖類型" - } - } - } - }, - "map.use.legacy" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Use Legacy Mesh Map" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Use Legacy Mesh Map" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Utiliser l'ancienne génération de carte de maillage" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "השתמש במפה מדור קודם" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Use Legacy Mesh Map" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Utilizar Mapa do Mesh Antigo" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Använd Äldre Mesh Karta" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Користите легаси мрежну мапу" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "使用传统网状地图" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "使用傳統Mesh地圖" - } - } - } - }, - "map.usertrackingmode" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "User tracking mode" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "User tracking mode" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mode suivre l'utilisateur" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מצב מעקב אחר משתמש" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tryb śledzenia użytkownika" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modo de Rastreamento do Utilizador" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Spårningsläge för användare" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Мод праћења корисника" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "用户跟随模式" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "使用者跟隨模式" - } - } - } - }, "map.usertrackingmode.follow" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -19135,18 +20432,18 @@ "value" : "עקוב" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seguire" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Śledź" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seguir" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19168,13 +20465,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "跟隨" + "value" : "置中" } } } }, "map.usertrackingmode.followwithheading" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -19200,18 +20496,18 @@ "value" : "עקוב עם כיוון" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seguire con l'intestazione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Śledź z kierunkiem" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seguir com Direção" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19239,7 +20535,6 @@ } }, "map.usertrackingmode.none" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -19265,18 +20560,18 @@ "value" : "ללא" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuno" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhum" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19304,7 +20599,6 @@ } }, "medium.range.fast" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -19312,6 +20606,12 @@ "value" : "Medium Range - Fast" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medio raggio - Veloce" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -19327,7 +20627,6 @@ } }, "medium.range.slow" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -19335,6 +20634,12 @@ "value" : "Medium Range - Slow" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medio raggio - Lento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -19351,11 +20656,23 @@ }, "Mesh activity update" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornamento dell'attività di rete" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Ажурирање активности мреже" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mesh 活動更新" + } } } }, @@ -19385,18 +20702,18 @@ "value" : "פעילות מש חיה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rete Attività live" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Aktywność na Żywo" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Atividade Ao Vivo do Mesh" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19424,7 +20741,6 @@ } }, "mesh.log.ambientlighting.config %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -19444,18 +20760,18 @@ "value" : "הגדרות מודולת תאורת סביבה התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo di illuminazione ambientale ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Ambient Lighting module config received: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo de Iluminação Ambiente recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19483,7 +20799,6 @@ } }, "mesh.log.bluetooth.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -19509,18 +20824,18 @@ "value" : "הגדרות בלוטוס התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione Bluetooth ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano konfigurację Bluetooth: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração Bluetooth recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19548,7 +20863,6 @@ } }, "mesh.log.cannedmessage.config %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -19568,18 +20882,18 @@ "value" : "הגדרות מודולת תגובות שמורות התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo Canned Message ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano konfigurację modułu wiadomości gotowych: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo de Mensagens Padrão recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19607,7 +20921,6 @@ } }, "mesh.log.cannedmessages.messages.get %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -19627,18 +20940,18 @@ "value" : "התבקשו הודעות מודולת הודעות שמורות עבור מכשיר: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi in scatola richiesti Messaggi del modulo per il nodo: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zażądano Wiadomości z Modułu Wiadomości Gotowych dla węzła: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagens Padrão solicitadas para o módulo de mensagens para o nó: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19666,7 +20979,6 @@ } }, "mesh.log.cannedmessages.messages.received %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -19686,18 +20998,18 @@ "value" : "הודעות עבור הודעות שמורות התקבלו מ-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi in scatola Messaggi ricevuti per: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano Wiadomości Gotowe Dla: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagens Padrão recebidas para: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19725,7 +21037,6 @@ } }, "mesh.log.channel.sent %@ %d" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -19745,18 +21056,18 @@ "value" : "נשלח ערוץ עבור: %@ אינדקס ערוצים %d" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato un canale per: %@ Canale Indice %d" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wysłano kanał dla: %@ Indeks kanału %d" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Um Canal Enviado para: %@ Índice do Canal %d" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19784,7 +21095,6 @@ } }, "mesh.log.detectionsensor.config %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -19804,18 +21114,18 @@ "value" : "הגדרות מודולת חיישן זיהוי התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo sensore di rilevamento ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Detection Sensor module config received: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo de sensor de detecção recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19837,13 +21147,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到偵測感應器模組設定:%@" + "value" : "Detection Sensor module config received: %@" } } } }, "mesh.log.device.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -19869,18 +21178,18 @@ "value" : "הגדרות מכשיר התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione dispositivo ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano konfigurację urządzenia: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do dispositivo recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19902,13 +21211,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到裝置設定: %@" + "value" : "Device config received: %@" } } } }, "mesh.log.device.metadata.received %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -19934,18 +21242,18 @@ "value" : "מטא-דאטה של מכשיר התקבל מ-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metadati del dispositivo ricevuti da: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano metadane urządzenia od: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Os Metadados do dispositivo recebidos de: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -19967,78 +21275,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "從 %@ 收到設備元數據管理消息" - } - } - } - }, - "mesh.log.devicemetadata %@" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anforderung der Geräte Metadaten für %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requesting Device Metadata for %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Demande des metadatas de l'appareil à %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מבקש מטא-דאטה עבור %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Żądanie metadanych urządzenia dla %@" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Solicitando os Metadados do Dispositivo para %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Begär metadata för enhet för %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Захтевање метаподатака уређаја за %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requesting Device Metadata for %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "請求設備元數據:%@" + "value" : "Device Metadata received from: %@" } } } }, "mesh.log.display.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20064,18 +21306,18 @@ "value" : "הגדרות תצוגה התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Visualizzazione della configurazione ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano konfigurację wyświetlacza: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do icrãn recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20097,13 +21339,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到顯示模組設定: %@" + "value" : "Display config received: %@" } } } }, "mesh.log.externalnotification.config %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -20123,18 +21364,18 @@ "value" : "הגדרות מודולת נוטיפיקציה חיצונית התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo di notifica esterno ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano konfigurację modułu zewnętrznych powiadomień: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo de notificação externa recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20156,13 +21397,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到外部通知模組設定:%@" + "value" : "External Notification module config received: %@" } } } }, "mesh.log.lora.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20188,18 +21428,18 @@ "value" : "הגדרות לורה התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione LoRa ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano konfigurację LoRa: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração LoRa recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20221,13 +21461,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到LoRa設定: %@" + "value" : "LoRa config received: %@" } } } }, "mesh.log.lora.config.sent %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20253,18 +21492,18 @@ "value" : "נשלחו הגדרות לורה עבור: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato un LoRa.Config per: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wysłano konfigurację LoRa dla: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do LoRa Enviado para: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20286,13 +21525,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "發送LoRa設定給:%@" + "value" : "Sent a LoRa.Config for: %@" } } } }, "mesh.log.mqtt.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20318,18 +21556,18 @@ "value" : "הגדרות מודולת MQTT התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo MQTT ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano konfigurację modułu MQTT: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo MQTT recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20351,13 +21589,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到MQTT模組設定:%@" + "value" : "MQTT module config received: %@" } } } }, "mesh.log.myinfo %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20383,18 +21620,18 @@ "value" : "MyInfo התקבל: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "MyInfo ricevuto: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano Moje Informacje: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "MyInfo recebido: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20416,13 +21653,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到我的資訊:%@" + "value" : "MyInfo received: %@" } } } }, "mesh.log.network.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20448,18 +21684,18 @@ "value" : "הגדרות רשת התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione di rete ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano konfigurację sieci: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de rede recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20481,13 +21717,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到網路設定: %@" + "value" : "Network config received: %@" } } } }, "mesh.log.nodeinfo.received %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20513,18 +21748,18 @@ "value" : "מידע אודות מכשיר התקבל: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ricevute informazioni sul nodo per: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano informacje o węźle dla: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informações do nó recebidas para: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20546,13 +21781,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到節點資訊: %@" + "value" : "Node info received for: %@" } } } }, "mesh.log.paxcounter %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20572,18 +21806,18 @@ "value" : "PAX Counter packet received for: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio del contatore PAX ricevuto da: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "PAX Counter packet received for: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagem do Contador PAX recebida de: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20605,13 +21839,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "為 %@ 收到PAX計數器消息" + "value" : "PAX Counter message received from: %@" } } } }, "mesh.log.paxcounter.config %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -20619,10 +21852,10 @@ "value" : "PAX Counter config received: %@" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Configuração do Contador PAX recebida: %@" + "value" : "Configurazione del contatore PAX ricevuta: %@" } }, "se" : { @@ -20646,7 +21879,6 @@ } }, "mesh.log.position.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20672,18 +21904,18 @@ "value" : "הגדרות מיקום התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della posizione ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano konfigurację pozycji: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de posição recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20705,13 +21937,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到位置設定:%@" + "value" : "Positon config received: %@" } } } }, "mesh.log.position.received %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20737,18 +21968,18 @@ "value" : "הודעת מיקום התקבלו מ-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione Pacchetto ricevuto dal nodo: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano pakiet pozycji od węzła: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pacote de posição recebido do nó: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20770,13 +22001,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "從節點接收到定位封包: %@" + "value" : "Position Packet received from node: %@" } } } }, "mesh.log.power.config %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -20784,10 +22014,10 @@ "value" : "Power config received: %@" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Configuração de energia recebida: %@" + "value" : "Configurazione dell'alimentazione ricevuta: %@" } }, "se" : { @@ -20811,7 +22041,6 @@ } }, "mesh.log.rangetest.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20837,18 +22066,18 @@ "value" : "הגדרות מודולת בדיקת טווח התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo Range Test ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano konfigurację modułu testu zasięgu: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo de teste de alcance recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20870,13 +22099,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到拉距測試模組設定: %@" + "value" : "Range Test module config received: %@" } } } }, "mesh.log.ringtone.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20902,18 +22130,18 @@ "value" : "הגדרות RTTTL רינגטון התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "RTTTL Configurazione suoneria ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano konfigurację dzwonka RTTTL: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de toque RTTTL recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -20935,13 +22163,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到RTTTL鈴聲設定:%@" + "value" : "RTTTL Ringtone config received: %@" } } } }, "mesh.log.routing.message %@ %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -20967,18 +22194,18 @@ "value" : "התקבל מסלול עבור בקשה: %@ מצב שליחה: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Routing ricevuto per RequestID: %@ Ack Status: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano trasowanie dla RequestID: %@ Ack Status: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Roteamento recebido para RequestID: %@ Estado de Ack: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21000,13 +22227,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "為請求ID: %@ 收到路由 Ack狀態: %@" + "value" : "Routing received for RequestID: %@ Ack Status: %@" } } } }, "mesh.log.serial.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21032,18 +22258,18 @@ "value" : "הגדרות מודולת תקשורת סיריאלית התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione modulo seriale ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano konfigurację modułu szeregowego: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo serial recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21065,13 +22291,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到序列模組設定:%@" + "value" : "Serial module config received: %@" } } } }, "mesh.log.sharelocation %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21097,18 +22322,18 @@ "value" : "נשלח מיקום ממכשיר האפל למכשיר המשטסטיק: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato un pacchetto di posizione dal GPS del dispositivo Apple al nodo: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wysłano pakiet pozycji z GPS urządzenia Apple do węzła: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enviado um Pacote de Posição do GPS do dispositivo Apple para o nó: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21130,13 +22355,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "傳送iOS裝置的GPS定位封包到節點上: %@" + "value" : "Sent a Position Packet from the Apple device GPS to node: %@" } } } }, "mesh.log.storeforward.config %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -21156,18 +22380,18 @@ "value" : "הגדרות מודולת שמירה ושליחה התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo Store & Forward ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Store & Forward module config received: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo Store & Forward recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21189,13 +22413,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到儲存與轉發模組設定:%@" + "value" : "Store & Forward module config received: %@" } } } }, "mesh.log.telemetry.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21221,18 +22444,18 @@ "value" : "הגדרות מודולת טלמטריה התקבלו: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo di telemetria ricevuta: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano konfigurację modułu telemetrii: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do módulo de telemetria recebida: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21254,13 +22477,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到遙測模組設定: %@" + "value" : "Telemetry module config received: %@" } } } }, "mesh.log.telemetry.received %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21286,18 +22508,18 @@ "value" : "התקבל טלמטריה עבור: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telemetria ricevuta per: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Telemetria odebrana dla: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetria recebida para: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21319,13 +22541,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "收到遙測指標: %@" + "value" : "Telemetry received for: %@" } } } }, "mesh.log.textmessage.received" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21351,18 +22572,18 @@ "value" : "הודעת טקסט התקבלה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio ricevuto dall'app messaggi di testo." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wiadomość odebrana z aplikacji do wysyłania wiadomości tekstowych." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagem recebida do App de mensagem de texto." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21384,13 +22605,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "從文字消息應用程序收到消息。" + "value" : "Message received from the text message app." } } } }, "mesh.log.textmessage.send.failed %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21416,18 +22636,18 @@ "value" : "שליחת הודעה נכשלה, אין חיבוריות ל-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invio messaggio fallito, connessione non corretta a %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Nieudane wysłanie wiadomości, brak prawidłowego połączenia z %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Falha no envio da mensagem, não conectado corretamente a %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21449,13 +22669,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "訊息傳送失敗, 沒有正確連接到 %@" + "value" : "Message Send Failed, not properly connected to %@" } } } }, "mesh.log.textmessage.sent %@ %@ %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21481,18 +22700,18 @@ "value" : "נשלחה הודעה %@ מ-%@ ל-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato messaggio %@ da %@ a %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wysłano wiadomość %@ od %@ do %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagem enviada %@ de %@ para %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21514,78 +22733,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "傳送訊息 %@ 從 %@ 到 %@" - } - } - } - }, - "mesh.log.traceroute.received.direct %@" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Traceroute Anforderung an Knoten gesendet: %@ wurde direkt empfangen." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trace Route request sent to node: %@ was recieived directly." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La demande de Trace Route envoyée au noeud : %@ a été directement reçue." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "בקשת בדיקת מסלול נשלחה למכשיר: %@ התקבל ישירות." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Żądanie śledzenia trasy wysłane do węzła: %@ zostało odebrane bezpośrednio." - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Solicitação de Rastreamento enviada para o nó: %@\" foi recebida diretamente." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Spårruttförfrågan skickad till nod: %@ mottogs direkt." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Захтев за тражење путања послат на чвор: %@ је примљен директно." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trace Route request sent to node: %@ was recieived directly." - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "直接收到發送至節點的追蹤路由請求:%@" + "value" : "Sent message %@ from %@ to %@" } } } }, "mesh.log.traceroute.received.route %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21611,18 +22764,18 @@ "value" : "בקשת בדיקת מסלול הצליחה: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Traccia Richiesta di rotta restituita: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Żądanie śledzenia trasy zwrócone: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Solicitação de Rastreamento retornada: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21644,13 +22797,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "返回的追蹤路由請求:%@" + "value" : "Trace Route request returned: %@" } } } }, "mesh.log.traceroute.sent %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21676,18 +22828,18 @@ "value" : "נשלחה בקשת בדיקת מסלול למכשיר: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ha inviato una richiesta di tracciamento della rotta al nodo: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wysłano żądanie śledzenia trasy do węzła: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enviei uma solicitação de Rastreamento para o nó: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21709,13 +22861,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "發送追蹤路由請求至節點:%@" + "value" : "Sent a Trace Route Request to node: %@" } } } }, "mesh.log.wantconfig %@" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -21735,18 +22886,18 @@ "value" : "שולח בקשת הגדרות ל-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Emissione di Want Config a %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wydawanie Want Config to %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Emitindo Configuração Desejada para %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21768,13 +22919,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "已發送設定請求至 %@" + "value" : "Issuing Want Config to %@" } } } }, "mesh.log.waypoint.received %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21800,18 +22950,18 @@ "value" : "נקודת ציון התקבלה מ-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pacchetto Waypoint ricevuto dal nodo: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano pakiet punktu orientacyjnego od węzła: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pacote de Ponto de Referência recebido do nó: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21833,13 +22983,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "從節點收到路徑點封包:%@" + "value" : "Waypoint Packet received from node: %@" } } } }, "mesh.log.waypoint.sent %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -21865,18 +23014,18 @@ "value" : "נשלחה נקודת ציון מ-%@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato un pacchetto Waypoint da: %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wysłano pakiet punktu orientacyjnego z: %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enviado um Pacote de Ponto de Referência de: %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -21898,7 +23047,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "從 %@ 發送路徑點封包" + "value" : "Sent a Waypoint Packet from: %@" } } } @@ -21911,6 +23060,12 @@ "value" : "Meshtastic Knoten %@ hat Kanäle mit dir geteilt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il Nodo Meshtastic %@ ha condiviso i canali con voi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21927,11 +23082,23 @@ }, "Meshtastic® Copyright Meshtastic LLC" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meshtastic® Copyright Meshtastic LLC" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Meshtastic® Ауторска права Meshtastic LLC" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meshtastic® Copyright Meshtastic LLC" + } } } }, @@ -21961,18 +23128,18 @@ "value" : "הודעה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wiadomość" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagem" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22007,11 +23174,23 @@ "value" : "Nachricht" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Порука" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "訊息" + } } } }, @@ -22023,16 +23202,34 @@ "value" : "Nachrichteninhalt überschreitet 200 Bytes." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il contenuto del messaggio supera i 200 byte." + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Садржај поруке премашује 200 бајтова." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "訊息內容超過 200 位元組。" + } } } }, "Message Status Options" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni di stato del messaggio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22073,18 +23270,18 @@ "value" : "פרטי הודעה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dettagli del messaggio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Szczegóły wiadomości" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dados de Mensagem" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22137,18 +23334,18 @@ "value" : "הודעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wiadomości" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagens" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22183,6 +23380,12 @@ "value" : "Nachrichten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22205,6 +23408,12 @@ "value" : "Nachrichten getrennt mit |" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I messaggi sono separati da |" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22221,6 +23430,12 @@ }, "Metric" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metrico" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22243,6 +23458,12 @@ "value" : "Minimum Distanz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Distanza minima" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22265,6 +23486,12 @@ "value" : "Minimum Intervall" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo minimo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22281,21 +23508,45 @@ }, "Minimum time between detection broadcasts" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempo minimo tra le trasmissioni di rilevamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Минимално време између емитовања детекције" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "偵測廣播之間的最短時間間隔" + } } } }, "Mininum time between detection broadcasts. Default is 45 seconds." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempo minimo tra le trasmissioni di rilevamento. L'impostazione predefinita è 45 secondi." + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Минимално време између емитовања детекције. Подразумевано је 45 секунди." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "偵測廣播之間的最短時間間隔,預設為 45 秒。" + } } } }, @@ -22325,18 +23576,18 @@ "value" : "מצב" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modalità" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Tryb" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22365,6 +23616,12 @@ }, "Model" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modello" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22411,18 +23668,18 @@ "value" : "הגדרות מודולה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja modułu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do Módulo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22444,7 +23701,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "模塊設定" + "value" : "模組設定" } } } @@ -22475,13 +23732,13 @@ "value" : "MQTT" } }, - "pl" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "MQTT" } }, - "pt-PT" : { + "pl" : { "stringUnit" : { "state" : "translated", "value" : "MQTT" @@ -22515,6 +23772,12 @@ }, "MQTT" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "MQTT" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22561,18 +23824,18 @@ "value" : "MQTT Client Proxy" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Proxy client MQTT" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Klient Proxy MQTT" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proxy do Cliente MQTT" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22625,18 +23888,18 @@ "value" : "הגדרות MQTT" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione MQTT" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja MQTT" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração MQTT" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22665,6 +23928,12 @@ }, "Must be a single emoji" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deve essere una singola emoji" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22681,11 +23950,23 @@ }, "Nag timeout" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Timeout di Nag" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Период чекања је истекао" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "提醒逾時" + } } } }, @@ -22715,18 +23996,18 @@ "value" : "שם" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Nazwa" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22761,6 +24042,12 @@ "value" : "Name" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22789,6 +24076,12 @@ "value" : "Name muss kürzer als 30 Bytes sein" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il nome deve essere inferiore a 30 byte" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22811,6 +24104,12 @@ }, "Navigate to node" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spostarsi sul nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22827,6 +24126,12 @@ }, "Nearby Topics" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Argomenti vicini" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22867,18 +24172,18 @@ "value" : "רשת" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rete" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Sieć" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rede" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -22907,6 +24212,12 @@ }, "Network Status Orange" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stato della rete Arancione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22929,6 +24240,12 @@ }, "Network Status Red" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stato della rete Rosso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22975,18 +24292,18 @@ "value" : "הגדרות רשת" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della rete" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja sieci" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de Rede" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -23021,6 +24338,12 @@ "value" : "Nie" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mai" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23036,8 +24359,13 @@ } }, "New Node" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nuovo nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23053,8 +24381,13 @@ } }, "New Node has been discovered" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È stato scoperto un nuovo nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23069,73 +24402,7 @@ } } }, - "New Node Notifications" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mitteilungen über neue Knoten" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "New Node Notifications" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "New Node Notifications" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "New Node Notifications" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "New Node Notifications" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notificações de Nó Novo" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "New Node Notifications" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Обавештења о новим чворовима" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "新节点通知" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "新節點通知" - } - } - } - }, "New Zealand 865mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -23143,6 +24410,12 @@ "value" : "New Zealand 865MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nuova Zelanda 865MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23165,6 +24438,12 @@ "value" : "Neuere Firmware ist verfügbar" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È disponibile un firmware più recente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23193,6 +24472,12 @@ "value" : "Kein verbundener Knoten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun nodo collegato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23209,6 +24494,12 @@ }, "No Device Metrics" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuna metrica del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23218,13 +24509,19 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "沒有裝置指標" + "value" : "沒有已連接的節點" } } } }, "No Environment Metrics" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuna metrica ambientale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23246,7 +24543,6 @@ } }, "No PIN (Just Works)" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -23272,18 +24568,18 @@ "value" : "ללא קוד (פשוט עובד)" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun PIN (funziona e basta)" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak PINu (po prostu działa)" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem PIN (Simplesmente Funciona)" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -23318,6 +24614,12 @@ "value" : "Keine Positionen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuna posizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23334,6 +24636,12 @@ }, "No Power Metrics" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuna metrica di potenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23348,71 +24656,6 @@ } } }, - "no.nodes" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Meshtastic Knoten gefunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No Meshtastic Nodes Found" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucun noeud Meshtastic trouvé" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "לא נמצאו מכשירי משטסטיק" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nie znaleziono węzłów Meshtastic" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhum Nó Meshtastic Encontrado" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inga Meshtastic-noder hittades" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Нема пронађених Мештастик чворова" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "未找到 Meshtastic 节点" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "未找到 Meshtastic 節點" - } - } - } - }, "Node" : { "localizations" : { "de" : { @@ -23421,6 +24664,12 @@ "value" : "Knoten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23439,10 +24688,16 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", "value" : "Node Core Data Backup %1$@/%2$@ - %3$@ - %4$@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Backup dei dati del nucleo del nodo %1$@/%2$@ - %3$@ - %4$@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23471,6 +24726,12 @@ "value" : "Knoten hat keine Position" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il nodo non ha posizioni" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23493,6 +24754,12 @@ "value" : "Knoten Historie" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Storia del nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23509,6 +24776,12 @@ }, "Node Info Broadcast Interval" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo di trasmissione delle informazioni sul nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23531,6 +24804,12 @@ "value" : "Knotenkarte" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mappa dei nodi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23553,6 +24832,12 @@ "value" : "Knotennummer" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Numero di nodo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23568,7 +24853,6 @@ } }, "nodelist.filter.distance %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -23594,18 +24878,18 @@ "value" : "up to %@ away" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "fino a %@ di distanza" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "up to %@ away" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "até %@ de distância" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -23658,10 +24942,10 @@ "value" : "מכשירים" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Nós" + "value" : "Nodi" } }, "se" : { @@ -23691,7 +24975,6 @@ } }, "nodes %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -23717,18 +25000,18 @@ "value" : "מכשירים (%@)" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodi (%@)" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Węzły (%@)" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nós (%@)" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -23757,6 +25040,12 @@ }, "Not a valid route file" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non è un file di percorso valido" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23797,18 +25086,18 @@ "value" : "אין מכשיר מחובר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun dispositivo collegato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak podłączonych urządzeń" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhum dispositivo conectado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -23843,6 +25132,12 @@ "value" : "Knoten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Note" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23865,6 +25160,12 @@ "value" : "Anzahl: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Num: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23887,6 +25188,12 @@ "value" : "Anzahl Hops" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Numero di hop" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23909,6 +25216,12 @@ "value" : "Anzahl Einträge" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Numero di record" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23931,6 +25244,12 @@ "value" : "Anzahl Satelliten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Numero di satelliti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23945,73 +25264,7 @@ } } }, - "numbers.punctuation" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ziffern und Interpunktion" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Numbers and Punctuation" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nombres and Ponctuation" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מספרים וסימני פיסוק " - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cyfry i interpunkcja" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Números e Pontuação" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Siffror och skiljetecken" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Бројеви и интерпункција" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "数字和标点符号" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "數字和標點符號" - } - } - } - }, "off" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -24037,18 +25290,18 @@ "value" : "כבוי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spento" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wyłączony" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desligado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -24075,71 +25328,6 @@ } } }, - "offline" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Offline" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Offline" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hors ligne" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מנותק" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Offline" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Offline" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Offline" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ван мреже" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "离线" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "離線" - } - } - } - }, "OK" : { "localizations" : { "de" : { @@ -24148,6 +25336,12 @@ "value" : "Ok" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24164,6 +25358,12 @@ }, "Ok to MQTT" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ok a MQTT" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24192,6 +25392,12 @@ "value" : "OLED Typ" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tipo OLED" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24213,7 +25419,6 @@ } }, "on.boot" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -24239,18 +25444,18 @@ "value" : "רק בעת הדלקה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Solo all'avvio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Tylko przy uruchomieniu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "No arranque" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -24279,6 +25484,12 @@ }, "Onboarding for licensed operators requires firmware 2.0.20 or greater. Make sure to refer to your local regulations and contact the local amateur frequency coordinators with questions." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per l'attivazione degli operatori con licenza è necessario il firmware 2.0.20 o superiore. Assicuratevi di consultare le normative locali e di contattare i coordinatori delle frequenze amatoriali locali per eventuali domande." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24307,6 +25518,12 @@ "value" : "Eine Stunde" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un'ora" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24329,6 +25546,12 @@ "value" : "Eine Minute" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un minuto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24351,6 +25574,12 @@ "value" : "Online" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In linea" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24373,6 +25602,12 @@ "value" : "Einstellungen öffnen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aprire le impostazioni" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24394,7 +25629,6 @@ } }, "optimized.for.2.color.displays" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -24402,6 +25636,12 @@ "value" : "Optimized for 2 color displays" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ottimizzato per i display a 2 colori" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24418,6 +25658,12 @@ }, "Optional fields to include when assembling position messages. the more fields are included, the larger the message will be - leading to longer airtime and a higher risk of packet loss" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Campi opzionali da includere quando si assemblano i messaggi di posizione. Più campi sono inclusi, più grande sarà il messaggio, con conseguente allungamento dei tempi di trasmissione e un maggiore rischio di perdita di pacchetti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24440,6 +25686,12 @@ }, "Optional GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "GPIO opzionale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24480,18 +25732,18 @@ "value" : "הגדרות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Opcje" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Opções" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -24518,46 +25770,48 @@ } } }, - "Options" : { + "OS Log Entry Details" : { "localizations" : { - "de" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Optionen" + "value" : "Dettagli della voce del registro OS" } }, "sr" : { "stringUnit" : { "state" : "translated", - "value" : "Опције" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "选项" + "value" : "Детаљи уноса ОС дневника" } }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "選項" - } - } - } - }, - "OS Log Entry Details" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Детаљи уноса ОС дневника" + "value" : "作業系統日誌條目詳細資訊" } } } }, "OTA Updates are not supported on this NRF Device." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gli aggiornamenti OTA non sono supportati da questo dispositivo NRF." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ОТА ажурирања нису подржана на овом NRF уређају." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "OTA 更新不支持 NRF 设备" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -24568,6 +25822,12 @@ }, "OTA Updates are not supported on your platform." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gli aggiornamenti OTA non sono supportati dalla vostra piattaforma." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24590,6 +25850,12 @@ }, "Other data sources" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Altre fonti di dati" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24612,6 +25878,12 @@ "value" : "Ausgabe von Echtzeit-Fehlersuchprotokollen über die serielle Schnittstelle, Anzeige und Export von positionskorrigierten Geräteprotokollen über Bluetooth." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Emissione di registrazioni di debug in tempo reale via seriale, visualizzazione ed esportazione di registri del dispositivo con correzione della posizione via Bluetooth." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24628,36 +25900,78 @@ }, "Output pin buzzer GPIO " : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin di uscita cicalino GPIO " + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Излазни пин за зујалицу GPIO" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "蜂鳴器輸出腳位 GPIO" + } } } }, "Output pin GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin di uscita GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Излазни пин GPIO" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "輸出腳位 GPIO" + } } } }, "Output pin vibra GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin di uscita vibra GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Излазни пин за вибрацију GPIO" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "振動馬達輸出腳位 GPIO" + } } } }, "Override automatic OLED screen detection." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annulla il rilevamento automatico dello schermo OLED." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -24667,7 +25981,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "覆寫自動偵測 OLED 螢幕。" + "value" : "覆寫自動偵測 OLED 螢幕" } } } @@ -24698,18 +26012,18 @@ "value" : "מצב הצמדה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modalità di accoppiamento" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Tryb parowania" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modo Pairing" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -24737,6 +26051,16 @@ } }, "password" : { + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "密碼" + } + } + } + }, + "Password" : { "localizations" : { "de" : { "stringUnit" : { @@ -24762,18 +26086,18 @@ "value" : "סיסמא" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Password" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Hasło" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Senha" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -24826,18 +26150,18 @@ "value" : "הפסק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pausa" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Pause" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pausa" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -24872,7 +26196,7 @@ "value" : "BLE" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "BLE" @@ -24906,10 +26230,10 @@ "value" : "No PAX Counter Logs" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Nenhum Log do Contador PAX Disponível" + "value" : "Nessun registro del contatore PAX" } }, "se" : { @@ -24923,6 +26247,12 @@ "state" : "translated", "value" : "Нема логова PAX бројача" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "沒有 PAX 計數器日誌" + } } } }, @@ -24934,10 +26264,10 @@ "value" : "Delete all pax data?" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Apagar todos os dados de pax?" + "value" : "Cancellare tutti i dati dei passeggeri?" } }, "se" : { @@ -24951,6 +26281,12 @@ "state" : "translated", "value" : "Избриши све PAX податке?" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "要刪除所有 PAX 資料嗎?" + } } } }, @@ -24962,10 +26298,10 @@ "value" : "PAX Counter Log" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Log do Contador PAX" + "value" : "Registro del contatore PAX" } }, "se" : { @@ -24979,6 +26315,12 @@ "state" : "translated", "value" : "Логови PAX бројача" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX 計數器日誌" + } } } }, @@ -24990,10 +26332,10 @@ "value" : "Total PAX" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Total de PAX" + "value" : "Totale PAX" } }, "se" : { @@ -25007,6 +26349,12 @@ "state" : "translated", "value" : "Укупно PAX" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX 總數" + } } } }, @@ -25018,7 +26366,7 @@ "value" : "WiFi" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "WiFi" @@ -25052,6 +26400,12 @@ "value" : "Verbundenen Knoten auf Werkseinstellungen zurücksetzen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eseguire un reset di fabbrica sul nodo a cui si è connessi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25067,7 +26421,6 @@ } }, "Philippines 433mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -25075,6 +26428,12 @@ "value" : "Philippines 433MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filippine 433MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25090,7 +26449,6 @@ } }, "Philippines 868mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -25098,6 +26456,12 @@ "value" : "Philippines 868MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filippine 868MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25113,7 +26477,6 @@ } }, "Philippines 915mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -25121,6 +26484,12 @@ "value" : "Philippines 915MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Filippine 915MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25161,18 +26530,18 @@ "value" : "GPS מהטלפון" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telefono GPS" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "GPS telefonu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "GPS do Telefone" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -25199,73 +26568,14 @@ } } }, - "phone.gps.interval.description" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wie häufig das Telefon den Standort an das Gerät sendet. Standortaktualisierungen an das Mesh werden vom Gerät verwaltet." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "How frequently your phone will send your location to the device, location updates to the mesh are managed by the device." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La fréquence à laquelle votre téléphone envoie votre position à l'appareil, les mises à jour de la position vers le maillage sont gérées par l'appareil." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "כל כמה זמן מכשיר הטלפון ישלח את מיקומך למכשיר המשטסטיק. עדכוני מיקום למש מנוהלות על ידי המכשיר." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Jak często Twój telefon będzie wysyłał swoją lokalizację do urządzenia, aktualizacje lokalizacji w sieci są zarządzane przez urządzenie." - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Com que frequência seu telefone enviará sua localização para o dispositivo, as atualizações de localização no mesh são geridas pelo dispositivo." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hur ofta din telefon skickar din plats till enheten, platsuppdateringar till mesh-nätverket hanteras av enheten." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Колико често ваш телефон шаље вашу локацију уређају, ажурирања локације на мрежу се управљају од стране уређаја." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "电台通过手机获取定位的时间间隔,但是向 Mesh 网络中发送定位的时间间隔由电台控制。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "節點通過手機獲得定位的時間間隔,但是向 Mesh 網路中更新定位的時間間隔由裝置控制。" - } - } - } - }, "Pin %lld" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin %lld" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25282,6 +26592,12 @@ }, "Pin A" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin A" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25298,6 +26614,12 @@ }, "Pin B" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin B" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25320,6 +26642,12 @@ "value" : "PKI-basierte Knotenadministration, benötigt Firmware Version 2.5+" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amministrazione dei nodi basata su PKI, richiede la versione firmware 2.5+" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25340,8 +26668,24 @@ } } }, + "Please be advised that because the map report is not encrypted, your data may be stored and displayed permanently by third parties. Meshtastic does not assume responsibility for any such storage, display or disclosure of this data." : { + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "請注意,由於地圖報告內容未經加密,您的資料可能會被第三方永久儲存、展示或公開揭露。Meshtastic 對於任何此類資料的儲存、展示或揭露行為,不承擔任何責任。" + } + } + } + }, "Please connect to a radio to configure settings." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Collegarsi a una radio per configurare le impostazioni." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25363,7 +26707,6 @@ } }, "Please set a region" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -25371,6 +26714,12 @@ "value" : "Please set a region" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impostare una regione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25387,6 +26736,12 @@ }, "Points of Interest" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Punti di interesse" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25427,18 +26782,18 @@ "value" : "מיקום" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Pozycja" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Posição" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -25467,6 +26822,12 @@ }, "Position Exchange Failed" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scambio di posizioni non riuscito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25483,6 +26844,12 @@ }, "Position Exchange Requested" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scambio di posizioni richiesto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25499,6 +26866,12 @@ }, "Position Flags" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bandiere di posizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25515,6 +26888,12 @@ }, "Position Log" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diario di posizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25531,6 +26910,12 @@ }, "Position Log %lld Points" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione Log %lld Punti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25547,6 +26932,12 @@ }, "Position Packet" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pacchetto posizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25569,6 +26960,12 @@ "value" : "Position gesendet" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione inviata" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25609,18 +27006,18 @@ "value" : "הגדרות מיקום" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della posizione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja pozycji" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de Posição" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -25648,7 +27045,6 @@ } }, "position.precision %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -25662,10 +27058,10 @@ "value" : "Within %@" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Dentro de %@" + "value" : "Entro il %@" } }, "se" : { @@ -25690,6 +27086,12 @@ }, "Positions Enabled" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizioni abilitate" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25712,6 +27114,12 @@ }, "Positions will be provided by your device GPS, if you select disabled or not present you can set a fixed position." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le posizioni saranno fornite dal GPS del dispositivo; se si seleziona disabilitato o non presente, è possibile impostare una posizione fissa." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25734,6 +27142,12 @@ }, "Power" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Potenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25750,6 +27164,12 @@ }, "Power Metrics" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metriche di potenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25766,6 +27186,12 @@ }, "Power Metrics Log" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro delle metriche di potenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25782,9 +27208,15 @@ }, "Power Off" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spegnimento" + } + }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Искључи" } }, @@ -25798,9 +27230,15 @@ }, "Power Options" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni di alimentazione" + } + }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Опције снаге" } }, @@ -25814,6 +27252,12 @@ }, "Power Screen" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schermo di alimentazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25828,31 +27272,7 @@ } } }, - "power.metrics.delete" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete all power metrics?" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Обрисати све логове метрике снаге?" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "刪除所有電源指標紀錄?" - } - } - } - }, "power.metrics.log" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -25860,6 +27280,12 @@ "value" : "Power Metrics Log" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro delle metriche di potenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25882,6 +27308,12 @@ "value" : "Angeschaltet" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Potenziato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25900,13 +27332,19 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Genaue Position" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione precisa" + } + }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Прецизне локације" } }, @@ -25918,73 +27356,14 @@ } } }, - "preferred.radio" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bevorzugtes Gerät" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Preferred Radio" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Radio favorie" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "רדיו מועדף" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Preferowane radio" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rádio Preferido" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Föredragen Radio" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Преферирани радио" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "默认电台" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "首選節點" - } - } - } - }, "Presets" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preimpostazioni" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26000,23 +27379,41 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "預設組態" + "value" : "首選節點" } } } }, "Press Pin" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pin a pressione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Притисни пин" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "按下圖釘" + } } } }, "Pressure" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pressione" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -26027,6 +27424,12 @@ }, "Primary" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Primario" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26049,6 +27452,12 @@ "value" : "Erster Admin-Schlüssel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave amministrativa primaria" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26071,6 +27480,12 @@ }, "Primary GPIO" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "GPIO primario" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26093,6 +27508,12 @@ "value" : "Privater Schlüssel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave privata" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26115,6 +27536,12 @@ }, "Project information" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Informazioni sul progetto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26143,6 +27570,12 @@ "value" : "Öffentlicher Schlüssel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave pubblica" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26165,6 +27598,12 @@ }, "Public Key Encryption" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Crittografia a chiave pubblica" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26187,6 +27626,12 @@ }, "Public Key Mismatch" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mancata corrispondenza della chiave pubblica" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26209,6 +27654,12 @@ }, "PWD" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "DIPARTIMENTO DELLA DIFESA" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26224,11 +27675,29 @@ } }, "Radiation" : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radiazioni" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "輻射" + } + } + } }, "Radio Disconnected" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radio scollegata" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26269,18 +27738,18 @@ "value" : "הגדרות רדיו" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione radio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja radia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de Rádio" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26307,71 +27776,6 @@ } } }, - "Random PIN" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zufällige PIN" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Random PIN" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code PIN aléatoire" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "קוד אקראי" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Losowy PIN" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "PIN Aleatório" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Slumpmässig PIN" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Насумичан ПИН" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "随机 PIN 码" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "隨機 PIN 碼" - } - } - } - }, "range.test" : { "localizations" : { "de" : { @@ -26398,18 +27802,18 @@ "value" : "בדיקת טווח" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Test della gamma" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Test zasięgu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Teste de Alcance" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26436,71 +27840,6 @@ } } }, - "range.test.blocked" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Block Range Test" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Block Range Test" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Test de portée bloqué" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "חסום בדיקות טווח" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Block Range Test" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bloquear Teste de Alcance" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Blockera räckviddstest" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Тест домета блока" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "区块范围测试" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "區塊範圍測試" - } - } - } - }, "range.test.config" : { "localizations" : { "de" : { @@ -26527,18 +27866,18 @@ "value" : "הגדרות בדיקת טווח" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del test di portata" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja testu zasięgu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração do teste de Alcance" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26560,7 +27899,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "拉距測試設定" + "value" : "區塊範圍測試" } } } @@ -26591,18 +27930,18 @@ "value" : "התחל מחדש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riavvio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Uruchom ponownie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reiniciar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26637,6 +27976,12 @@ "value" : "Knoten neustarten?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riavviare il nodo?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26677,18 +28022,18 @@ "value" : "התחל מכשיר מחדש??" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riavviare il nodo?" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Uruchomić ponownie węzeł?" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reiniciar nó?" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26717,6 +28062,12 @@ }, "Rebroadcast Mode" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modalità di ritrasmissione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26739,11 +28090,23 @@ }, "Receive data (rxd) GPIO pin" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dati di ricezione (rxd) Pin GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Пријемни податак (rxd) GPIO пин" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "接收資料(RXD)GPIO 腳位" + } } } }, @@ -26773,18 +28136,18 @@ "value" : "התקבל אישור מסירה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ricevuto Ack" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odebrano potwierdzenie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ack Recebido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26837,18 +28200,18 @@ "value" : "התקבל אישור מסירה מהנמען" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Destinatario Ack" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odbiorca potwierdzenia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ack do Destinário" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26883,21 +28246,45 @@ "value" : "Route aufzeichnen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Percorso di registrazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Снимање руте" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "記錄路線" + } } } }, "Refresh device metadata" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornare i metadati del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Освежи метаподатке уређаја" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "重新整理裝置中繼資料(Metadata)" + } } } }, @@ -26909,6 +28296,12 @@ "value" : "Region" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Regione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -26930,7 +28323,6 @@ } }, "relativetimeofday.afternoon" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -26944,10 +28336,10 @@ "value" : "Afternoon" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Tarde" + "value" : "Pomeriggio" } }, "sr" : { @@ -26965,7 +28357,6 @@ } }, "relativetimeofday.evening" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -26979,10 +28370,10 @@ "value" : "Evening" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Noite" + "value" : "Sera" } }, "sr" : { @@ -27000,7 +28391,6 @@ } }, "relativetimeofday.midday" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -27014,10 +28404,10 @@ "value" : "Midday" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Meio-dia" + "value" : "Mezzogiorno" } }, "sr" : { @@ -27035,7 +28425,6 @@ } }, "relativetimeofday.morning" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -27049,10 +28438,10 @@ "value" : "Morning" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Manhã" + "value" : "Mattina" } }, "sr" : { @@ -27070,7 +28459,6 @@ } }, "relativetimeofday.nighttime" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -27084,10 +28472,10 @@ "value" : "Nighttime" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Noite" + "value" : "Notte" } }, "sr" : { @@ -27106,16 +28494,34 @@ }, "Release Notes" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Note di rilascio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Белешке о издању" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "版本更新說明" + } } } }, "Remote administration for: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amministrazione remota per: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27132,21 +28538,45 @@ }, "Remote Legacy Admin: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amministratore legacy remoto: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Администрација застарелих система на даљину: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "遠端管理(舊版):%@" + } } } }, "Remote PKI Admin: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amministratore PKI remoto: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Администрација PKI на даљину: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "遠端 PKI 公鑰管理:%@" + } } } }, @@ -27158,6 +28588,12 @@ "value" : "Entfernen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rimuovere" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27180,6 +28616,12 @@ "value" : "Von Favoriten entfernen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rimuovi dai preferiti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27196,6 +28638,12 @@ }, "Remove from ignored" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rimuovere da ignorato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27218,6 +28666,12 @@ }, "Replace Channels" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sostituire i canali" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27258,18 +28712,18 @@ "value" : "תגובה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Risposta" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odpowiedz" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Responder" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -27298,26 +28752,56 @@ }, "Request Legacy Admin: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Richiesta amministratore legacy: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Захтевај администрацију застарелих система: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "請求舊版管理:%@" + } } } }, "Request PKI Admin: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Richiesta PKI Admin: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Захтевај PKI администрацију: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "請求 PKI 管理:%@" + } } } }, "Requires that there be an accelerometer on your device." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Richiede la presenza di un accelerometro sul dispositivo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27340,6 +28824,12 @@ "value" : "App-Einstellungen zurücksetzen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ripristino delle impostazioni dell'app" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27368,6 +28858,12 @@ "value" : "Knotendatenbank zurücksetzen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Azzeramento di NodeDB" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27390,6 +28886,12 @@ "value" : "Neustarten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riavvio" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27412,11 +28914,23 @@ "value" : "Verbundenen Knoten neustarten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riavviare al nodo a cui si è collegati" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Поновно покретање на чвор на који сте повезани" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "重新啟動您所連線的節點" + } } } }, @@ -27446,18 +28960,18 @@ "value" : "החל מחדש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il curriculum" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Resume" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -27492,6 +29006,12 @@ "value" : "App bewerten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esaminare l'applicazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27538,18 +29058,18 @@ "value" : "רינגטון" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suoneria" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Dzwonek" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toque" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -27576,71 +29096,6 @@ } } }, - "ringtone.config" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Klingelton Konfiguration" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringtone Config" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration de la sonnerie" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות רינגטון" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguracja dzwonka" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração de Toque" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringsignalsinställningar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подешавање мелодије звона" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "铃声设置" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "鈴聲設定" - } - } - } - }, "Role" : { "localizations" : { "de" : { @@ -27649,6 +29104,12 @@ "value" : "Rolle" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ruolo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27658,7 +29119,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "模式" + "value" : "Role" } } } @@ -27671,6 +29132,12 @@ "value" : "Rolle: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ruolo: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27680,7 +29147,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "模式: %@" + "value" : "Role: %@" } } } @@ -27693,6 +29160,12 @@ "value" : "Rollen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ruoli" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27702,23 +29175,41 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "模式" + "value" : "Roles" } } } }, "Root Topic" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Argomento radice" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Корен тема" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "根主題" + } } } }, "Rotary 1" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rotary 1" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27730,11 +29221,23 @@ "state" : "translated", "value" : "旋转一次" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "編碼器 1" + } } } }, "Route Back: %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Percorso di ritorno: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27751,6 +29254,12 @@ }, "Route Lines" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Linee di percorso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27767,6 +29276,12 @@ }, "Route Recorder" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registratore di percorso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27783,6 +29298,12 @@ }, "Route recording paused" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registrazione del percorso in pausa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27805,6 +29326,12 @@ "value" : "Route: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Percorso: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27821,6 +29348,12 @@ }, "Routes" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Percorsi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27836,7 +29369,6 @@ } }, "routes.activitytype.biking" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -27850,10 +29382,10 @@ "value" : "Biking" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Passeio de Bicicleta" + "value" : "In bicicletta" } }, "sr" : { @@ -27877,7 +29409,6 @@ } }, "routes.activitytype.driving" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -27891,10 +29422,10 @@ "value" : "Driving" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Conduzir" + "value" : "Guida" } }, "sr" : { @@ -27918,7 +29449,6 @@ } }, "routes.activitytype.filename.biking" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -27932,10 +29462,10 @@ "value" : "bike tour" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Passeio de Bicicleta" + "value" : "tour in bicicletta" } }, "sr" : { @@ -27949,11 +29479,16 @@ "state" : "translated", "value" : "自行车旅行" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "自行車" + } } } }, "routes.activitytype.filename.driving" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -27967,10 +29502,10 @@ "value" : "drive" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Conduzir" + "value" : "guida" } }, "sr" : { @@ -27984,11 +29519,16 @@ "state" : "translated", "value" : "驾驶" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "開車" + } } } }, "routes.activitytype.filename.hiking" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28002,10 +29542,10 @@ "value" : "hike" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Caminhar na Montanha" + "value" : "escursione" } }, "sr" : { @@ -28019,11 +29559,16 @@ "state" : "translated", "value" : "徒步" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "登山" + } } } }, "routes.activitytype.filename.overlanding" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -28031,10 +29576,10 @@ "value" : "overland drive" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Caminhar overland" + "value" : "overland drive" } }, "sr" : { @@ -28048,11 +29593,16 @@ "state" : "translated", "value" : "越野" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "開車 (overland drive)" + } } } }, "routes.activitytype.filename.skiing" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28066,10 +29616,10 @@ "value" : "ski tour" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Passeio de esqui" + "value" : "tour sciistico" } }, "sr" : { @@ -28083,11 +29633,16 @@ "state" : "translated", "value" : "滑雪之旅" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑雪" + } } } }, "routes.activitytype.filename.walking" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28101,10 +29656,10 @@ "value" : "walk" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Caminhar" + "value" : "passeggiata" } }, "sr" : { @@ -28122,13 +29677,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "步行" + "value" : "走路" } } } }, "routes.activitytype.hiking" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28142,10 +29696,10 @@ "value" : "Hiking" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Caminhada na Montanha" + "value" : "Escursioni" } }, "sr" : { @@ -28169,7 +29723,6 @@ } }, "routes.activitytype.overlanding" : { - "extractionState" : "migrated", "localizations" : { "en" : { "stringUnit" : { @@ -28177,7 +29730,7 @@ "value" : "Overlanding" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "Overlanding" @@ -28194,11 +29747,16 @@ "state" : "translated", "value" : "越野" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "越野旅行" + } } } }, "routes.activitytype.skiing" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28212,10 +29770,10 @@ "value" : "Skiing" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Esqui" + "value" : "Sci" } }, "sr" : { @@ -28239,7 +29797,6 @@ } }, "routes.activitytype.walking" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28253,10 +29810,10 @@ "value" : "Walking" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Caminhada" + "value" : "Camminare" } }, "sr" : { @@ -28274,13 +29831,12 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "步行" + "value" : "走路" } } } }, "routing.acknowledged" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28306,18 +29862,18 @@ "value" : "מאשר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riconosciuto" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Potwierdzono" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reconhecido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28345,7 +29901,6 @@ } }, "routing.badRequest" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28371,18 +29926,18 @@ "value" : "בקשה לא תקינה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Richiesta negativa" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Złe żądanie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pedido Ruim" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28410,7 +29965,6 @@ } }, "routing.dutycyclelimit" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28436,18 +29990,18 @@ "value" : "הגיע למקסימום שימוש אזורי לשעה זו" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Raggiunto il limite del ciclo di lavoro regionale" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Osiągnięto regionalny limit cyklu pracy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "O limite do Regional Duty Cycle foi abrangido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28475,7 +30029,6 @@ } }, "routing.gotnak" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28501,18 +30054,18 @@ "value" : "התקבל אישור מסירה שלילי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ricevuto un riscontro negativo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Otrzymano negatywne potwierdzenie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Recebido um reconhecimento negativo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28540,7 +30093,6 @@ } }, "routing.maxretransmit" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28566,18 +30118,18 @@ "value" : "הגיע למקסימום השליחות מדש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Raggiunta la massima ritrasmissione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Osiągnięto limit retransmisji" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Máximo de Retransmissão Alcançado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28605,7 +30157,6 @@ } }, "routing.nochannel" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28631,18 +30182,18 @@ "value" : "אין ערוץ" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun canale" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak kanału" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem Canal" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28670,7 +30221,6 @@ } }, "routing.nointerface" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28696,18 +30246,18 @@ "value" : "אין ממשק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuna interfaccia" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak interfejsu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem Interface" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28735,7 +30285,6 @@ } }, "routing.noresponse" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28761,18 +30310,18 @@ "value" : "אין תגובה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuna risposta" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak odpowiedzi" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem Resposta" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28800,7 +30349,6 @@ } }, "routing.noroute" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28826,18 +30374,18 @@ "value" : "אין מסלול" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun percorso" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Brak trasy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem Rota" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28865,7 +30413,6 @@ } }, "routing.notauthorized" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -28891,18 +30438,18 @@ "value" : "לא מאושר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non autorizzato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Nieautoryzowany" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Não Autorizado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -28930,7 +30477,6 @@ } }, "routing.pkifailed" : { - "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -28944,6 +30490,12 @@ "value" : "Encrypted Send Failed" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invio crittografato fallito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28958,43 +30510,7 @@ } } }, - "routing.pkiunknownpubkey" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unbekannter öffentlicher Schlüssel" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unknown Public Key" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Непознат јавни кључ" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "未知的公钥" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "未知公鑰" - } - } - } - }, "routing.timeout" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -29020,18 +30536,18 @@ "value" : "נגמר הזמן" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Timeout" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Limit czasu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tempo Esgotado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29059,7 +30575,6 @@ } }, "routing.toolarge" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -29085,18 +30600,18 @@ "value" : "ההודעה ארוכה/גדולה מידי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il pacchetto è troppo grande" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Pakiet jest zbyt duży" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "O pacote é grande de mais" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29125,6 +30640,12 @@ }, "RSSI %@ dBm" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "RSSI %@ dBm" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29141,6 +30662,12 @@ }, "RSSI %ddB" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "RSSI %ddB" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29157,6 +30684,12 @@ }, "RSSI %llddB" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "RSSI %llddB" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29172,7 +30705,6 @@ } }, "Russia" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -29180,6 +30712,12 @@ "value" : "Russia" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Russia" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29196,6 +30734,12 @@ }, "RX Boosted Gain" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Guadagno potenziato RX" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29211,7 +30755,6 @@ } }, "satellite" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -29237,18 +30780,18 @@ "value" : "לווין" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Satellite" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Satelita" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Satéllite" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29276,7 +30819,6 @@ } }, "satellite.flyover" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -29302,18 +30844,18 @@ "value" : "לווין בשמיים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sorvolo satellitare" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Przelot satelity" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passagem de Satélite" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29348,6 +30890,12 @@ "value" : "Satelliten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sats" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29370,6 +30918,12 @@ "value" : "Satelliten Schätzung %lld" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stima Sats %lld" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29392,6 +30946,12 @@ "value" : "Satelliten in Sicht: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Saturazione in vista: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29432,18 +30992,18 @@ "value" : "שמור" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Risparmiare" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zapisz" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Salvar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29478,6 +31038,12 @@ "value" : "Speichern" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Risparmiare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29494,6 +31060,12 @@ }, "Save Channel Settings" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Salvare le impostazioni del canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29516,6 +31088,12 @@ "value" : "Benutzerkonfiguration nach %@ speichern?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Salvare la configurazione utente in %@?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29537,7 +31115,6 @@ } }, "save.config %@" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -29563,18 +31140,18 @@ "value" : "שמור הגדרות עבור %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Salva la configurazione per %@" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zapisz konfigurację dla %@" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Salvar a Configuração para %@" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -29603,6 +31180,12 @@ }, "Saves a CSV with the range test message details, currently only available on ESP32 devices with a web server." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Salva un CSV con i dettagli del messaggio di test di portata, attualmente disponibile solo sui dispositivi ESP32 con un server web." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29625,11 +31208,23 @@ }, "Screen on for" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schermo acceso per" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Екран укључен за" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "螢幕開啟時間為" + } } } }, @@ -29641,6 +31236,12 @@ "value" : "Suchen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ricerca" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29657,6 +31258,12 @@ }, "Second" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Secondo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29673,6 +31280,12 @@ }, "Secondary" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Secondario" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29695,6 +31308,12 @@ "value" : "Zweiter Admin-Schlüssel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave amministrativa secondaria" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29723,6 +31342,12 @@ "value" : "Sicherheit" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sicurezza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29751,6 +31376,12 @@ "value" : "Sicherheitskonfiguration" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della sicurezza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29779,6 +31410,12 @@ "value" : "Sicherheitskonfigurationseinstellungen erfordern eine Firmware mit Version 2.5 oder höher" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le impostazioni di configurazione della sicurezza richiedono una versione del firmware 2.5+" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29807,6 +31444,12 @@ "value" : "Kanal wählen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare un canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29823,6 +31466,12 @@ }, "Select a conversation" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare una conversazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29839,6 +31488,12 @@ }, "Select a conversation type" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare un tipo di conversazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29855,6 +31510,12 @@ }, "Select a Trace Route" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare un percorso di tracciamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29871,6 +31532,12 @@ }, "Select Channel" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare il canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29885,71 +31552,6 @@ } } }, - "select.contact" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontakt wählen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select a Contact" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectioner un contact" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "בחר איש קשר" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wybierz kontakt" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleciona a Contacto" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Välj en kontakt" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Одабери контакт" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择一名联系人" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "選擇聯絡人" - } - } - } - }, "select.node" : { "localizations" : { "de" : { @@ -29976,18 +31578,18 @@ "value" : "בחר מכשיר" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare un nodo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wybierz węzeł" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleciona a Nó" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30022,6 +31624,12 @@ "value" : "Senden" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30044,26 +31652,56 @@ "value" : "Sende ${messageContent} an ${channelNumber}" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invia ${messaggioContenuto} a ${canaleNumero}" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Пошаљи ${messageContent} на ${channelNumber}" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Send ${messageContent} to ${channelNumber}" + } } } }, "Send ${messageContent} to ${nodeNumber}" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invia ${messaggioContenuto} a ${nodoNumero}" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Пошаљи ${messageContent} на ${nodeNumber}" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Send ${messageContent} to ${nodeNumber}" + } } } }, "Send a Direct Message" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare un messaggio diretto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30086,6 +31724,12 @@ "value" : "Gruppennachricht senden" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare un messaggio di gruppo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30102,6 +31746,12 @@ }, "Send a heartbeat to advertise the server's presence." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invia un heartbeat per pubblicizzare la presenza del server." + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -30112,26 +31762,56 @@ }, "Send a message to a certain meshtastic channel" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare un messaggio a un certo canale meshtastic" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Пошаљи поруку на одређени месхтастичан канал" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "向特定 Meshtastic 頻道發送訊息" + } } } }, "Send a message to a certain meshtastic node" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare un messaggio a un certo nodo meshtastico" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Пошаљи поруку одређеном мештастик чвору" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "向特定 Meshtastic 節點發送訊息" + } } } }, "Send a position on the primary channel when the user button is triple clicked." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invia una posizione sul canale primario quando si fa triplo clic sul pulsante utente." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30160,11 +31840,23 @@ "value" : "Herunterfahren an verbundenen Knoten senden" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare uno spegnimento al nodo a cui si è connessi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Пошаљи искључење чвору на који си повезан" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "向您所連線的節點發送關機指令" + } } } }, @@ -30176,6 +31868,12 @@ "value" : "Wegpunkt senden" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare un waypoint" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30192,6 +31890,12 @@ }, "Send ASCII bell with alert message. Useful for triggering external notification on bell." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invia una campana ASCII con un messaggio di avviso. Utile per attivare una notifica esterna sul campanello." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30203,6 +31907,12 @@ "state" : "translated", "value" : "发送带有警报信息的 ASCII 铃声。用于触发外部铃声通知。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "發送帶有警示訊息的 ASCII 鈴鐺圖示。此功能可用於觸發外部鈴聲通知。" + } } } }, @@ -30214,6 +31924,12 @@ "value" : "Sende Glocke" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invia la campana" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30236,6 +31952,12 @@ }, "Send Reboot OTA" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare il riavvio OTA" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30247,11 +31969,23 @@ "state" : "translated", "value" : "发送重启 OTA" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "發送重啟 OTA 指令" + } } } }, "Sender Interval" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo del mittente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30274,6 +32008,12 @@ }, "Sensor Metrics" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metriche dei sensori" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30296,6 +32036,12 @@ }, "Sensor options" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni del sensore" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30312,6 +32058,12 @@ }, "Sensor Options" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni del sensore" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30334,6 +32086,12 @@ "value" : "Wird an andere Knoten im Netz gesendet, damit diese einen gemeinsamen geheimen Schlüssel berechnen können." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato agli altri nodi della rete per consentire loro di calcolare una chiave segreta condivisa." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30356,6 +32114,12 @@ "value" : "Sequenznummer" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Numero di sequenza" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30378,6 +32142,12 @@ "value" : "Sequenz: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sequenza: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30418,18 +32188,18 @@ "value" : "סיריאלי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seriale" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Seryjny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Serial" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30464,6 +32234,12 @@ "value" : "Serielle Konsole" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Console seriale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30486,6 +32262,12 @@ "value" : "Serielle Konsole über die Stream-API." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Console seriale tramite l'API Stream." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30526,18 +32308,18 @@ "value" : "'הגדרות מודולה 'סיריאלי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione seriale" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja seryjna" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração Serial" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30565,7 +32347,6 @@ } }, "serial.mode.default" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -30591,18 +32372,18 @@ "value" : "ברירת מחדל" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predefinito" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Domyślny" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Padrão" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30630,7 +32411,6 @@ } }, "serial.mode.nmea" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -30656,18 +32436,18 @@ "value" : "מיקומי NMEA" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizioni NMEA" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Pozycje NMEA" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Posições NMEA" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30695,7 +32475,6 @@ } }, "serial.mode.proto" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -30721,18 +32500,18 @@ "value" : "Protobufs" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Protobufs" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Protobufy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Protobufs" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30750,11 +32529,16 @@ "state" : "translated", "value" : "Protobufs" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Protobufs" + } } } }, "serial.mode.simple" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -30780,18 +32564,18 @@ "value" : "פשוט" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Semplice" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Prosty" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Simples" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30809,11 +32593,16 @@ "state" : "translated", "value" : "简单" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "簡易" + } } } }, "serial.mode.txtmsg" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -30839,18 +32628,18 @@ "value" : "הודעת טקסט" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio di testo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wiadomość tekstowa" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagem de Texto" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -30879,11 +32668,23 @@ }, "Series" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serie" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Серије" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Series" + } } } }, @@ -30895,6 +32696,12 @@ "value" : "Server" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Server" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30917,6 +32724,12 @@ "value" : "Serveradresse" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indirizzo del server" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30933,6 +32746,12 @@ }, "Server Option" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzione server" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -30943,6 +32762,12 @@ }, "Set" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Set" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30959,11 +32784,23 @@ }, "Set the GPIO pins for RXD and TXD." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impostare i pin GPIO per RXD e TXD." + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Подеси GPIO пинове за RXD и TXD." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定 RXD 和 TXD 的 GPIO 腳位。" + } } } }, @@ -30993,18 +32830,18 @@ "value" : "בחר אזור לורה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impostare la regione LoRa" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Ustaw region LoRa" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleciona o Região da LoRa" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -31033,6 +32870,12 @@ }, "Sets the maximum number of hops, default is 3. Increasing hops also increases congestion and should be used carefully. O hop broadcast messages will not get ACKs." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Imposta il numero massimo di hop, l'impostazione predefinita è 3. L'aumento degli hop aumenta anche la congestione e deve essere usato con attenzione. I messaggi di broadcasting a un hop non riceveranno ACK." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31073,18 +32916,18 @@ "value" : "הגדרות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impostazioni" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Ustawienia" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Definições" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -31113,6 +32956,12 @@ }, "Settings" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impostazioni" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -31129,6 +32978,12 @@ "value" : "QR Code & Link teilen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Condividi il codice QR e il link" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31169,18 +33024,18 @@ "value" : "שתף ערוצים באמצעות קוד QR" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Condividi il codice QR" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Udostępnij kod QR kanałów" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Partilhar o Código do QR" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -31207,71 +33062,6 @@ } } }, - "share.position" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Position teilen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Share Position" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Partager la position" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שתף מיקום" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Udostępnij pozycję" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Partilhar o Posição" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dela position" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подели позицију" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "分享位置" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "分享位置" - } - } - } - }, "Shared Key" : { "localizations" : { "de" : { @@ -31280,6 +33070,12 @@ "value" : "Gemeinsamer Schlüssel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave condivisa" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31302,6 +33098,12 @@ "value" : "Kurzname" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome breve" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31330,6 +33132,12 @@ "value" : "Kurzname: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome breve: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31351,7 +33159,6 @@ } }, "short.range.fast" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -31359,6 +33166,12 @@ "value" : "Short Range - Fast" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corto raggio - Veloce" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31374,7 +33187,6 @@ } }, "short.range.slow" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -31382,6 +33194,12 @@ "value" : "Short Range - Slow" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corto raggio - Lento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31397,7 +33215,6 @@ } }, "short.range.turbo" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -31405,6 +33222,12 @@ "value" : "Short Range - Turbo" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corto raggio - Turbo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31427,6 +33250,12 @@ "value" : "Zeige Alarme" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra avvisi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31449,6 +33278,12 @@ "value" : "Zeige Alarme" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra avvisi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31471,6 +33306,12 @@ "value" : "Zeige Knoten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra i nodi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31493,6 +33334,12 @@ "value" : "Zeige auf dem Gerätebildschirm" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra sullo schermo del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31515,6 +33362,12 @@ "value" : "Zeige auf der Netzwerkkarte." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra sulla mappa della mesh." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31537,6 +33390,12 @@ "value" : "Zeige Wegpunkte" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra waypoint " + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31553,6 +33412,12 @@ }, "Shows information for the Lora radio connected via bluetooth. You can swipe left to disconnect the radio and long press start the live activity." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra le informazioni relative alla radio Lora collegata via bluetooth. È possibile scorrere il dito verso sinistra per scollegare la radio e premere a lungo per avviare l'attività live." + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -31569,6 +33434,12 @@ "value" : "Herunterfahren" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spegnimento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31591,6 +33462,12 @@ "value" : "Knoten herunterfahren?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spegnere il nodo?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31613,6 +33490,12 @@ "value" : "Knoten herunterfahren?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arresto del nodo?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31629,6 +33512,12 @@ }, "Signal %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Segnale %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31644,7 +33533,6 @@ } }, "Singapore 923mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -31652,6 +33540,12 @@ "value" : "Singapore 923MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Singapore 923MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31668,6 +33562,12 @@ }, "Smart Position" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione intelligente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31684,6 +33584,12 @@ }, "SNR" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "SNR" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31700,6 +33606,12 @@ }, "SNR %@ dB" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "SNR %@ dB" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31716,6 +33628,12 @@ }, "SNR %@dB" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "SNR %@dB" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31732,6 +33650,12 @@ }, "Soil Moisture" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Umidità del suolo" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -31742,6 +33666,12 @@ }, "Soil Temp" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Temperatura del suolo" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -31752,11 +33682,23 @@ }, "Specifies how long the monitored GPIO should output." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Specifica la durata dell'uscita del GPIO monitorato." + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Одређује колико дуго треба да траје излазни сигнал надзираног GPIO-а." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "指定監控中的 GPIO 應該輸出的時間長度。" + } } } }, @@ -31768,6 +33710,12 @@ "value" : "Geschwindigkeit" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velocità" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31790,6 +33738,12 @@ "value" : "Geschwindigkeit %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velocità %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31812,6 +33766,12 @@ "value" : "Geschwindigkeit: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velocità: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31828,11 +33788,23 @@ }, "Spread Factor" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fattore di diffusione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Фактор ширења" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "擴頻參數" + } } } }, @@ -31862,13 +33834,13 @@ "value" : "שם רשת וויפי" } }, - "pl" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "SSID" } }, - "pt-PT" : { + "pl" : { "stringUnit" : { "state" : "translated", "value" : "SSID" @@ -31901,7 +33873,6 @@ } }, "standard" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -31927,18 +33898,18 @@ "value" : "סטנדרטי" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Standard" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Standardowy" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Padrão" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -31966,7 +33937,6 @@ } }, "standard.muted" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -31992,18 +33962,18 @@ "value" : "סטנדרתי-השתק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Standard Silenzioso" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Standardowy wyłączony" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Padrão Silenciado" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -32056,18 +34026,18 @@ "value" : "החל" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inizio" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Start" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Iniciar" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -32096,16 +34066,34 @@ }, "State Broadcast Interval" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stato Intervallo di trasmissione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Интервал емитовања стања" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "狀態廣播間隔" + } } } }, "Store & Forward" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Memorizzare e inoltrare" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32128,6 +34116,12 @@ }, "Store & Forward Config" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione Store & Forward" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32150,6 +34144,18 @@ }, "Store and forward servers require an ESP32 device with PSRAM or Linux Native." : { "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Store and forward servers require an ESP32 device with PSRAM or Linux Native." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I server Store and Forward richiedono un dispositivo ESP32 con PSRAM o Linux Native." + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -32184,18 +34190,18 @@ "value" : "שלח דופק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare il battito cardiaco" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Send Heartbeat" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enviar Batimento Cardíaco" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -32230,6 +34236,12 @@ "value" : "מחובר למש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abbonati" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32252,6 +34264,12 @@ "value" : "Unterstützt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supportato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32268,6 +34286,12 @@ }, "Supported I2C Connected sensors will be detected automatically, sensors are BMP280, BME280, BME680, MCP9808, INA219, INA260, LPS22 and SHTC3." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I sensori I2C supportati vengono rilevati automaticamente: BMP280, BME280, BME680, MCP9808, INA219, INA260, LPS22 e SHTC3." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32279,21 +34303,38 @@ "state" : "translated", "value" : "将自动检测支持 I2C 连接的传感器,包括 BMP280、BME280、BME680、MCP9808、INA219、INA260、LPS22 和 SHTC3。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "支援的 I2C 連接感測器將自動偵測,這些感測器包括 BMP280、BME280、BME680、MCP9808、INA219、INA260、LPS22 和 SHTC3。" + } } } }, "Table" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tabella" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Табела" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "表格" + } } } }, "Taiwan" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -32301,6 +34342,12 @@ "value" : "Taiwan" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Taiwan" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32310,13 +34357,19 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "台灣 🇹🇼" + "value" : "臺灣 🇹🇼" } } } }, "Takes a Meshtastic channel URL and saves the channel settings." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prende l'URL di un canale Meshtastic e salva le impostazioni del canale." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32357,18 +34410,18 @@ "value" : "תגובה מהירה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Risposta di Tapback" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Odpowiedź na stuknięcie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Resposta Tapback" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -32396,7 +34449,6 @@ } }, "tapback.exclamation" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -32422,18 +34474,18 @@ "value" : "סימן קריאה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Punto esclamativo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wykrzyknik" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ponto de Exclamação" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -32461,7 +34513,6 @@ } }, "tapback.haha" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -32487,13 +34538,13 @@ "value" : "חחח" } }, - "pl" : { + "it" : { "stringUnit" : { "state" : "translated", "value" : "HaHa" } }, - "pt-PT" : { + "pl" : { "stringUnit" : { "state" : "translated", "value" : "HaHa" @@ -32526,7 +34577,6 @@ } }, "tapback.heart" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -32552,18 +34602,18 @@ "value" : "לב" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cuore" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Serce" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Coração" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -32591,7 +34641,6 @@ } }, "tapback.poop" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -32617,18 +34666,18 @@ "value" : "חרא" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cacca" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Kupa" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cocó" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -32656,7 +34705,6 @@ } }, "tapback.question" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -32682,18 +34730,18 @@ "value" : "סימן שאלה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Punto interrogativo" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Znak zapytania" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ponto de Interrogação" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -32721,7 +34769,6 @@ } }, "tapback.thumbsdown" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -32747,18 +34794,18 @@ "value" : "אגודל למטה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pollici in giù" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Kciuk w dół" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Polegar para Baixo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -32786,7 +34833,6 @@ } }, "tapback.thumbsup" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -32812,18 +34858,18 @@ "value" : "אגודל למעלה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pollici in su" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Kciuk w górę" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Polegar para Cima" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -32851,7 +34897,6 @@ } }, "tapback.wave" : { - "extractionState" : "migrated", "localizations" : { "de" : { "stringUnit" : { @@ -32877,18 +34922,18 @@ "value" : "Wave" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Onda" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Wave" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adeus" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -32916,7 +34961,6 @@ } }, "telementry.hazardous" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -32924,16 +34968,27 @@ "value" : "Hazardous" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pericoloso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Опасно" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "危險" + } } } }, "telementry.unhealthy" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -32941,16 +34996,27 @@ "value" : "Unhealthy" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non sano" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Нездраво" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "不健康" + } } } }, "telementry.veryUnhealthy" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -32958,11 +35024,23 @@ "value" : "Very Unhealthy" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Molto malsano" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Веома нездраво" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "非常不健康" + } } } }, @@ -32992,18 +35070,18 @@ "value" : "טלמטריה (חיישנים)" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telemetria (sensori)" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Telemetria (czujniki)" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetria (Sensores)" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -33056,18 +35134,18 @@ "value" : "הגדרות טלמטריה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della telemetria" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Konfiguracja telemetrii" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração Telemetria" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -33095,7 +35173,6 @@ } }, "telemetry.good" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -33103,16 +35180,27 @@ "value" : "Good" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buono" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Добро" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "良好" + } } } }, "telemetry.moderate" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -33120,6 +35208,12 @@ "value" : "Moderate" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Moderato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33131,11 +35225,16 @@ "state" : "translated", "value" : "适度" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "中等" + } } } }, "telemetry.sensitive" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -33143,11 +35242,23 @@ "value" : "Unhealthy for Sensitive Groups" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insalubre per i gruppi sensibili" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Нездраво за осетљиве групе" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "對敏感群體不健康" + } } } }, @@ -33159,6 +35270,12 @@ "value" : "Temp" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Temp" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33181,6 +35298,12 @@ "value" : "Temperatur" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Temperatura" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33203,6 +35326,12 @@ "value" : "Zehn Minuten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dieci minuti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33225,6 +35354,12 @@ "value" : "Dritter Admin-Schlüssel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave amministrativa terziaria" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33246,7 +35381,6 @@ } }, "tft.full.color.displays" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -33254,6 +35388,12 @@ "value" : "TFT Full Color Displays" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Display TFT a colori" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33269,7 +35409,6 @@ } }, "Thailand" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -33277,6 +35416,12 @@ "value" : "Thailand" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thailandia" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33293,6 +35438,12 @@ }, "The amount of time to wait before we consider your packet as done." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il tempo di attesa prima che il pacchetto venga considerato completato." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33309,6 +35460,12 @@ }, "The compass heading on the screen outside of the circle will always point north." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La direzione della bussola sullo schermo all'esterno del cerchio punterà sempre verso nord." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33331,6 +35488,12 @@ "value" : "Der Taupunkt ist gerade %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il punto di rugiada è %@ in questo momento." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33347,6 +35510,12 @@ }, "The fastest that position updates will be sent if the minimum distance has been satisfied" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La velocità con cui verranno inviati gli aggiornamenti della posizione se la distanza minima è stata soddisfatta" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33363,6 +35532,12 @@ }, "The format used to display GPS coordinates on the device screen." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il formato utilizzato per visualizzare le coordinate GPS sullo schermo del dispositivo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33385,6 +35560,12 @@ }, "The last 4 of the device MAC address will be appended to the short name to set the device's BLE Name. Short name can be up to 4 bytes long." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gli ultimi 4 dell'indirizzo MAC del dispositivo vengono aggiunti al nome breve per impostare il nome BLE del dispositivo. Il nome breve può avere una lunghezza massima di 4 byte." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33407,6 +35588,12 @@ }, "The maximum interval that can elapse without a node broadcasting a position" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'intervallo massimo che può trascorrere senza che un nodo trasmetta una posizione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33423,6 +35610,12 @@ }, "The Meshtastic Apple apps support firmware version %@ and above." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le applicazioni Meshtastic Apple supportano la versione firmware %@ e successive." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33434,11 +35627,23 @@ "state" : "translated", "value" : "Meshtastic Apple 应用程序支持 %@ 及以上版本的固件。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meshtastic 的 Apple 應用程式支援 %@ 版本及以上的韌體。" + } } } }, "The minimum distance change in meters to be considered for a smart position broadcast." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La variazione di distanza minima in metri da considerare per la trasmissione di una posizione intelligente." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33461,6 +35666,12 @@ }, "The most recent public key for this node does not match the previously recorded key. You can delete the node and let it exchange keys again, but this also may indicate a more serious security problem. Contact the user through another trusted channel to determine if the key change was due to a factory reset or other intentional action." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La chiave pubblica più recente di questo nodo non corrisponde alla chiave registrata in precedenza. È possibile eliminare il nodo e fargli scambiare nuovamente le chiavi, ma questo potrebbe indicare un problema di sicurezza più serio. Contattare l'utente attraverso un altro canale fidato per determinare se la modifica della chiave è dovuta a un reset di fabbrica o a un'altra azione intenzionale." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33489,6 +35700,12 @@ "value" : "Der erste öffentliche Schlüssel, der berechtigt ist, Admin-Nachrichten an diesen Knoten zu senden." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La chiave pubblica primaria autorizzata a inviare messaggi di amministrazione a questo nodo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33511,6 +35728,12 @@ }, "The public key does not match the recorded key. You may delete the node and let it exchange keys again, but this may indicate a more serious security problem. Contact the user through another trusted channel, to determine if the key change was due to a factory reset or other intentional action." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La chiave pubblica non corrisponde alla chiave registrata. È possibile eliminare il nodo e fargli scambiare nuovamente le chiavi, ma questo potrebbe indicare un problema di sicurezza più serio. Contattare l'utente attraverso un altro canale fidato, per determinare se la modifica della chiave è dovuta a un reset di fabbrica o a un'altra azione intenzionale." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33533,6 +35756,12 @@ }, "The region where you will be using your radios." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La regione in cui si utilizzeranno le radio." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33555,6 +35784,12 @@ }, "The root topic to use for MQTT." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'argomento principale da usare per MQTT." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33566,11 +35801,23 @@ "state" : "translated", "value" : "用于 MQTT 的根主题。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "MQTT 使用的根主題" + } } } }, "The Router roles are designed for high vantage locations like mountaintops and towers. This node needs to be able to have a good direct connection to most of the nodes on the network or else this will significantly hurt the network." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I ruoli di router sono progettati per posizioni elevate, come le cime delle montagne e le torri. Questo nodo deve essere in grado di avere una buona connessione diretta con la maggior parte dei nodi della rete, altrimenti danneggia significativamente la rete." + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -33587,6 +35834,12 @@ "value" : "Der zweite öffentliche Schlüssel, der berechtigt ist, Admin-Nachrichten an diesen Knoten zu senden." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La chiave pubblica secondaria autorizzata a inviare messaggi di amministrazione a questo nodo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33608,18 +35861,35 @@ } }, "The specified device has disconnected from us" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il dispositivo specificato si è disconnesso" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Наведени уређај је прекинуо везу са нама" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "指定的裝置已斷線" + } } } }, "The state of the LED (on/off)" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lo stato del LED (acceso/spento)" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33642,6 +35912,12 @@ "value" : "Der dritte öffentliche Schlüssel, der berechtigt ist, Admin-Nachrichten an diesen Knoten zu senden." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La chiave pubblica terziaria autorizzata a inviare messaggi di amministrazione a questo nodo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33664,26 +35940,56 @@ }, "The URL for the channel settings" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'URL per le impostazioni del canale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "URL за подешавања канала" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道設定的網址" + } } } }, "There has been no response to a request for device metadata over the admin channel for this node." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non è stata data risposta a una richiesta di metadati del dispositivo sul canale di amministrazione per questo nodo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Није било одговора на захтев за метаподатке уређаја преко административног канала за овај чвор." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "此節點的管理頻道未回應設備中繼資料的請求。" + } } } }, "These settings will %@ channels. The current LoRa Config will be replaced, if there are substantial changes to the LoRa config the device will reboot" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Queste impostazioni saranno %@ canali. La configurazione LoRa corrente verrà sostituita; se vengono apportate modifiche sostanziali alla configurazione LoRa, il dispositivo si riavvierà" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33706,6 +36012,12 @@ "value" : "Dreißig Minuten" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trenta minuti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33722,6 +36034,12 @@ }, "This conversation will be deleted." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Questa conversazione sarà cancellata." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33738,6 +36056,12 @@ }, "This could take a while, response will appear in the trace route log for the node it was sent to." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La risposta potrebbe richiedere un po' di tempo e verrà visualizzata nel registro delle rotte di tracciamento per il nodo a cui è stata inviata." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33754,6 +36078,12 @@ }, "This could take a while. The response will appear in the trace route log for the node it was sent to." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'operazione potrebbe richiedere un po' di tempo. La risposta apparirà nel registro delle rotte di tracciamento per il nodo a cui è stata inviata." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33770,6 +36100,12 @@ }, "This device will send out range test messages on the selected interval." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il dispositivo invia messaggi di test di portata all'intervallo selezionato." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33798,29 +36134,72 @@ "value" : "Diese Nachricht wurde höchstwahrscheinlich nicht übermittelt." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È probabile che questo messaggio non sia stato consegnato." + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Ова порука вероватно није била примљена." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "此訊息可能未被傳送。" + } } } }, "This node does not support any configurable modules." : { - + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Questo nodo non supporta alcun modulo configurabile." + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "此節點不支援任何可設定的模組。" + } + } + } }, "This will disable fixed position and remove the currently set position." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In questo modo si disattiva la posizione fissa e si rimuove la posizione attualmente impostata." + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Ово ће онемогућити фиксну позицију и уклонити тренутно постављену позицију." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "這將禁用固定位置並移除當前設定的位置。" + } } } }, "This will send a current position from your phone and enable fixed position." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In questo modo si invia la posizione corrente dal telefono e si abilita la posizione fissa." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33832,6 +36211,12 @@ "state" : "translated", "value" : "这将从手机发送当前位置并启用固定位置。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "這將傳送您手機的當前位置並啟用固定位置。" + } } } }, @@ -33843,6 +36228,12 @@ "value" : "Zeit" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33865,6 +36256,12 @@ "value" : "Zeitstempel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Timbro del tempo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33887,6 +36284,12 @@ "value" : "Zeitzone" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fuso orario" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33909,6 +36312,12 @@ "value" : "Zeitzone für Daten auf dem Gerätebildschirm und Log." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fuso orario per le date sullo schermo del dispositivo e sul registro." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33949,18 +36358,18 @@ "value" : "זמן קצוב" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Timeout" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Limit czasu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tempo Limite" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -33989,6 +36398,12 @@ }, "timestamp" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "timestamp" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34029,18 +36444,18 @@ "value" : "שעה/תאריך" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Timestamp" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Znacznik czasu" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Carimbo de Data/Hora" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -34069,6 +36484,12 @@ }, "Timing & Format" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempi e formati" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34109,18 +36530,18 @@ "value" : "Admin channel detected: Select a node from the drop down to manage connected or remote devices." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale amministrativo rilevato: Selezionare un nodo dal menu a tendina per gestire i dispositivi collegati o remoti." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Admin channel detected: Select a node from the drop down to manage connected or remote devices." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canal de administração detectado: Selecione um nó do menu suspenso para gerir dispositivos conectados ou remotos." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -34173,18 +36594,18 @@ "value" : "Admin Channel" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canale Admin" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Admin Channel" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canal de Administração" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -34237,18 +36658,18 @@ "value" : "Most data on your mesh is sent over the primary channel. You can set up secondary channels to create additional messaging groups secured by their own key. [Channel config tips](https://meshtastic.org/docs/configuration/radio/channels/)" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La maggior parte dei dati sulla rete viene inviata attraverso il canale primario. È possibile impostare canali secondari per creare gruppi di messaggistica aggiuntivi protetti da una propria chiave. [Suggerimenti per la configurazione del canale](https://meshtastic.org/docs/configuration/tips/)" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Most data on your mesh is sent over the primary channel. You can set up secondary channels to create additional messaging groups secured by their own key. [Channel config tips](https://meshtastic.org/docs/configuration/radio/channels/)" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "A maioria dos dados na sua malha é enviada pelo canal principal. Você pode configurar canais secundários para criar grupos de mensagens adicionais protegidos por sua própria chave. [Channel config tips](https://meshtastic.org/docs/configuration/tips/)" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -34301,18 +36722,18 @@ "value" : "Manage Channels" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gestire i canali" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Manage Channels" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerir Canais" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -34365,18 +36786,18 @@ "value" : "במשטסטיק יש עד 8 ערוצים. הראשון הינו הראשי והינו היכן שרוב הפעילות מתבצעת והכרחי. אם לא תשתף את הערוץ הראשי שלך הערוץ הראשון שלך נהיה הערוץ הראשי ברשת השניה. הוא מדבר בערוץ הראשי שלו במשני שלך. ערוץ בעל השם 'admin' הינו לשליטה מרחוק. ערוצים נוספים הינם לקבוצות פרטיות, כל אחת עם מפתח הצפנה משלה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un codice QR Meshtastic contiene la configurazione LoRa e i valori dei canali necessari alle radio per comunicare. È possibile condividere una configurazione completa dei canali utilizzando l'opzione Sostituisci canali; se si sceglie Aggiungi canali, i canali condivisi verranno aggiunti ai canali della radio ricevente." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "In a Meshtastic LoRa Mesh there are up to 8 channels. The first one is the Primary channel where most activity happens and is required. If you don't share your primary channel your first shared channel becomes the primary channel on the other network. It talks on its primary and your secondary channel. A channel with the name 'admin' controls nodes remotely. Other channels are for private groups, each with its own key." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Um código QR Meshtastic contém a configuração LoRa e os valores do canal necessários para os rádios se comunicarem. Você pode compartilhar uma configuração completa do canal usando a opção Substituir Canais; se você escolher Adicionar Canais, seus canais compartilhados serão adicionados aos canais no rádio receptor." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -34429,18 +36850,18 @@ "value" : "משתף ערוצי משטסטיק" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Condividere i canali Meshtastic" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Sharing Meshtastic Channels" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Compartilhando Canais Meshtastis" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -34493,18 +36914,18 @@ "value" : "ניתן לשלוח הודעות ערוץ (קבוצות צ'אט) והודעות פרטיות. על הודעה ניתן לעשות לחיצה ארוכה בכדי לראות פעולות אפשריות כגון העתק, הגב, תגובה מהירה, מחק ובנוסף לראות מצב שליחה." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È possibile inviare e ricevere messaggi di canale (chat di gruppo) e messaggi diretti. Da qualsiasi messaggio è possibile premere a lungo per visualizzare le azioni disponibili, come copia, risposta, tapback e cancellazione, nonché i dettagli di consegna." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "You can send and receive channel (group chats) and direct messages. From any message you can long press to see available actions like copy, reply, tapback and delete as well as delivery details." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Você pode enviar e receber mensagens de canal (conversas em grupo) e mensagens diretas. De qualquer mensagem, você pode pressionar por um longo período para ver ações disponíveis como copiar, responder, tapback e excluir, bem como detalhes de entrega." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -34557,18 +36978,18 @@ "value" : "הודעות" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Messages" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensagens" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -34597,6 +37018,12 @@ }, "TLS Enabled" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "TLS abilitato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34617,14 +37044,35 @@ } } }, - "Topic: %@" : { - "extractionState" : "manual", + "To comply with privacy laws like CCPA and GDPR, we avoid sharing exact location data. Instead, we use anonymized or approximate (imprecise) location information to protect your privacy." : { "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "為遵守如 CCPA 和 GDPR 等隱私法規,我們避免分享精確的位置信息。取而代之,我們使用匿名化或近似(不精確)的位置資訊,以保護您的隱私。" + } + } + } + }, + "Topic: %@" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Argomento: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Тема: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "主題: %@" + } } } }, @@ -34636,6 +37084,12 @@ "value" : "Total" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Totale" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34652,6 +37106,12 @@ }, "Trace Route" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Percorso di tracciamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34668,6 +37128,12 @@ }, "Trace Route Log" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro del percorso di tracciamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34684,6 +37150,12 @@ }, "Trace Route Sent" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Traccia del percorso inviato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34700,6 +37172,12 @@ }, "Trace route sent to %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Traccia del percorso inviato a %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34716,6 +37194,12 @@ }, "Trace route to %@ was not sent." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La rotta di tracciamento verso %@ non è stata inviata." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34732,6 +37216,12 @@ }, "Trace Route was rate limited. You can send a trace route a maximum of once every thirty seconds." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La rotta di traccia era limitata dalla velocità. È possibile inviare una rotta di tracciamento al massimo una volta ogni trenta secondi." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34754,6 +37244,12 @@ "value" : "Verkehr" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Traffico" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34770,16 +37266,34 @@ }, "Transmit data (txd) GPIO pin" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dati di trasmissione (txd) Pin GPIO" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "GPIO pin за трансмисију података (txd)" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "傳送資料(TXD)GPIO 腳位" + } } } }, "Transmit Enabled" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmissione abilitata" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34802,6 +37316,12 @@ }, "Treat double tap on supported accelerometers as a user button press." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tratta il doppio tocco sugli accelerometri supportati come una pressione di un tasto utente." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34813,26 +37333,56 @@ "state" : "translated", "value" : "将支持双击的加速度计视为按下用户按钮。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "將支援的加速度計上的雙擊視為使用者按下按鈕。" + } } } }, "TriggerType" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tipo di innesco" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Тип покретача" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "觸發類型" + } } } }, "Triple Click Ad Hoc Ping" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ping ad hoc a triplo clic" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Троструки клик за Ad Hoc пинг" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "按下三次傳送即時 Ping" + } } } }, @@ -34844,6 +37394,12 @@ "value" : "Erneut versuchen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riprova" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34858,73 +37414,14 @@ } } }, - "twitter" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "טוויטר" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "X.com" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twitter" - } - } - } - }, "Two Hours" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Due ore" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34941,6 +37438,12 @@ }, "UDP Broadcast" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmissione UDP" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -34950,7 +37453,6 @@ } }, "Ukraine 433mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -34958,6 +37460,12 @@ "value" : "Ukraine 433MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ucraina 433MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34973,7 +37481,6 @@ } }, "Ukraine 868mhz" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -34981,6 +37488,12 @@ "value" : "Ukraine 868MHz" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ucraina 868MHz" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -34997,6 +37510,12 @@ }, "Un-Favorite" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non preferito" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35012,7 +37531,6 @@ } }, "United States" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -35020,6 +37538,12 @@ "value" : "United States" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stati Uniti" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35036,16 +37560,34 @@ }, "Units displayed on the device screen" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unità visualizzate sullo schermo del dispositivo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Јединице приказане на екрану уређаја" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置螢幕上顯示的單位" + } } } }, "unknown" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "sconosciuto" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35086,18 +37628,18 @@ "value" : "לא ידוע" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sconosciuto" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Nieznany" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desconhecido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -35150,18 +37692,18 @@ "value" : "גיל לא ידוע" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Età sconosciuta" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Nieznany wiek" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Idade Desconhecido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -35214,18 +37756,18 @@ "value" : "לא נקבע" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non impostato" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Nieustawiony" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Não Definido" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -35254,6 +37796,12 @@ }, "Unsupported" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non supportato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35270,6 +37818,12 @@ }, "Up Down 1" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Su Giù 1" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35281,11 +37835,23 @@ "state" : "translated", "value" : "上下一次" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "上 下 1" + } } } }, "Update Interval" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo di aggiornamento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35326,18 +37892,18 @@ "value" : "עדכן קושחה" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornare il firmware" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Zaktualizuj firmware" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Atualiza o Seu Firmware" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -35390,18 +37956,18 @@ "value" : "זמן בין עדכונים" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo di aggiornamento" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Interwał aktualizacji" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervalo de Atualização" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -35430,11 +37996,23 @@ }, "Updated Node Stats Data." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dati aggiornati sulle statistiche dei nodi." + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Ажурирани подаци о статистици чвора." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已更新的節點統計資料" + } } } }, @@ -35446,16 +38024,34 @@ "value" : "Aktualisiert: %@" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiornato: %@" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Ажуриран: %@" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已更新: %@" + } } } }, "Uplink Enabled" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uplink abilitato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35490,10 +38086,10 @@ "value" : "Uptime" } }, - "pt-PT" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Tempo No Ár" + "value" : "Tempo di attività" } }, "se" : { @@ -35518,6 +38114,12 @@ }, "Uptime" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempo di attività" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35534,6 +38136,12 @@ }, "Use a PWM output (like the RAK Buzzer) for tunes instead of an on/off output. This will ignore the output, output duration and active settings and use the device config buzzer GPIO option instead." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizzare un'uscita PWM (come il cicalino RAK) per le sintonie invece di un'uscita on/off. In questo modo si ignorano le impostazioni di uscita, durata e attivazione e si utilizza invece l'opzione GPIO del buzzer configurata dal dispositivo." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35545,21 +38153,45 @@ "state" : "translated", "value" : "使用 PWM 输出(如 RAK 蜂鸣器)代替开/关输出进行调谐。这将忽略输出、输出持续时间和激活设置,而使用设备配置蜂鸣器 GPIO 选项。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用 PWM 輸出(如 RAK 蜂鳴器)來播放音樂,而非開/關輸出。這將忽略輸出、輸出持續時間和啟用設定,改為使用裝置配置中的蜂鳴器 GPIO 選項。" + } } } }, "Use I2S As Buzzer" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizzare I2S come cicalino" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Користи I2S као звучник" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用 I2S 作為蜂鳴器" + } } } }, "Use Preset" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizzare la preimpostazione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35582,6 +38214,12 @@ }, "Use PWM Buzzer" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizzare il cicalino PWM" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35593,11 +38231,23 @@ "state" : "translated", "value" : "使用 PWM 蜂鸣器" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用 PWM 蜂鳴器" + } } } }, "Used to create a shared key with a remote device." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si usa per creare una chiave condivisa con un dispositivo remoto." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35638,18 +38288,18 @@ "value" : "משתמש" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utente" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Użytkownik" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Utilizador" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -35678,6 +38328,12 @@ }, "User Config" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione utente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35700,6 +38356,12 @@ }, "User Details" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dettagli utente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35722,6 +38384,12 @@ }, "User Id" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Id utente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35743,8 +38411,13 @@ } }, "User Initiated Disconnect" : { - "extractionState" : "manual", "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disconnessione avviata dall'utente" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35756,86 +38429,109 @@ "state" : "translated", "value" : "用户主动断开连接" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用者主動斷線" + } } } }, - "user.details" : { - "extractionState" : "manual", + "Username" : { "localizations" : { "de" : { "stringUnit" : { "state" : "translated", - "value" : "Benutzer Details" + "value" : "Benutzername" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "User Details" + "value" : "Username" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Détails de l'utilisateur" + "value" : "Nom d'utilisateur" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "פרטי משתמש" + "value" : "שם משתמש" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome utente" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Szczegóły użytkownika" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dados do Utilizador" + "value" : "Nazwa użytkownika" } }, "se" : { "stringUnit" : { "state" : "translated", - "value" : "Användaruppgifter" + "value" : "Användarnamn" } }, "sr" : { "stringUnit" : { "state" : "translated", - "value" : "Кориснички детаљи" + "value" : "Корисничко име" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "用户信息" + "value" : "用户名称" } }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "使用者資料" + "value" : "使用者名稱" } } } }, "Uses pullup resistor" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizza una resistenza di pullup" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Користи pull-up отпорник" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "使用上拉電阻" + } } } }, "Utilizes the network connection on your phone to connect to MQTT." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizza la connessione di rete del telefono per connettersi a MQTT." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35864,6 +38560,12 @@ "value" : "Fahrzeugsteuerkurs" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Direzione del veicolo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35886,6 +38588,12 @@ "value" : "Fahrzeuggeschwindigkeit" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velocità del veicolo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35904,10 +38612,16 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", "value" : "Version %1$@ includes substantial network optimizations and extensive changes to devices and client apps. Only nodes version %2$@ and above are supported." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La versione %1$@ include sostanziali ottimizzazioni di rete e modifiche estese ai dispositivi e alle applicazioni client. Sono supportati solo i nodi versione %2$@ e superiori." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35929,7 +38643,6 @@ } }, "Version: %@ (%@) " : { - "comment" : "In the \"About\" under \"Apple Apps\"", "localizations" : { "de" : { "stringUnit" : { @@ -35939,10 +38652,16 @@ }, "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", "value" : "Version: %1$@ (%2$@) " } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versione: %1$@ (%2$@) " + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35964,7 +38683,6 @@ } }, "very.long.range.slow" : { - "extractionState" : "manual", "localizations" : { "en" : { "stringUnit" : { @@ -35972,6 +38690,12 @@ "value" : "Very Long Range - Slow" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "A lunghissimo raggio - Lento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -35994,6 +38718,12 @@ "value" : "Via Lora" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Via Lora" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36016,6 +38746,12 @@ "value" : "Via Mqtt" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Via Mqtt" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36062,18 +38798,18 @@ "value" : "וולטז'" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tensione" + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Napięcie" } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tensão" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -36102,6 +38838,12 @@ }, "Voltage" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tensione" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36118,6 +38860,12 @@ }, "Volts %@" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Volt %@" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -36152,18 +38900,18 @@ "value" : "ממתין. . ." } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In attesa. . ." + } + }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Czekam. . ." } }, - "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "À Espara. . ." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -36192,6 +38940,12 @@ }, "Waiting to be acknowledged. . ." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In attesa di essere riconosciuti. . ." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36208,6 +38962,12 @@ }, "Wake Screen on tap or motion" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Svegliare lo schermo al tocco o al movimento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36230,6 +38990,12 @@ "value" : "Wegpunktoptionen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni Waypoint" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36252,6 +39018,12 @@ "value" : "Wetterverhältnisse" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Condizioni meteo" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36274,16 +39046,34 @@ }, "Web Flasher" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lampeggiatore web" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Веб флашер" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "網頁刷機工具" + } } } }, "Website" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sito web" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36306,6 +39096,12 @@ }, "Weight" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Peso" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -36322,6 +39118,12 @@ "value" : "Was bedeutet das Schloß?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Che cosa significa il lucchetto?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36350,6 +39152,12 @@ "value" : "Was ist Meshtastic?" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Che cos'è Meshtastic?" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36372,6 +39180,12 @@ }, "What licensed operator mode does:\n* Sets the node name to your call sign \n* Broadcasts node info every 10 minutes \n* Overrides frequency, dutycycle and tx power \n* Disables encryption" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cosa fa la modalità operatore con licenza:\n* Imposta il nome del nodo con il proprio nominativo\n* Trasmette informazioni sul nodo ogni 10 minuti\n* Sovrascrive la frequenza, il dutycycle e la potenza di trasmissione\n* Disabilita la crittografia" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36394,6 +39208,12 @@ }, "When using in GPIO mode, keep the output on for this long. " : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quando si utilizza la modalità GPIO, mantenere l'uscita attiva per questo tempo. " + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36405,16 +39225,34 @@ "state" : "translated", "value" : "在 GPIO 模式下使用时,请将输出保持接通这么长时间。" } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 GPIO 模式下,保持輸出啟用這麼長時間。" + } } } }, "Whether or not use INPUT_PULLUP mode for GPIO pin. Only applicable if the board uses pull-up resistors on the pin" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizza o meno la modalità INPUT_PULLUP per il pin GPIO. Si applica solo se la scheda utilizza resistenze di pull-up sul pin" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Да ли се користи режим INPUT_PULLUP за GPIO пин. Примењује се само ако плоча користи pull-up отпорнике на пину." } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "是否使用 INPUT_PULLUP 模式來設定 GPIO 腳位。僅在板子使用上拉電阻時適用。" + } } } }, @@ -36426,6 +39264,12 @@ "value" : "WiFi Optionen" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni WiFi" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36442,6 +39286,12 @@ }, "Wind" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vento" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -36458,6 +39308,12 @@ "value" : "Windrichtung" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Direzione del vento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36480,6 +39336,12 @@ "value" : "Windgeschwindigkeit" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velocità del vento" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36496,6 +39358,12 @@ }, "x" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "x" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36514,7 +39382,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "X: %1$@, Y: %2$d" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "X: %1$@, Y: %2$d" } }, @@ -36542,7 +39416,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "X: %1$@, Y: %2$f" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "X: %1$@, Y: %2$f" } }, @@ -36570,7 +39450,13 @@ "localizations" : { "en" : { "stringUnit" : { - "state" : "new", + "state" : "translated", + "value" : "X: %1$@, Y: %2$lld" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", "value" : "X: %1$@, Y: %2$lld" } }, @@ -36596,6 +39482,12 @@ }, "y" : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "y" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36624,6 +39516,12 @@ "value" : "Gestern" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ieri" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36640,6 +39538,12 @@ }, "You can also update your Meshtastic device over bluetooth using the Nordic DFU app." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È anche possibile aggiornare il dispositivo Meshtastic tramite bluetooth utilizzando l'applicazione Nordic DFU." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36662,6 +39566,12 @@ }, "Your current location will be set as the fixed position and broadcast over the mesh on the position interval." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La posizione attuale viene impostata come posizione fissa e trasmessa sulla mesh nell'intervallo di posizione." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36690,6 +39600,12 @@ "value" : "Deine Firmware ist aktuell" } }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il firmware è aggiornato" + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36712,6 +39628,12 @@ }, "Your MQTT Server must support TLS." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il server MQTT deve supportare TLS." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36726,8 +39648,24 @@ } } }, + "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name." : { + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "您的節點將定期向配置的 MQTT 伺服器發送未加密的地圖報告封包,內容包括 ID、簡短名稱和完整名稱、大略位置、硬體型號、角色(Role)、韌體版本、LoRa 區域、Modem預設值以及主要頻道名稱。" + } + } + } + }, "Your node’s operating frequency is calculated based on the region, modem preset, and this field. When 0, the slot is automatically calculated based on the primary channel name." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La frequenza operativa del nodo viene calcolata in base alla regione, alla preimpostazione del modem e a questo campo. Se il campo è 0, lo slot viene calcolato automaticamente in base al nome del canale primario." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36744,6 +39682,12 @@ }, "Your position has been sent with a request for a response with their position. You will receive a notification when a position is returned." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La vostra posizione è stata inviata con una richiesta di risposta con la loro posizione. Riceverete una notifica quando la posizione verrà restituita." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36766,6 +39710,12 @@ }, "Your region has a %lld%% duty cycle. MQTT is not advised when you are duty cycle restricted, the extra traffic will quickly overwhelm your LoRa mesh." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La vostra regione ha un ciclo di lavoro di %lld%%. MQTT è sconsigliato quando il ciclo di lavoro è limitato, perché il traffico extra sovraccaricherà rapidamente la rete LoRa." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36788,6 +39738,12 @@ }, "Your region has a %lld%% hourly duty cycle, your radio will stop sending packets when it reaches the hourly limit." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La regione ha un ciclo di funzionamento orario del %lld%%; la radio smette di inviare pacchetti quando raggiunge il limite orario." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36804,6 +39760,12 @@ }, "Your route file must have both Latitude and Longitude columns and headers." : { "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il file di percorso deve avere entrambe le colonne Latitudine e Longitudine e le intestazioni." + } + }, "sr" : { "stringUnit" : { "state" : "translated", @@ -36820,4 +39782,4 @@ } }, "version" : "1.0" -} +} \ No newline at end of file From ea24117be96fac4cc20b61f455e5ebfb8d6e9d6a Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 27 Apr 2025 09:11:54 -0700 Subject: [PATCH 43/93] Remove so more translation keys --- Localizable.xcstrings | 476 ++++++++--------------- Meshtastic/Enums/ChannelRoles.swift | 6 +- Meshtastic/Views/ContentView.swift | 2 +- Meshtastic/Views/Settings/Settings.swift | 2 +- 4 files changed, 169 insertions(+), 317 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index a29691fb..0e1c3b63 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -5210,198 +5210,6 @@ } } }, - "channel.role.disabled" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Deaktiviert" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Disabled" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Désactivé" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "כבוי" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Disattivato" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wyłączony" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inaktiverad" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Онемогућено" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "禁用" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "關閉" - } - } - } - }, - "channel.role.primary" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Primär" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Primary" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Principal" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "עיקרי" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Primario" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Podstawowy" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Primär" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Примарни" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "主要" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "主要" - } - } - } - }, - "channel.role.secondary" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sekundär" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Secondary" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Secondaire" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "משני" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Secondario" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wtórny" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sekundär" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Секундарни" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "次要" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "次要" - } - } - } - }, "channel.utilization" : { "localizations" : { "de" : { @@ -10913,13 +10721,43 @@ "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ausgeschaltet" + "value" : "Deaktiviert" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disabled" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Désactivé" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "כבוי" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Disabili" + "value" : "Disattivato" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wyłączony" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inaktiverad" } }, "sr" : { @@ -10937,7 +10775,7 @@ "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "已停用" + "value" : "關閉" } } } @@ -18572,27 +18410,21 @@ }, "Japan" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Japan" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Giappone" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Јапан" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "日本" } } @@ -27424,21 +27256,57 @@ }, "Primary" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Primär" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Principal" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "עיקרי" + } + }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Primario" } }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Podstawowy" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Primär" + } + }, "sr" : { "stringUnit" : { - "state" : "translated", - "value" : "Основни" + "state" : "needs_review", + "value" : "Примарни" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "主要" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "主要" } } @@ -28690,61 +28558,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Antworten" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reply" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Répondre" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "תגובה" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Risposta" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Odpowiedz" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Svara" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Одговори" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "回复" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "回覆" } } @@ -30706,27 +30568,21 @@ }, "Russia" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Russia" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Russia" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Русија" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "俄羅斯" } } @@ -31280,18 +31136,60 @@ }, "Secondary" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sekundär" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Secondary" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Secondaire" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "משני" + } + }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Secondario" } }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wtórny" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sekundär" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Секундарни" } }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "次要" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -32890,7 +32788,7 @@ } } }, - "settings" : { + "Settings" : { "localizations" : { "de" : { "stringUnit" : { @@ -32954,22 +32852,6 @@ } } }, - "Settings" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Impostazioni" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "設定" - } - } - } - }, "Share QR Code & Link" : { "localizations" : { "de" : { @@ -34336,27 +34218,21 @@ }, "Taiwan" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taiwan" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Taiwan" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Тајван" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "臺灣 🇹🇼" } } @@ -34388,61 +34264,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Tapback Antwort" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tapback Response" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Réponse de Tapback" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "תגובה מהירה" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Risposta di Tapback" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Odpowiedź na stuknięcie" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Svarsreaktion" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Реакција додиром" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "响应" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "表情回應" } } @@ -35410,27 +35280,21 @@ }, "Thailand" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thailand" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Thailandia" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Тајланд" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "泰國" } } @@ -36336,61 +36200,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Zeitlimit erreicht" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Timeout" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Délai d'expiration" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "זמן קצוב" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Timeout" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Limit czasu" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Tidsgräns överskriden" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Временско ограничење" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "超时" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "逾時長度" } } @@ -36422,61 +36280,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Zeitstempel" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Timestamp" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Horodatage" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "שעה/תאריך" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Timestamp" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Znacznik czasu" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Tidsstämpel" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Временска ознака" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "时间戳" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "時間戳記" } } diff --git a/Meshtastic/Enums/ChannelRoles.swift b/Meshtastic/Enums/ChannelRoles.swift index 186cff0b..ea1c0e8b 100644 --- a/Meshtastic/Enums/ChannelRoles.swift +++ b/Meshtastic/Enums/ChannelRoles.swift @@ -19,11 +19,11 @@ enum ChannelRoles: Int, CaseIterable, Identifiable { switch self { case .disabled: - return "channel.role.disabled".localized + return "Disabled".localized case .primary: - return "channel.role.primary".localized + return "Primary".localized case .secondary: - return "channel.role.secondary".localized + return "Secondary".localized } } func protoEnumValue() -> Channel.Role { diff --git a/Meshtastic/Views/ContentView.swift b/Meshtastic/Views/ContentView.swift index 50734893..692b1749 100644 --- a/Meshtastic/Views/ContentView.swift +++ b/Meshtastic/Views/ContentView.swift @@ -54,7 +54,7 @@ struct ContentView: View { router: appState.router ) .tabItem { - Label("settings", systemImage: "gear") + Label("Settings", systemImage: "gear") .font(.title) } .tag(NavigationState.Tab.settings) diff --git a/Meshtastic/Views/Settings/Settings.swift b/Meshtastic/Views/Settings/Settings.swift index 8ebcfd83..0ebac5a8 100644 --- a/Meshtastic/Views/Settings/Settings.swift +++ b/Meshtastic/Views/Settings/Settings.swift @@ -542,7 +542,7 @@ struct Settings: View { } } } - .navigationTitle("settings") + .navigationTitle("Settings") .navigationBarItems( leading: MeshtasticLogo().onLongPressGesture(minimumDuration: 1.0) { self.moduleOverride.toggle() From 43c8ed37248bf8627b7aeabc2cc8ab1434a5838c Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 27 Apr 2025 09:32:59 -0700 Subject: [PATCH 44/93] Additionaltranslatin key cleanup --- Localizable.xcstrings | 490 ++++++------------ .../Enums/CannedMessagesConfigEnums.swift | 2 +- Meshtastic/Enums/PositionConfigEnums.swift | 4 +- Meshtastic/Views/Bluetooth/Connect.swift | 2 +- Meshtastic/Views/Helpers/PowerMetrics.swift | 4 +- Meshtastic/Views/Messages/ChannelList.swift | 2 +- Meshtastic/Views/Messages/Messages.swift | 2 +- .../Views/Nodes/Helpers/NodeDetail.swift | 2 +- Meshtastic/Views/Settings/Channels.swift | 2 +- Meshtastic/Views/Settings/RouteRecorder.swift | 2 +- Meshtastic/Views/Settings/Settings.swift | 2 +- 11 files changed, 161 insertions(+), 353 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 0e1c3b63..440ebedb 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -4332,70 +4332,6 @@ } } }, - "canned.messages.preset.cardkb" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "M5 Stack Card KB / RAK Tastenfeld" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "M5 Stack Card KB / RAK Keypad" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Clavier M5 Stack Card KB / RAK" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "M5 Stack Card KB / RAK Keypad" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "M5 Stack Card KB / Tastiera RAK" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "M5 Stack Card KB / RAK Keypad" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "M5 Stack Card KB / RAK Keypad" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "M5 стек картица KB / RAK тастатура" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "M5 Stack 卡片键盘 / RAK 键盘" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "M5Stack 卡片鍵盤 / RAK 鍵盤" - } - } - } - }, "canned.messages.preset.manual" : { "localizations" : { "de" : { @@ -5274,65 +5210,59 @@ } } }, - "channels" : { + "Channels" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Kanäle" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Channels" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Canaux" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "ערוצים" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Canali" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Kanały" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Kanaler" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Канали" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "频道" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "頻道" } } @@ -10720,61 +10650,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Deaktiviert" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Disabled" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Désactivé" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "כבוי" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Disattivato" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Wyłączony" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Inaktiverad" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Онемогућено" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "禁用" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "關閉" } } @@ -10784,61 +10708,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Trennen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Disconnect" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Déconnecter" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "התנתק" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Disconnessione" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Rozłącz" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Koppla från" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Прекините везу" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "断开连接" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "斷開連接" } } @@ -10848,61 +10766,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Tastatur ausblenden" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dismiss" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Annuler" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "סגור מקלדת" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Sospendere" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Zamknij" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Stäng" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Отпусти" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "收起键盘" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "隱藏鍵盤" } } @@ -10912,61 +10824,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Display (Device Screen)" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Display" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Écran" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "צג מכשיר" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Display" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Wyświetlacz (Ekran Urządzenia)" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Skärm" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Приказ" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "显示" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "螢幕" } } @@ -11630,61 +11536,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Aktiviert" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enabled" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Activé" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "מופעל" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Abilitato" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Włączony" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Aktiverad" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Омогућено" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "启用" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "啟用" } } @@ -12928,65 +12828,59 @@ } } }, - "finish" : { + "Finish" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Beenden" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Finish" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Terminer" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "סיים" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Fine" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Finish" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Avsluta" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Заврши" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Finish" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "完成" } } @@ -13088,65 +12982,59 @@ } } }, - "firmware.version" : { + "Firmware Version" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Firmware Version" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Firmware Version" } }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Version du firmware" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "גרסת קושחה" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Versione del firmware" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Wersja Oprogramowania" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Firmwareversion" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Верзија фирмвера" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "固件版本" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "韌體版本" } } @@ -13270,61 +13158,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Feste PIN" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fixed PIN" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Code PIN fixe" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "קוד קבוע" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "PIN fisso" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Stały PIN" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Fast PIN" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Фиксни ПИН" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "固定 PIN 码" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "固定 PIN 碼" } } @@ -14462,122 +14344,6 @@ } } }, - "gpsmode.disabled" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ausgeschaltet" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Disabled" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Désactivé" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "כבוי" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Disabili" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inaktiverad" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Онемогућен" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "禁用" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "已停用" - } - } - } - }, - "gpsmode.enabled" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eingeschaltet" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enabled" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activé" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מופעל" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abilitato" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aktiverad" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Омогућен" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "启用" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "已啟用" - } - } - } - }, "gpsmode.notPresent" : { "localizations" : { "en" : { @@ -20000,6 +19766,70 @@ } } }, + "M5 Stack Card KB / RAK Keypad" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "M5 Stack Card KB / RAK Tastenfeld" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "M5 Stack Card KB / RAK Keypad" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Clavier M5 Stack Card KB / RAK" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "M5 Stack Card KB / RAK Keypad" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "M5 Stack Card KB / Tastiera RAK" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "M5 Stack Card KB / RAK Keypad" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "M5 Stack Card KB / RAK Keypad" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "M5 стек картица KB / RAK тастатура" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "M5 Stack 卡片键盘 / RAK 键盘" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "M5Stack 卡片鍵盤 / RAK 鍵盤" + } + } + } + }, "Malaysia 433mhz" : { "localizations" : { "en" : { @@ -38624,7 +38454,7 @@ } } }, - "voltage" : { + "Voltage" : { "localizations" : { "de" : { "stringUnit" : { @@ -38688,28 +38518,6 @@ } } }, - "Voltage" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tensione" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Напон" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電壓" - } - } - } - }, "Volts %@" : { "localizations" : { "it" : { diff --git a/Meshtastic/Enums/CannedMessagesConfigEnums.swift b/Meshtastic/Enums/CannedMessagesConfigEnums.swift index f197eced..15edbe4c 100644 --- a/Meshtastic/Enums/CannedMessagesConfigEnums.swift +++ b/Meshtastic/Enums/CannedMessagesConfigEnums.swift @@ -23,7 +23,7 @@ enum ConfigPresets: Int, CaseIterable, Identifiable { case .rakRotaryEncoder: return "canned.messages.preset.rakrotary".localized case .cardKB: - return "canned.messages.preset.cardkb".localized + return "M5 Stack Card KB / RAK Keypad".localized } } } diff --git a/Meshtastic/Enums/PositionConfigEnums.swift b/Meshtastic/Enums/PositionConfigEnums.swift index 4853d050..7e587a08 100644 --- a/Meshtastic/Enums/PositionConfigEnums.swift +++ b/Meshtastic/Enums/PositionConfigEnums.swift @@ -110,9 +110,9 @@ enum GpsMode: Int, CaseIterable, Equatable { var description: String { switch self { case .disabled: - return "gpsmode.disabled".localized + return "Disabled".localized case .enabled: - return "gpsmode.enabled".localized + return "Eenabled".localized case .notPresent: return "gpsmode.notPresent".localized } diff --git a/Meshtastic/Views/Bluetooth/Connect.swift b/Meshtastic/Views/Bluetooth/Connect.swift index 880faf8d..6dacb044 100644 --- a/Meshtastic/Views/Bluetooth/Connect.swift +++ b/Meshtastic/Views/Bluetooth/Connect.swift @@ -67,7 +67,7 @@ struct Connect: View { Text("BLE Name").font(.callout)+Text(": \(bleManager.connectedPeripheral?.peripheral.name?.addingVariationSelectors ?? "unknown".localized)") .font(.callout).foregroundColor(Color.gray) if node != nil { - Text("firmware.version").font(.callout)+Text(": \(node?.metadata?.firmwareVersion ?? "unknown".localized)") + Text("Firmware Version").font(.callout)+Text(": \(node?.metadata?.firmwareVersion ?? "unknown".localized)") .font(.callout).foregroundColor(Color.gray) } if bleManager.isSubscribed { diff --git a/Meshtastic/Views/Helpers/PowerMetrics.swift b/Meshtastic/Views/Helpers/PowerMetrics.swift index 7f9fdcdd..e85c0f6a 100644 --- a/Meshtastic/Views/Helpers/PowerMetrics.swift +++ b/Meshtastic/Views/Helpers/PowerMetrics.swift @@ -69,8 +69,8 @@ struct PowerMetrics: View { } enum PowerMetricType: String { - case current = "current" - case voltage = "voltage" + case current = "Current" + case voltage = "Voltage" } struct PowerMetricCompactWidget: View { diff --git a/Meshtastic/Views/Messages/ChannelList.swift b/Meshtastic/Views/Messages/ChannelList.swift index 426cb0c7..f4194dc3 100644 --- a/Meshtastic/Views/Messages/ChannelList.swift +++ b/Meshtastic/Views/Messages/ChannelList.swift @@ -154,6 +154,6 @@ struct ChannelList: View { .listStyle(.plain) } } - .navigationTitle("channels") + .navigationTitle("Channels") } } diff --git a/Meshtastic/Views/Messages/Messages.swift b/Meshtastic/Views/Messages/Messages.swift index 1267d3e2..6142617b 100644 --- a/Meshtastic/Views/Messages/Messages.swift +++ b/Meshtastic/Views/Messages/Messages.swift @@ -35,7 +35,7 @@ struct Messages: View { List(selection: $router.navigationState.messages) { NavigationLink(value: MessagesNavigationState.channels()) { Label { - Text("channels") + Text("Channels") .badge(unreadChannelMessages) .font(.title2) .padding() diff --git a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift index 10c0b569..7f834de9 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift @@ -120,7 +120,7 @@ struct NodeDetail: View { if let metadata = node.metadata { HStack { Label { - Text("firmware.version") + Text("Firmware Version") } icon: { Image(systemName: "memorychip") .symbolRenderingMode(.multicolor) diff --git a/Meshtastic/Views/Settings/Channels.swift b/Meshtastic/Views/Settings/Channels.swift index 551b9ab4..19c56a7b 100644 --- a/Meshtastic/Views/Settings/Channels.swift +++ b/Meshtastic/Views/Settings/Channels.swift @@ -279,7 +279,7 @@ struct Channels: View { .padding() } } - .navigationTitle("channels") + .navigationTitle("Channels") .navigationBarItems(trailing: ZStack { ConnectedDevice(bluetoothOn: bleManager.isSwitchedOn, deviceConnected: bleManager.connectedPeripheral != nil, name: (bleManager.connectedPeripheral != nil) ? bleManager.connectedPeripheral.shortName : "?") diff --git a/Meshtastic/Views/Settings/RouteRecorder.swift b/Meshtastic/Views/Settings/RouteRecorder.swift index 8cee2eeb..4a1f2b96 100644 --- a/Meshtastic/Views/Settings/RouteRecorder.swift +++ b/Meshtastic/Views/Settings/RouteRecorder.swift @@ -250,7 +250,7 @@ struct RouteRecorder: View { } isShowingDetails = false } label: { - Label("finish", systemImage: "flag.checkered") + Label("Finish", systemImage: "flag.checkered") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Settings/Settings.swift b/Meshtastic/Views/Settings/Settings.swift index 0ebac5a8..715b74e2 100644 --- a/Meshtastic/Views/Settings/Settings.swift +++ b/Meshtastic/Views/Settings/Settings.swift @@ -78,7 +78,7 @@ struct Settings: View { NavigationLink(value: SettingsNavigationState.channels) { Label { - Text("channels") + Text("Channels") } icon: { Image(systemName: "fibrechannel") } From 5498b712c944ecd81dac24b676b97c60f8053eb0 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 27 Apr 2025 09:57:49 -0700 Subject: [PATCH 45/93] Clean up additional transation keys --- Localizable.xcstrings | 586 +++++------------- Meshtastic/Enums/PositionConfigEnums.swift | 2 +- Meshtastic/Tips/MessagesTips.swift | 2 +- .../Views/Settings/Channels/ChannelForm.swift | 4 +- .../Settings/Config/Module/SerialConfig.swift | 2 +- .../Settings/Config/PositionConfig.swift | 2 +- Meshtastic/Views/Settings/Settings.swift | 2 +- 7 files changed, 178 insertions(+), 422 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 440ebedb..67d828e7 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -668,13 +668,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "%@ Die App wird automatisch wieder zum präferierten Gerät verbinden, sobald es in Reichweite kommt." } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "%@ L'application se reconnectera automatiquement à la radio en favori dès qu'elle sera à nouveau disponible." } }, @@ -726,13 +726,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "%@ Dieser Fehler kann üblicherweise behoben werden, indem man unter Einstellungen > Bluetooth die Verbindung manuell löscht und sich erneut mit dem Gerät verbindet." } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "%@ Cette erreur ne peut généralement pas être corrigée sans aller dans Réglages > Bluetooth et faire > Oublier cet appareil, puis reconnecter la radio." } }, @@ -2224,13 +2224,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Airtime" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Temps d'émission" } }, @@ -2688,13 +2688,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Immer an" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "En permanence" } }, @@ -2774,13 +2774,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ambient Lighting" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Lumière ambiante" } }, @@ -2832,13 +2832,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ambient Lighting Config" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Configuration de la lumière ambiante" } }, @@ -3154,13 +3154,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Bist Du sicher?" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Êtes-vous sûr ?" } }, @@ -3290,13 +3290,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Geräte in der Nähe" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Radios disponibles" } }, @@ -3466,13 +3466,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Batterie Ladung" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Niveau de batterie" } }, @@ -3580,13 +3580,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "BLE Name" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nom du BLE" } }, @@ -3638,13 +3638,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Die Bluetooth Pin muss 6 Stellen lang sein." } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Le code pin BLE doit avoir 6 chiffres." } }, @@ -3810,13 +3810,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Bluetooth Konfiguration" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Configuration Bluetooth" } }, @@ -3868,13 +3868,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Bluetooth ist aus" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Le Bluetooth est arrêté" } }, @@ -4048,13 +4048,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Bytes" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Octets" } }, @@ -4162,13 +4162,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Abbrechen" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Annuler" } }, @@ -4220,13 +4220,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Canned Messages" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Messages préformatés" } }, @@ -4278,13 +4278,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Canned Messages Config" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Configuration des messages préformatés" } }, @@ -4652,13 +4652,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Kanal" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Canal" } }, @@ -5214,13 +5214,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Kanäle" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Canaux" } }, @@ -5256,13 +5256,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "频道" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "頻道" } } @@ -9976,7 +9976,7 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Noeud d'infrastructure qui étend la couverture du réseau en relayant les messages avec un minimum de surcharge. Invisible dans la liste des noeuds." } }, @@ -10040,7 +10040,7 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Noeud d'infrastructure qui étend la couverture du réseau en relayant les messages. Visible dans la liste des noeuds." } }, @@ -10650,13 +10650,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Deaktiviert" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Désactivé" } }, @@ -10692,13 +10692,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "禁用" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "關閉" } } @@ -10708,13 +10708,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Trennen" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Déconnecter" } }, @@ -10750,13 +10750,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "断开连接" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "斷開連接" } } @@ -10766,13 +10766,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Tastatur ausblenden" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Annuler" } }, @@ -10808,13 +10808,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "收起键盘" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "隱藏鍵盤" } } @@ -10824,13 +10824,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Display (Device Screen)" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Écran" } }, @@ -10866,13 +10866,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "显示" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "螢幕" } } @@ -11536,13 +11536,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Aktiviert" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Activé" } }, @@ -11578,13 +11578,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "启用" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "啟用" } } @@ -12832,13 +12832,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Beenden" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Terminer" } }, @@ -12880,7 +12880,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "完成" } } @@ -12986,13 +12986,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Firmware Version" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Version du firmware" } }, @@ -13028,13 +13028,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "固件版本" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "韌體版本" } } @@ -13158,13 +13158,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Feste PIN" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Code PIN fixe" } }, @@ -13200,13 +13200,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "固定 PIN 码" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "固定 PIN 碼" } } @@ -14344,58 +14344,6 @@ } } }, - "gpsmode.notPresent" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Not Present" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Absent" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "לא קיים" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Non presente" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inte närvarande" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Није пристуно" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "不存在" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "無模組" - } - } - } - }, "Group Message" : { "localizations" : { "de" : { @@ -18190,7 +18138,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "日本" } } @@ -23368,70 +23316,6 @@ } } }, - "mqtt" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT" - } - } - } - }, "MQTT" : { "localizations" : { "it" : { @@ -23632,70 +23516,6 @@ } } }, - "name" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Name" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Name" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nom" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שם" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nazwa" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Namn" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Име" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "名称" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "名稱" - } - } - } - }, "Name" : { "localizations" : { "de" : { @@ -24722,6 +24542,52 @@ } } }, + "Not Present" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Absent" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "לא קיים" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Non presente" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Inte närvarande" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Није пристуно" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "不存在" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "無模組" + } + } + } + }, "not.connected" : { "localizations" : { "de" : { @@ -27088,13 +26954,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Primär" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Principal" } }, @@ -27130,13 +26996,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "主要" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "主要" } } @@ -28388,13 +28254,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Antworten" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Répondre" } }, @@ -28430,13 +28296,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "回复" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "回覆" } } @@ -30412,7 +30278,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "俄羅斯" } } @@ -34062,7 +33928,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "臺灣 🇹🇼" } } @@ -34094,13 +33960,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Tapback Antwort" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Réponse de Tapback" } }, @@ -34136,13 +34002,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "响应" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "表情回應" } } @@ -35124,7 +34990,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "泰國" } } @@ -36026,7 +35892,7 @@ } } }, - "timeout" : { + "Timeout" : { "localizations" : { "de" : { "stringUnit" : { @@ -36078,45 +35944,23 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "逾時長度" } } } }, - "timestamp" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "timestamp" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "временска ознака" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "時間戳記" - } - } - } - }, "Timestamp" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Zeitstempel" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Horodatage" } }, @@ -36152,13 +35996,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "时间戳" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "時間戳記" } } @@ -36634,70 +36478,6 @@ } } }, - "tip.messages.title" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nachrichten" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messages" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messages" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הודעות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messaggi" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messages" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Meddelanden" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Поруке" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "消息" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "訊息" - } - } - } - }, "TLS Enabled" : { "localizations" : { "it" : { @@ -37214,27 +36994,21 @@ }, "United States" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "United States" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Stati Uniti" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Сједињене Америчке државе" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "美國" } } @@ -37288,61 +37062,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Unknown" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Unknown" } }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Inconnu" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "לא ידוע" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Sconosciuto" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nieznany" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Okänd" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Непознато" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "未知" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "未知" } } @@ -38124,61 +37892,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Benutzername" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Username" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nom d'utilisateur" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "שם משתמש" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nome utente" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nazwa użytkownika" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Användarnamn" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Корисничко име" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "用户名称" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "使用者名稱" } } @@ -38458,61 +38220,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Voltage" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Voltage" } }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Tension" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "וולטז'" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Tensione" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Napięcie" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Spänning" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Напон" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "电压" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "電壓" } } diff --git a/Meshtastic/Enums/PositionConfigEnums.swift b/Meshtastic/Enums/PositionConfigEnums.swift index 7e587a08..43f9f73e 100644 --- a/Meshtastic/Enums/PositionConfigEnums.swift +++ b/Meshtastic/Enums/PositionConfigEnums.swift @@ -114,7 +114,7 @@ enum GpsMode: Int, CaseIterable, Equatable { case .enabled: return "Eenabled".localized case .notPresent: - return "gpsmode.notPresent".localized + return "Not Present".localized } } func protoEnumValue() -> Config.PositionConfig.GpsMode { diff --git a/Meshtastic/Tips/MessagesTips.swift b/Meshtastic/Tips/MessagesTips.swift index ddbe9feb..a470dcaa 100644 --- a/Meshtastic/Tips/MessagesTips.swift +++ b/Meshtastic/Tips/MessagesTips.swift @@ -13,7 +13,7 @@ struct MessagesTip: Tip { return "tip.messages" } var title: Text { - Text("tip.messages.title") + Text("Messages") } var message: Text? { Text("tip.messages.message") diff --git a/Meshtastic/Views/Settings/Channels/ChannelForm.swift b/Meshtastic/Views/Settings/Channels/ChannelForm.swift index 06a4a260..0b449274 100644 --- a/Meshtastic/Views/Settings/Channels/ChannelForm.swift +++ b/Meshtastic/Views/Settings/Channels/ChannelForm.swift @@ -30,7 +30,7 @@ struct ChannelForm: View { Form { Section(header: Text("channel details")) { HStack { - Text("name") + Text("Name") Spacer() TextField( "Channel Name", @@ -170,7 +170,7 @@ struct ChannelForm: View { } } } - Section(header: Text("mqtt")) { + Section(header: Text("MQTT")) { Toggle(isOn: $uplink) { Label("Uplink Enabled", systemImage: "arrowshape.up") } diff --git a/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift b/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift index d8ca379d..06b4b06a 100644 --- a/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift @@ -53,7 +53,7 @@ struct SerialConfig: View { } .pickerStyle(DefaultPickerStyle()) .listRowSeparator(/*@START_MENU_TOKEN@*/.visible/*@END_MENU_TOKEN@*/) - Picker("timeout", selection: $timeout ) { + Picker("Timeout", selection: $timeout ) { ForEach(SerialTimeoutIntervals.allCases) { sti in Text(sti.description) } diff --git a/Meshtastic/Views/Settings/Config/PositionConfig.swift b/Meshtastic/Views/Settings/Config/PositionConfig.swift index db0574c7..d8e6ad9f 100644 --- a/Meshtastic/Views/Settings/Config/PositionConfig.swift +++ b/Meshtastic/Views/Settings/Config/PositionConfig.swift @@ -210,7 +210,7 @@ struct PositionConfig: View { } Toggle(isOn: $includeTimestamp) { // 128 - Label("timestamp", systemImage: "clock") + Label("Timestamp", systemImage: "clock") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) .onChange(of: includeTimestamp) { _, newIncludeTimestamp in diff --git a/Meshtastic/Views/Settings/Settings.swift b/Meshtastic/Views/Settings/Settings.swift index 715b74e2..5a5b6aec 100644 --- a/Meshtastic/Views/Settings/Settings.swift +++ b/Meshtastic/Views/Settings/Settings.swift @@ -209,7 +209,7 @@ struct Settings: View { if isModuleSupported(.mqttConfig) { NavigationLink(value: SettingsNavigationState.mqtt) { Label { - Text("mqtt") + Text("MQTT") } icon: { Image(systemName: "dot.radiowaves.up.forward") } From 8a38f06d55f2f3088756aeb7b04f86721bf31a44 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 27 Apr 2025 10:06:10 -0700 Subject: [PATCH 46/93] Update translation key statuses --- Localizable.xcstrings | 96 +++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 67d828e7..2d33ee77 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -2,7 +2,7 @@ "sourceLanguage" : "en", "strings" : { "" : { - + "shouldTranslate" : false }, "\t%@" : { "localizations" : { @@ -5232,7 +5232,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Canali" } }, @@ -5250,7 +5250,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Канали" } }, @@ -10668,7 +10668,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Disattivato" } }, @@ -10686,7 +10686,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Онемогућено" } }, @@ -10726,7 +10726,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Disconnessione" } }, @@ -10744,7 +10744,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Прекините везу" } }, @@ -10784,7 +10784,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Sospendere" } }, @@ -10802,7 +10802,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Отпусти" } }, @@ -10842,7 +10842,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Display" } }, @@ -10860,7 +10860,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Приказ" } }, @@ -11554,7 +11554,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Abilitato" } }, @@ -11572,7 +11572,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Омогућено" } }, @@ -12850,7 +12850,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Fine" } }, @@ -12868,7 +12868,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Заврши" } }, @@ -13004,7 +13004,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Versione del firmware" } }, @@ -13022,7 +13022,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Верзија фирмвера" } }, @@ -13176,7 +13176,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "PIN fisso" } }, @@ -13194,7 +13194,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Фиксни ПИН" } }, @@ -18126,13 +18126,13 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Giappone" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Јапан" } }, @@ -24558,7 +24558,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Non presente" } }, @@ -24570,7 +24570,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Није пристуно" } }, @@ -24582,7 +24582,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "無模組" } } @@ -26972,7 +26972,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Primario" } }, @@ -26990,7 +26990,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Примарни" } }, @@ -28272,7 +28272,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Risposta" } }, @@ -28290,7 +28290,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Одговори" } }, @@ -30272,7 +30272,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Русија" } }, @@ -33922,7 +33922,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Тајван" } }, @@ -33978,7 +33978,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Risposta di Tapback" } }, @@ -33996,7 +33996,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Реакција додиром" } }, @@ -34978,13 +34978,13 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Thailandia" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Тајланд" } }, @@ -35932,7 +35932,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Временско ограничење" } }, @@ -35990,7 +35990,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Временска ознака" } }, @@ -36996,19 +36996,19 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Stati Uniti" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Сједињене Америчке државе" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "美國" } } @@ -37080,7 +37080,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Sconosciuto" } }, @@ -37098,7 +37098,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Непознато" } }, @@ -37110,7 +37110,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "未知" } } @@ -37910,7 +37910,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nome utente" } }, @@ -37928,7 +37928,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Корисничко име" } }, @@ -37940,7 +37940,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "使用者名稱" } } @@ -38238,7 +38238,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Tensione" } }, @@ -38256,7 +38256,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Напон" } }, @@ -38268,7 +38268,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "電壓" } } From 00a7d83c4d0a70c2a5d29fbe25ac3f7d9f949dba Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 27 Apr 2025 11:26:23 -0700 Subject: [PATCH 47/93] More translation keys, delete unused file --- Localizable.xcstrings | 568 ++++++++---------- Meshtastic.xcodeproj/project.pbxproj | 4 - .../Enums/CannedMessagesConfigEnums.swift | 4 +- Meshtastic/Export/WriteCsvFile.swift | 2 +- .../Views/Bluetooth/InvalidVersion.swift | 2 +- .../Helpers/Help/DirectMessagesHelp.swift | 2 +- Meshtastic/Views/Helpers/MQTTIcon.swift | 2 +- Meshtastic/Views/Nodes/DeviceMetricsLog.swift | 2 +- .../Nodes/Helpers/Map/MapSettingsForm.swift | 2 +- .../Nodes/Helpers/Map/PositionPopover.swift | 2 +- .../Nodes/Helpers/Map/WaypointForm.swift | 2 +- .../Metrics Columns/MetricsColumnDetail.swift | 2 +- .../Views/Nodes/Helpers/NodeListFilter.swift | 2 +- Meshtastic/Views/Nodes/NodeMap.swift | 233 ------- Meshtastic/Views/Settings/AppSettings.swift | 2 +- Meshtastic/Views/Settings/Channels.swift | 2 +- .../Views/Settings/Logs/AppLogFilter.swift | 2 +- .../Views/Settings/Logs/LogDetail.swift | 2 +- Meshtastic/Views/Settings/RouteRecorder.swift | 2 +- Meshtastic/Views/Settings/ShareChannels.swift | 4 +- 20 files changed, 259 insertions(+), 584 deletions(-) delete mode 100644 Meshtastic/Views/Nodes/NodeMap.swift diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 2d33ee77..fd37255a 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -4332,134 +4332,6 @@ } } }, - "canned.messages.preset.manual" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manuelle Konfiguration" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manual Configuration" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration manuelle" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרה ידנית" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione manuale" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguracja ręczna" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manuell konfiguration" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ручна конфигурација" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "手动配置" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "手動設定" - } - } - } - }, - "canned.messages.preset.rakrotary" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "RAK Drehimpulsgeber Modul" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "RAK Rotary Encoder Module" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Module d'encodage rotatif RAK" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "RAK Rotary Encoder Module" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modulo encoder rotativo RAK" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Moduł kodera obrotowego RAK" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "RAK Rotary Encoder-modul" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "RAK Rotary енкодер модул" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "RAK 编码器" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "RAK 旋轉編碼器" - } - } - } - }, "Carousel Interval" : { "localizations" : { "it" : { @@ -5130,69 +5002,47 @@ } } }, - "Channel Utilization %@%%" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Utilizzo del canale %@%%" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "頻道利用率 %@%%" - } - } - } - }, - "channel.utilization" : { + "Channel Utilization" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Kanalbelegung" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Channel Utilization" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Utilisation du canal" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "שימוש ערוץ" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Utilizzo del canale" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Wykorzystanie kanału" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Kanalutnyttjande" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Искоришћеност канала" } }, @@ -5210,6 +5060,22 @@ } } }, + "Channel Utilization %@%%" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilizzo del canale %@%%" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "頻道利用率 %@%%" + } + } + } + }, "Channels" : { "localizations" : { "de" : { @@ -5396,6 +5262,64 @@ } } }, + "Clear App Data" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "App Daten löschen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Effacer les données de l'application" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "אפס הגדרות אפליקציה" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Cancella i dati dell'app" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Wyczyść dane aplikacji" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Rensa appdata" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Очисти податке апликације" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "清除 App 数据" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "清除 App 資料" + } + } + } + }, "Clear Log" : { "localizations" : { "it" : { @@ -5418,70 +5342,6 @@ } } }, - "clear.app.data" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "App Daten löschen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Clear App Data" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Effacer les données de l'application" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אפס הגדרות אפליקציה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancella i dati dell'app" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wyczyść dane aplikacji" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rensa appdata" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Очисти податке апликације" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "清除 App 数据" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "清除 App 資料" - } - } - } - }, "Client" : { "localizations" : { "it" : { @@ -5622,65 +5482,59 @@ } } }, - "close" : { + "Close" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Schließen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Close" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Fermer" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "סגור" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Chiudere" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Zamknij" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Stäng" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Затвори" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "关闭" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "關閉" } } @@ -11734,99 +11588,59 @@ } } }, - "encrypted" : { + "Encrypted" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Verschlüsselt" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Encrypted" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Encrypté" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "מוצפן" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Crittografato" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Zaszyfrowany" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Krypterad" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Шифровано" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "加密" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", - "value" : "已加密" - } - } - } - }, - "Encrypted" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verschlüsselt" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Crittografato" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Шифровано" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "加密" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "已加密" } } @@ -12874,7 +12688,7 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Finish" } }, @@ -15608,65 +15422,59 @@ } } }, - "include" : { + "Include" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Include" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Include" } }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Inclure" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "כלול" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Includere" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Dołącz" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Inkludera" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Укључите" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "包含" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "包含" } } @@ -15738,27 +15546,21 @@ }, "India" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "India" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "India" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Индија" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "印度" } } @@ -18296,27 +18098,21 @@ }, "Korea" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Korea" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Corea" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Кореја" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "韓國" } } @@ -19862,6 +19658,64 @@ } } }, + "Manual Configuration" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Manuelle Konfiguration" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Configuration manuelle" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הגדרה ידנית" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Configurazione manuale" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Konfiguracja ręczna" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Manuell konfiguration" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ручна конфигурација" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "手动配置" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "手動設定" + } + } + } + }, "map" : { "localizations" : { "de" : { @@ -24576,7 +24430,7 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "不存在" } }, @@ -27340,6 +27194,64 @@ } } }, + "RAK Rotary Encoder" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "RAK Drehimpulsgeber Modul" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Module d'encodage rotatif RAK" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "RAK Rotary Encoder Module" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Modulo encoder rotativo RAK" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Moduł kodera obrotowego RAK" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "RAK Rotary Encoder-modul" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "RAK Rotary енкодер модул" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "RAK 编码器" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "RAK 旋轉編碼器" + } + } + } + }, "range.test" : { "localizations" : { "de" : { @@ -35938,7 +35850,7 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "超时" } }, @@ -37104,7 +37016,7 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "未知" } }, @@ -37934,7 +37846,7 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "用户名称" } }, @@ -38262,7 +38174,7 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "电压" } }, diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 4f451b2d..59a50868 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -146,7 +146,6 @@ DD8EBF43285058FA00426DCA /* DisplayConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8EBF42285058FA00426DCA /* DisplayConfig.swift */; }; DD8ED9C52898D51F00B3B0AB /* NetworkConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8ED9C42898D51F00B3B0AB /* NetworkConfig.swift */; }; DD8ED9C8289CE4B900B3B0AB /* RoutingError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8ED9C7289CE4B900B3B0AB /* RoutingError.swift */; }; - DD90860E26F69BAE00DC5189 /* NodeMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD90860D26F69BAE00DC5189 /* NodeMap.swift */; }; DD913639270DFF4C00D7ACF3 /* LocalNotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD913638270DFF4C00D7ACF3 /* LocalNotificationManager.swift */; }; DD93800B2BA3F968008BEC06 /* NodeMapContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD93800A2BA3F968008BEC06 /* NodeMapContent.swift */; }; DD93800E2BA74D0C008BEC06 /* ChannelForm.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD93800D2BA74D0C008BEC06 /* ChannelForm.swift */; }; @@ -437,7 +436,6 @@ DD8ED9C42898D51F00B3B0AB /* NetworkConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkConfig.swift; sourceTree = ""; }; DD8ED9C7289CE4B900B3B0AB /* RoutingError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoutingError.swift; sourceTree = ""; }; DD90860A26F645B700DC5189 /* Meshtastic.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Meshtastic.entitlements; sourceTree = ""; }; - DD90860D26F69BAE00DC5189 /* NodeMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeMap.swift; sourceTree = ""; }; DD913638270DFF4C00D7ACF3 /* LocalNotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalNotificationManager.swift; sourceTree = ""; }; DD93800A2BA3F968008BEC06 /* NodeMapContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeMapContent.swift; sourceTree = ""; }; DD93800D2BA74D0C008BEC06 /* ChannelForm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelForm.swift; sourceTree = ""; }; @@ -731,7 +729,6 @@ DDDB263E2AABEE20003AFCB7 /* NodeList.swift */, DD769E0228D18BF0001A3F05 /* DeviceMetricsLog.swift */, DDAD49EC2AFB39DC00B4425D /* MeshMap.swift */, - DD90860D26F69BAE00DC5189 /* NodeMap.swift */, DD73FD1028750779000852D6 /* PositionLog.swift */, DD4F23CC28779A3C001D37CB /* EnvironmentMetricsLog.swift */, 6DEDA5592A957B8E00321D2E /* DetectionSensorLog.swift */, @@ -1404,7 +1401,6 @@ DDC4D568275499A500A4208E /* Persistence.swift in Sources */, DDD6EEAF29BC024700383354 /* Firmware.swift in Sources */, DD77093B2AA1ABB8007A8BF0 /* BluetoothTips.swift in Sources */, - DD90860E26F69BAE00DC5189 /* NodeMap.swift in Sources */, D9C9839D2B79CFD700BDBE6A /* TextMessageSize.swift in Sources */, DDC94FCE29CF55310082EA6E /* RtttlConfig.swift in Sources */, DD964FBD296E6B01007C176F /* EmojiOnlyTextField.swift in Sources */, diff --git a/Meshtastic/Enums/CannedMessagesConfigEnums.swift b/Meshtastic/Enums/CannedMessagesConfigEnums.swift index 15edbe4c..7209c8ed 100644 --- a/Meshtastic/Enums/CannedMessagesConfigEnums.swift +++ b/Meshtastic/Enums/CannedMessagesConfigEnums.swift @@ -19,9 +19,9 @@ enum ConfigPresets: Int, CaseIterable, Identifiable { switch self { case .unset: - return "canned.messages.preset.manual".localized + return "Manual Configuration".localized case .rakRotaryEncoder: - return "canned.messages.preset.rakrotary".localized + return "RAK Rotary Encoder".localized case .cardKB: return "M5 Stack Card KB / RAK Keypad".localized } diff --git a/Meshtastic/Export/WriteCsvFile.swift b/Meshtastic/Export/WriteCsvFile.swift index 66835b4a..a1380c77 100644 --- a/Meshtastic/Export/WriteCsvFile.swift +++ b/Meshtastic/Export/WriteCsvFile.swift @@ -14,7 +14,7 @@ func telemetryToCsvFile(telemetry: [TelemetryEntity], metricsType: Int) -> Strin let dateFormatString = (localeDateFormat ?? "MM/dd/YY j:mma").replacingOccurrences(of: ",", with: "") if metricsType == 0 { // Create Device Metrics Header - csvString = "\("battery.level".localized), \("Voltage".localized), \("channel.utilization".localized), \("airtime".localized), \("uptime".localized), \("Timestamp".localized)" + csvString = "\("battery.level".localized), \("Voltage".localized), \("Channel Utilization".localized), \("airtime".localized), \("uptime".localized), \("Timestamp".localized)" for dm in telemetry where dm.metricsType == 0 { csvString += "\n" csvString += dm.batteryLevel?.formatted(.number.grouping(.never)) ?? "" diff --git a/Meshtastic/Views/Bluetooth/InvalidVersion.swift b/Meshtastic/Views/Bluetooth/InvalidVersion.swift index ba94e7c1..6a82581b 100644 --- a/Meshtastic/Views/Bluetooth/InvalidVersion.swift +++ b/Meshtastic/Views/Bluetooth/InvalidVersion.swift @@ -49,7 +49,7 @@ struct InvalidVersion: View { Button { dismiss() } label: { - Label("close", systemImage: "xmark") + Label("Close", systemImage: "xmark") } .buttonStyle(.bordered) diff --git a/Meshtastic/Views/Helpers/Help/DirectMessagesHelp.swift b/Meshtastic/Views/Helpers/Help/DirectMessagesHelp.swift index fd0f0414..1b9263c5 100644 --- a/Meshtastic/Views/Helpers/Help/DirectMessagesHelp.swift +++ b/Meshtastic/Views/Helpers/Help/DirectMessagesHelp.swift @@ -50,7 +50,7 @@ struct DirectMessagesHelp: View { Button { dismiss() } label: { - Label("close", systemImage: "xmark") + Label("Close", systemImage: "xmark") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Helpers/MQTTIcon.swift b/Meshtastic/Views/Helpers/MQTTIcon.swift index 914c6043..7d6c653a 100644 --- a/Meshtastic/Views/Helpers/MQTTIcon.swift +++ b/Meshtastic/Views/Helpers/MQTTIcon.swift @@ -29,7 +29,7 @@ struct MQTTIcon: View { VStack(spacing: 0.5) { Text("Topic: \(topic)".localized) .padding(20) - Button("close", action: { self.isPopoverOpen = false }).padding([.bottom], 20) + Button("Close", action: { self.isPopoverOpen = false }).padding([.bottom], 20) } .presentationCompactAdaptation(.popover) }) diff --git a/Meshtastic/Views/Nodes/DeviceMetricsLog.swift b/Meshtastic/Views/Nodes/DeviceMetricsLog.swift index 9ebce292..6b2570d2 100644 --- a/Meshtastic/Views/Nodes/DeviceMetricsLog.swift +++ b/Meshtastic/Views/Nodes/DeviceMetricsLog.swift @@ -165,7 +165,7 @@ struct DeviceMetricsLog: View { // dm.voltage.map { Text("\(String(format: "%.2f", $0))") } ?? Text("--") Text("\(dm.voltage?.formatted(.number.precision(.fractionLength(2))) ?? Constants.nilValueIndicator)") } - TableColumn("channel.utilization") { dm in + TableColumn("Channel Utilization") { dm in dm.channelUtilization.map { channelUtilization in // Text("\(String(format: "%.2f", channelUtilization))%") Text("\(channelUtilization.formatted(.number.precision(.fractionLength(2))))%") diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift index 088787b9..85db444a 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapSettingsForm.swift @@ -111,7 +111,7 @@ Spacer() Button { dismiss() } label: { - Label("close", systemImage: "xmark") + Label("Close", systemImage: "xmark") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift b/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift index 880a4074..ce7a10ef 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift @@ -234,7 +234,7 @@ struct PositionPopover: View { Button { dismiss() } label: { - Label("close", systemImage: "xmark") + Label("Close", systemImage: "xmark") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift b/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift index 8c8feb32..8800cabf 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift @@ -354,7 +354,7 @@ struct WaypointForm: View { Button { dismiss() } label: { - Label("close", systemImage: "xmark") + Label("Close", systemImage: "xmark") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Nodes/Helpers/Metrics Columns/MetricsColumnDetail.swift b/Meshtastic/Views/Nodes/Helpers/Metrics Columns/MetricsColumnDetail.swift index 1f384cb2..24cc6f96 100644 --- a/Meshtastic/Views/Nodes/Helpers/Metrics Columns/MetricsColumnDetail.swift +++ b/Meshtastic/Views/Nodes/Helpers/Metrics Columns/MetricsColumnDetail.swift @@ -63,7 +63,7 @@ struct MetricsColumnDetail: View { Button { dismiss() } label: { - Label("close", systemImage: "xmark") + Label("Close", systemImage: "xmark") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Nodes/Helpers/NodeListFilter.swift b/Meshtastic/Views/Nodes/Helpers/NodeListFilter.swift index a29a0749..063e073a 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeListFilter.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeListFilter.swift @@ -192,7 +192,7 @@ struct NodeListFilter: View { Button { dismiss() } label: { - Label("close", systemImage: "xmark") + Label("Close", systemImage: "xmark") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Nodes/NodeMap.swift b/Meshtastic/Views/Nodes/NodeMap.swift deleted file mode 100644 index e81fc224..00000000 --- a/Meshtastic/Views/Nodes/NodeMap.swift +++ /dev/null @@ -1,233 +0,0 @@ -//// -//// NodeMap.swift -//// MeshtasticApple -//// -//// Created by Garth Vander Houwen on 8/7/21. -//// -// -//import SwiftUI -//import MapKit -//import CoreLocation -//import CoreData -// -//struct NodeMap: View { -// @Environment(\.managedObjectContext) var context -// @EnvironmentObject var bleManager: BLEManager -// -// @ObservedObject -// var router: Router -// @State var selectedMapLayer: MapLayer = UserDefaults.mapLayer -// @State var enableMapRecentering: Bool = UserDefaults.enableMapRecentering -// @State var enableMapRouteLines: Bool = UserDefaults.enableMapRouteLines -// @State var enableMapNodeHistoryPins: Bool = UserDefaults.enableMapNodeHistoryPins -// @State var enableOfflineMaps: Bool = UserDefaults.enableOfflineMaps -// @State var selectedTileServer: MapTileServer = UserDefaults.mapTileServer -// @State var enableOverlayServer: Bool = UserDefaults.enableOverlayServer -// @State var selectedOverlayServer: MapOverlayServer = UserDefaults.mapOverlayServer -// @State var mapTilesAboveLabels: Bool = UserDefaults.mapTilesAboveLabels -// let fromDate: NSDate = Calendar.current.date(byAdding: .month, value: -1, to: Date())! as NSDate -// @FetchRequest(sortDescriptors: [NSSortDescriptor(key: "time", ascending: true)], -// predicate: NSPredicate(format: "nodePosition != nil", Calendar.current.date(byAdding: .day, value: -7, to: Date())! as NSDate), animation: .none) -// private var positions: FetchedResults -// @FetchRequest(sortDescriptors: [NSSortDescriptor(key: "name", ascending: false)], -// predicate: NSPredicate( -// format: "expire == nil || expire >= %@", Date() as NSDate -// ), animation: .none) -// private var waypoints: FetchedResults -// @State var waypointCoordinate: WaypointCoordinate? -// @State var selectedTracking: UserTrackingModes = .none -// @State var isPresentingInfoSheet: Bool = false -// @State private var customMapOverlay: MapViewSwiftUI.CustomMapOverlay? = MapViewSwiftUI.CustomMapOverlay( -// mapName: "offlinemap", -// tileType: "png", -// canReplaceMapContent: true -// ) -// var body: some View { -// NavigationStack { -// ZStack { -// MapViewSwiftUI( -// onLongPress: { coord in -// waypointCoordinate = WaypointCoordinate(id: .init(), coordinate: coord, waypointId: 0) -// }, onWaypointEdit: { wpId in -// if wpId > 0 { -// waypointCoordinate = WaypointCoordinate(id: .init(), coordinate: nil, waypointId: Int64(wpId)) -// } -// }, -// selectedMapLayer: selectedMapLayer, -// positions: Array(positions), -// waypoints: Array(waypoints), -// userTrackingMode: selectedTracking.MKUserTrackingModeValue(), -// showNodeHistory: enableMapNodeHistoryPins, -// showRouteLines: enableMapRouteLines, -// customMapOverlay: self.customMapOverlay -// ) -// VStack(alignment: .trailing) { -// HStack(alignment: .top) { -// Spacer() -// MapButtons(tracking: $selectedTracking, isPresentingInfoSheet: $isPresentingInfoSheet) -// .padding(.trailing, 8) -// .padding(.top, 16) -// } -// Spacer() -// TileDownloadStatus() -// .padding(.trailing, 16) -// .padding(.bottom, 20) -// } -// } -// .ignoresSafeArea(.all, edges: [.top, .leading, .trailing]) -// .frame(maxHeight: .infinity) -// .sheet(item: $waypointCoordinate, content: { wpc in -// WaypointFormMapKit(coordinate: wpc) -// .presentationDetents([.medium, .large]) -// .presentationDragIndicator(.automatic) -// }) -// .sheet(isPresented: $isPresentingInfoSheet) { -// VStack { -// Form { -// Section(header: Text("Map Options")) { -// Picker(selection: $selectedMapLayer, label: Text("")) { -// ForEach(MapLayer.allCases, id: \.self) { layer in -// if layer == MapLayer.offline && enableOfflineMaps { -// Text(layer.localized) -// } else if layer != MapLayer.offline { -// Text(layer.localized) -// } -// } -// } -// .pickerStyle(SegmentedPickerStyle()) -// .onChange(of: selectedMapLayer) { _, newMapLayer in -// UserDefaults.mapLayer = newMapLayer -// } -// .padding(.top, 5) -// .padding(.bottom, 5) -// Toggle(isOn: $enableMapRecentering) { -// Label("map.recentering", systemImage: "camera.metering.center.weighted") -// } -// .toggleStyle(SwitchToggleStyle(tint: .accentColor)) -// .onTapGesture { -// self.enableMapRecentering.toggle() -// UserDefaults.enableMapRecentering = self.enableMapRecentering -// } -// Toggle(isOn: $enableMapNodeHistoryPins) { -// Label("Show Node History", systemImage: "building.columns.fill") -// } -// .toggleStyle(SwitchToggleStyle(tint: .accentColor)) -// .onTapGesture { -// self.enableMapNodeHistoryPins.toggle() -// UserDefaults.enableMapNodeHistoryPins = self.enableMapNodeHistoryPins -// } -// Toggle(isOn: $enableMapRouteLines) { -// Label("Show Route Lines", systemImage: "road.lanes") -// } -// .toggleStyle(SwitchToggleStyle(tint: .accentColor)) -// .onTapGesture { -// self.enableMapRouteLines.toggle() -// UserDefaults.enableMapRouteLines = self.enableMapRouteLines -// } -// let locale = Locale.current -// if locale.region?.identifier ?? "no locale" == "US" { -// Toggle(isOn: $enableOverlayServer) { -// Label("Show Weather", systemImage: "cloud.fill") -// } -// .toggleStyle(SwitchToggleStyle(tint: .accentColor)) -// .onTapGesture { -// self.enableOverlayServer.toggle() -// UserDefaults.enableOverlayServer = self.enableOverlayServer -// } -// if enableOverlayServer { -// Picker(selection: $selectedOverlayServer, -// label: Text("Radar")) { -// ForEach(MapOverlayServer.allCases, id: \.self) { mos in -// Text(mos.description) -// .font(.footnote) -// } -// } -// .pickerStyle(DefaultPickerStyle()) -// .onChange(of: (selectedOverlayServer)) { _, newSelectedOverlayServer in -// UserDefaults.mapOverlayServer = newSelectedOverlayServer -// } -// Text(LocalizedStringKey(selectedOverlayServer.attribution)) -// .font(.footnote) -// .foregroundColor(.gray) -// .padding(0) -// } -// } -// } -// Section(header: Text("Offline Maps")) { -// Toggle(isOn: $enableOfflineMaps) { -// Text("Enable Offline Maps") -// } -// .toggleStyle(SwitchToggleStyle(tint: .accentColor)) -// .onChange(of: enableOfflineMaps) { _, newEnableOfflineMaps in -// UserDefaults.enableOfflineMaps = newEnableOfflineMaps -// if !enableOfflineMaps { -// if self.selectedMapLayer == .offline { -// self.selectedMapLayer = .standard -// } -// } -// } -// if enableOfflineMaps { -// VStack(alignment: .leading) { -// Picker(selection: $selectedTileServer, -// label: Text("Tile Server")) { -// ForEach(MapTileServer.allCases, id: \.self) { tsl in -// Text(tsl.description) -// } -// } -// .pickerStyle(DefaultPickerStyle()) -// .onChange(of: (selectedTileServer)) { _, newSelectedTileServer in -// UserDefaults.mapTileServer = newSelectedTileServer -// } -// Text("Attribution:") -// .fontWeight(.semibold) -// .font(.footnote) -// Text(LocalizedStringKey(selectedTileServer.attribution)) -// .font(.footnote) -// .foregroundColor(.gray) -// .padding(0) -// Divider() -// Toggle(isOn: $mapTilesAboveLabels) { -// Text("Tiles above Labels") -// } -// .toggleStyle(SwitchToggleStyle(tint: .accentColor)) -// .onTapGesture { -// self.mapTilesAboveLabels.toggle() -// UserDefaults.mapTilesAboveLabels = self.mapTilesAboveLabels -// } -// } -// } -// } -// } -// #if targetEnvironment(macCatalyst) -// Button { -// isPresentingInfoSheet = false -// } label: { -// Label("close", systemImage: "xmark") -// } -// .buttonStyle(.bordered) -// .buttonBorderShape(.capsule) -// .controlSize(.large) -// .padding(.bottom) -// #endif -// } -// .presentationDetents([enableOfflineMaps || enableOverlayServer ? .large : .medium]) -// .presentationDragIndicator(.visible) -// } -// } -// .navigationBarItems(leading: -// MeshtasticLogo(), trailing: -// ZStack { -// ConnectedDevice( -// bluetoothOn: bleManager.isSwitchedOn, -// deviceConnected: bleManager.connectedPeripheral != nil, -// name: (bleManager.connectedPeripheral != nil) ? bleManager.connectedPeripheral.shortName : -// "?") -// }) -// .onAppear(perform: { -// UIApplication.shared.isIdleTimerDisabled = true -// }) -// .onDisappear(perform: { -// UIApplication.shared.isIdleTimerDisabled = false -// }) -// } -//} diff --git a/Meshtastic/Views/Settings/AppSettings.swift b/Meshtastic/Views/Settings/AppSettings.swift index 7ba7d3f9..e16fb31b 100644 --- a/Meshtastic/Views/Settings/AppSettings.swift +++ b/Meshtastic/Views/Settings/AppSettings.swift @@ -43,7 +43,7 @@ struct AppSettings: View { Button { isPresentingCoreDataResetConfirm = true } label: { - Label("clear.app.data", systemImage: "trash") + Label("Clear App Data", systemImage: "trash") .foregroundColor(.red) } .confirmationDialog( diff --git a/Meshtastic/Views/Settings/Channels.swift b/Meshtastic/Views/Settings/Channels.swift index 19c56a7b..861f0cb3 100644 --- a/Meshtastic/Views/Settings/Channels.swift +++ b/Meshtastic/Views/Settings/Channels.swift @@ -230,7 +230,7 @@ struct Channels: View { Button { goBack() } label: { - Label("close", systemImage: "xmark") + Label("Close", systemImage: "xmark") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Settings/Logs/AppLogFilter.swift b/Meshtastic/Views/Settings/Logs/AppLogFilter.swift index e6371672..eadf8e41 100644 --- a/Meshtastic/Views/Settings/Logs/AppLogFilter.swift +++ b/Meshtastic/Views/Settings/Logs/AppLogFilter.swift @@ -136,7 +136,7 @@ struct AppLogFilter: View { Button { dismiss() } label: { - Label("close", systemImage: "xmark") + Label("Close", systemImage: "xmark") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Settings/Logs/LogDetail.swift b/Meshtastic/Views/Settings/Logs/LogDetail.swift index ca5d17d6..268c5a3a 100644 --- a/Meshtastic/Views/Settings/Logs/LogDetail.swift +++ b/Meshtastic/Views/Settings/Logs/LogDetail.swift @@ -151,7 +151,7 @@ struct LogDetail: View { Button { dismiss() } label: { - Label("close", systemImage: "xmark") + Label("Close", systemImage: "xmark") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Settings/RouteRecorder.swift b/Meshtastic/Views/Settings/RouteRecorder.swift index 4a1f2b96..58190878 100644 --- a/Meshtastic/Views/Settings/RouteRecorder.swift +++ b/Meshtastic/Views/Settings/RouteRecorder.swift @@ -261,7 +261,7 @@ struct RouteRecorder: View { Button(role: .cancel) { isShowingDetails = false } label: { - Label("close", systemImage: "xmark") + Label("Close", systemImage: "xmark") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Settings/ShareChannels.swift b/Meshtastic/Views/Settings/ShareChannels.swift index 7ea643ae..71707792 100644 --- a/Meshtastic/Views/Settings/ShareChannels.swift +++ b/Meshtastic/Views/Settings/ShareChannels.swift @@ -62,7 +62,7 @@ struct ShareChannels: View { Grid { GridRow { Spacer() - Text("include") + Text("Include") .font(.caption) .fontWeight(.bold) .padding(.trailing) @@ -70,7 +70,7 @@ struct ShareChannels: View { .font(.caption) .fontWeight(.bold) .padding(.trailing) - Text("encrypted") + Text("Encrypted") .font(.caption) .fontWeight(.bold) } From d568627ce8f2ef978d83d91ac65ccca3e7cf5389 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 27 Apr 2025 12:50:45 -0700 Subject: [PATCH 48/93] Additional translation key cleanup --- Localizable.xcstrings | 104 +----------------- Meshtastic/Enums/SerialConfigEnums.swift | 2 +- Meshtastic/Extensions/OSLogEntryLog.swift | 2 +- Meshtastic/Helpers/BLEManager.swift | 2 +- .../Nodes/Helpers/Map/WaypointForm.swift | 2 +- .../Views/Nodes/Helpers/NodeDetail.swift | 2 +- 6 files changed, 11 insertions(+), 103 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index fd37255a..f405f17f 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -5534,7 +5534,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "關閉" } } @@ -7872,7 +7872,7 @@ } } }, - "default" : { + "Default" : { "localizations" : { "de" : { "stringUnit" : { @@ -7936,34 +7936,6 @@ } } }, - "Default" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Standard" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Predefinito" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подразумевано" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "預設" - } - } - } - }, "default.128x64.screen.layout" : { "localizations" : { "en" : { @@ -10874,70 +10846,6 @@ } } }, - "distance" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entfernung" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Distance" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Distance" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מרחק" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Distanza" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odległość" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Distans" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Раздаљина" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "距离" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "距離" - } - } - } - }, "Distance" : { "localizations" : { "de" : { @@ -11640,7 +11548,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "已加密" } } @@ -15474,7 +15382,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "包含" } } @@ -15560,7 +15468,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "印度" } } @@ -18112,7 +18020,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "韓國" } } diff --git a/Meshtastic/Enums/SerialConfigEnums.swift b/Meshtastic/Enums/SerialConfigEnums.swift index ff937207..5799dbfb 100644 --- a/Meshtastic/Enums/SerialConfigEnums.swift +++ b/Meshtastic/Enums/SerialConfigEnums.swift @@ -31,7 +31,7 @@ enum SerialBaudRates: Int, CaseIterable, Identifiable { switch self { case .baudDefault: - return "default".localized + return "Default".localized case .baud110: return "110 Baud" case .baud300: diff --git a/Meshtastic/Extensions/OSLogEntryLog.swift b/Meshtastic/Extensions/OSLogEntryLog.swift index fe2dc2cf..c60c7aca 100644 --- a/Meshtastic/Extensions/OSLogEntryLog.swift +++ b/Meshtastic/Extensions/OSLogEntryLog.swift @@ -18,7 +18,7 @@ extension OSLogEntryLog.Level { case .notice: "⚠️ Notice" case .error: "🚨 Error" case .fault: "💥 Fault" - @unknown default: "default" + @unknown default: "Default".localized } } var color: Color { diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 9f633f30..b9f2a7d8 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -3448,7 +3448,7 @@ extension BLEManager: CBCentralManagerDelegate { case .unsupported: status = "BLE is unsupported" default: - status = "default" + status = "Default".localized } Logger.services.info("📜 [BLE] Bluetooth status: \(status, privacy: .public)") } diff --git a/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift b/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift index 8800cabf..736c2114 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift @@ -338,7 +338,7 @@ struct WaypointForm: View { if LocationsHandler.currentLocation.distance(from: LocationsHandler.DefaultLocation) > 0.0 { let metersAway = waypoint.coordinate.distance(from: LocationsHandler.currentLocation) Label { - Text("distance".localized + ": \(distanceFormatter.string(fromDistance: Double(metersAway)))") + Text("Distance".localized + ": \(distanceFormatter.string(fromDistance: Double(metersAway)))") .foregroundColor(.primary) } icon: { Image(systemName: "lines.measurement.horizontal") diff --git a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift index 7f834de9..bd2abae8 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift @@ -214,7 +214,7 @@ struct NodeDetail: View { // to use with WeatherKit, or has actual data in the most recent EnvironmentMetrics entity // that will be rendered in this section. if node.hasPositions && UserDefaults.environmentEnableWeatherKit - || node.hasDataForLatestEnvironmentMetrics(attributes: ["iaq", "temperature", "relativeHumidity", "barometricPressure", "windSpeed", "radiation", "weight", "distance", "soilTemperature", "soilMoisture"]) { + || node.hasDataForLatestEnvironmentMetrics(attributes: ["iaq", "temperature", "relativeHumidity", "barometricPressure", "windSpeed", "radiation", "weight", "Distance", "soilTemperature", "soilMoisture"]) { Section("Environment") { if !node.hasEnvironmentMetrics { LocalWeatherConditions(location: node.latestPosition?.nodeLocation) From 939de515b0a0c567f8a73c3d9ab4301e623b8a0e Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 27 Apr 2025 13:06:47 -0700 Subject: [PATCH 49/93] Mark keys as reviewed if they were manually updated --- Localizable.xcstrings | 430 ++++++++++------------- Meshtastic/Enums/SerialConfigEnums.swift | 2 +- 2 files changed, 184 insertions(+), 248 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index f405f17f..c99fa002 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -220,7 +220,8 @@ "value" : "%1$@ - %2$@" } } - } + }, + "shouldTranslate" : false }, "%@ - %@ - %@" : { "localizations" : { @@ -254,7 +255,8 @@ "value" : "%1$@ - %2$@ - %3$@" } } - } + }, + "shouldTranslate" : false }, "%@ - %@ Towards %@ Back" : { "localizations" : { @@ -390,7 +392,8 @@ "value" : "%1$@ (%2$@)" } } - } + }, + "shouldTranslate" : false }, "%@ %@" : { "localizations" : { @@ -424,7 +427,8 @@ "value" : "%1$@ %2$@" } } - } + }, + "shouldTranslate" : false }, "%@ %lld" : { "localizations" : { @@ -458,7 +462,8 @@ "value" : "%1$@ %2$lld" } } - } + }, + "shouldTranslate" : false }, "%@ away" : { "localizations" : { @@ -692,13 +697,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "%@ Aplikacja automatycznie ponownie połączy się z preferowanym radiem, jeśli wróci w zasięg." } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "%@ Appen kommer automatiskt att återansluta till den föredragna radion om den kommer inom räckhåll igen." } }, @@ -750,13 +755,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "%@ Ten błąd zwykle nie może być naprawiony bez zapomnienia urządzenia w Ustawienia > Bluetooth i ponownego połączenia z radiem." } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "%@ Detta fel kan vanligtvis inte åtgärdas utan att glömma enheten under Inställningar > Bluetooth och återansluta till radion." } }, @@ -846,7 +851,8 @@ "value" : "%1$@: %2$lld / %3$lld" } } - } + }, + "shouldTranslate" : false }, "%@%%" : { "localizations" : { @@ -2236,7 +2242,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "זמן אוויר" } }, @@ -2248,13 +2254,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Czas nadawania" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Sändningstid" } }, @@ -2700,7 +2706,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "תמיד דלוק" } }, @@ -2712,13 +2718,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Zawsze włączone" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Alltid på" } }, @@ -2786,7 +2792,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "תאורת סביבה" } }, @@ -2804,7 +2810,7 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Omgivningsbelysning" } }, @@ -2844,7 +2850,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "הגדרות תאורת סביבה" } }, @@ -2862,7 +2868,7 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Konfiguration av omgivningsbelysning" } }, @@ -3166,7 +3172,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "האם אתה בטוח?" } }, @@ -3178,13 +3184,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Jesteś pewny?" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Är du säker?" } }, @@ -3302,7 +3308,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "מכשירים זמינים" } }, @@ -3314,13 +3320,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Dostępne radia" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Tillgängliga radioapparater" } }, @@ -3490,13 +3496,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Poziom naładowania baterii" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Batterinivå" } }, @@ -3592,7 +3598,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "שם בלוטוס" } }, @@ -3604,13 +3610,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nazwa BLE" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "BLE-namn" } }, @@ -3650,7 +3656,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "קוד בלוטוס חייבת להיות בת 6 ספרות." } }, @@ -3662,13 +3668,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Pin BLE musi mieć długość 6 cyfr." } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "BLE-PIN måste vara 6 siffror lång." } }, @@ -3822,7 +3828,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "הגדרות בלוטוס" } }, @@ -3834,13 +3840,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Konfiguracja Bluetooth" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Bluetooth-konfiguration" } }, @@ -3880,7 +3886,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "בלוטוס כבוי" } }, @@ -3892,13 +3898,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Bluetooth jest wyłączony" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Bluetooth är avstängt" } }, @@ -4060,7 +4066,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "בייטים" } }, @@ -4072,13 +4078,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Bajty" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Bytes" } }, @@ -4174,7 +4180,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "בטל" } }, @@ -4186,13 +4192,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Anuluj" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Avbryt" } }, @@ -4232,7 +4238,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "הודעות קבועות" } }, @@ -4244,13 +4250,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Gotowe wiadomości" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Fördefinierade meddelanden" } }, @@ -4290,7 +4296,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "הגדרות הודעות קבועות" } }, @@ -4302,13 +4308,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Konfiguracja gotowych wiadomości" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Konfiguration av fördefinierade meddelanden" } }, @@ -4536,7 +4542,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "ערוץ" } }, @@ -4548,13 +4554,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Kanał" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Kanal" } }, @@ -5006,43 +5012,43 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Kanalbelegung" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Utilisation du canal" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "שימוש ערוץ" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Utilizzo del canale" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Wykorzystanie kanału" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Kanalutnyttjande" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Искоришћеност канала" } }, @@ -5092,7 +5098,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "ערוצים" } }, @@ -5104,13 +5110,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Kanały" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Kanaler" } }, @@ -5266,43 +5272,43 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "App Daten löschen" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Effacer les données de l'application" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "אפס הגדרות אפליקציה" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Cancella i dati dell'app" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Wyczyść dane aplikacji" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Rensa appdata" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Очисти податке апликације" } }, @@ -5486,49 +5492,49 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Schließen" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Fermer" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "סגור" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Chiudere" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Zamknij" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Stäng" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Затвори" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "关闭" } }, @@ -7876,16 +7882,10 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Standard" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Default" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -7906,13 +7906,13 @@ }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Domyślny" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Standard" } }, @@ -9808,7 +9808,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "מכשיר תשתית להרחבת המש על ידי העברת הודעות עם דאטה נוסף מינימלי." } }, @@ -9820,13 +9820,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Przekaźnik - Pakiety siatki będą preferować trasowanie przez ten węzeł. Ta rola eliminuje niepotrzebny nadmiar, taki jak NodeInfo, DeviceTelemetry i inne pakiety siatki, skutkując tym, że urządzenie nie będzie widoczne jako część sieci. Proszę zobaczyć tryb Rebroadcast dla dodatkowych ustawień specyficznych dla tej roli." } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Infrastrukturnod för att utöka nätverkstäckningen genom att vidarebefordra meddelanden med minimal overhead. Syns inte i Noder-listan." } }, @@ -9872,7 +9872,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "מכשיר תשתית להרחבת המש על ידי העברת הודעות. מופיע ברשימת מכשירים." } }, @@ -9884,13 +9884,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Router - Pakiety siatki będą preferować trasowanie przez ten węzeł. Zakłada, że urządzenie będzie działać samodzielnie, umieszczone w miejscu z przewagą zasięgu. UWAGA: Radia BLE/Wi-Fi i ekran OLED zostaną uśpione." } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Infrastrukturnod för att utöka nätverkstäckningen genom att vidarebefordra meddelanden. Synlig i Noder-listan." } }, @@ -9954,7 +9954,7 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Kombination av både ROUTER och CLIENT. Inte för mobila enheter." } }, @@ -10488,7 +10488,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "כבוי" } }, @@ -10500,13 +10500,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Wyłączony" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Inaktiverad" } }, @@ -10546,7 +10546,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "התנתק" } }, @@ -10558,13 +10558,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Rozłącz" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Koppla från" } }, @@ -10604,7 +10604,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "סגור מקלדת" } }, @@ -10616,13 +10616,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Zamknij" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Stäng" } }, @@ -10662,7 +10662,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "צג מכשיר" } }, @@ -10674,13 +10674,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Wyświetlacz (Ekran Urządzenia)" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Skärm" } }, @@ -11310,7 +11310,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "מופעל" } }, @@ -11322,13 +11322,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Włączony" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Aktiverad" } }, @@ -11500,49 +11500,49 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Verschlüsselt" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Encrypté" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "מוצפן" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Crittografato" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Zaszyfrowany" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Krypterad" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Шифровано" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "加密" } }, @@ -12566,7 +12566,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "סיים" } }, @@ -12578,13 +12578,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Finish" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Avsluta" } }, @@ -12720,7 +12720,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "גרסת קושחה" } }, @@ -12732,13 +12732,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Wersja Oprogramowania" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Firmwareversion" } }, @@ -12892,7 +12892,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "קוד קבוע" } }, @@ -12904,13 +12904,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Stały PIN" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Fast PIN" } }, @@ -15334,25 +15334,25 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Include" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Inclure" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "כלול" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Includere" } }, @@ -15364,19 +15364,19 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Inkludera" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Укључите" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "包含" } }, @@ -15462,7 +15462,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Индија" } }, @@ -18008,13 +18008,13 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Corea" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Кореја" } }, @@ -19570,43 +19570,43 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Manuelle Konfiguration" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Configuration manuelle" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "הגדרה ידנית" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Configurazione manuale" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Konfiguracja ręczna" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Manuell konfiguration" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ручна конфигурација" } }, @@ -24308,13 +24308,13 @@ "localizations" : { "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Absent" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "לא קיים" } }, @@ -24326,7 +24326,7 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Inte närvarande" } }, @@ -26728,7 +26728,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "עיקרי" } }, @@ -26740,13 +26740,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Podstawowy" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Primär" } }, @@ -27106,13 +27106,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "RAK Drehimpulsgeber Modul" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Module d'encodage rotatif RAK" } }, @@ -27124,14 +27124,14 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Modulo encoder rotativo RAK" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Moduł kodera obrotowego RAK" + "state" : "translated", + "value" : "Kodera obrotowego RAK" } }, "se" : { @@ -28086,7 +28086,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "תגובה" } }, @@ -28098,13 +28098,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Odpowiedz" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Svara" } }, @@ -31760,70 +31760,6 @@ } } }, - "serial.mode.default" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Standard" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Default" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Défaut" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "ברירת מחדל" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Predefinito" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Domyślny" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Standard" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Основни" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "默认" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "預設" - } - } - } - }, "serial.mode.nmea" : { "localizations" : { "de" : { @@ -33792,7 +33728,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "תגובה מהירה" } }, @@ -33804,13 +33740,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Odpowiedź na stuknięcie" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Svarsreaktion" } }, @@ -35716,19 +35652,19 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Zeitlimit erreicht" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Délai d'expiration" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "זמן קצוב" } }, @@ -35740,13 +35676,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Limit czasu" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Tidsgräns överskriden" } }, @@ -35786,7 +35722,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "שעה/תאריך" } }, @@ -35798,13 +35734,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Znacznik czasu" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Tidsstämpel" } }, @@ -36888,13 +36824,13 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Inconnu" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "לא ידוע" } }, @@ -36906,13 +36842,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nieznany" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Okänd" } }, @@ -37712,19 +37648,19 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Benutzername" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nom d'utilisateur" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "שם משתמש" } }, @@ -37736,13 +37672,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nazwa użytkownika" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Användarnamn" } }, @@ -38046,13 +37982,13 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Tension" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "וולטז'" } }, @@ -38064,13 +38000,13 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Napięcie" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Spänning" } }, diff --git a/Meshtastic/Enums/SerialConfigEnums.swift b/Meshtastic/Enums/SerialConfigEnums.swift index 5799dbfb..34388f40 100644 --- a/Meshtastic/Enums/SerialConfigEnums.swift +++ b/Meshtastic/Enums/SerialConfigEnums.swift @@ -118,7 +118,7 @@ enum SerialModeTypes: Int, CaseIterable, Identifiable { var description: String { switch self { case .default: - return "serial.mode.default".localized + return "Default".localized case .simple: return "serial.mode.simple".localized case .proto: From defba587e7e2308311f9b3fe1a9e0cc29d4ccd4d Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 27 Apr 2025 14:04:47 -0700 Subject: [PATCH 50/93] Assorted linting updates --- Meshtastic.xcodeproj/project.pbxproj | 20 ++---- .../xcschemes/Meshtastic.xcscheme | 2 +- .../xcschemes/WidgetsExtension.xcscheme | 2 +- Meshtastic/AppIntents/AppIntentErrors.swift | 2 +- .../AppIntents/NavigateToNodeIntent.swift | 18 +++--- .../SaveChannelSettingsIntent.swift | 4 -- Meshtastic/Export/CsvDocument.swift | 5 +- Meshtastic/Helpers/BLEManager.swift | 16 +---- Meshtastic/Helpers/MeshPackets.swift | 8 --- .../Helpers/Mqtt/MqttClientProxyManager.swift | 11 +--- .../MetricsChartSeries.swift | 1 - .../MetricsSeriesList.swift | 4 +- Meshtastic/Views/Helpers/CircleText.swift | 6 +- .../Compact Widgets/CompactWidget.swift | 2 +- .../RadiationCompactWidget.swift | 2 +- .../WeatherConditionsCompactWidget.swift | 1 - .../Views/Messages/ChannelMessageList.swift | 12 ++-- Meshtastic/Views/Messages/MessageText.swift | 1 - .../Views/Messages/UserMessageList.swift | 2 - .../Helpers/Actions/NavigateToButton.swift | 64 +++++++++---------- .../Nodes/Helpers/Map/PositionPopover.swift | 4 +- .../EnvironmentDefaultColumns.swift | 1 - .../EnvironmentDefaultSeries.swift | 8 +-- .../Views/Nodes/Helpers/NodeListItem.swift | 2 +- Meshtastic/Views/Nodes/NodeList.swift | 17 +---- Meshtastic/Views/Nodes/PositionLog.swift | 2 - Meshtastic/Views/Settings/About.swift | 3 +- Meshtastic/Views/Settings/AppLog.swift | 2 +- .../Views/Settings/Config/DeviceConfig.swift | 2 - .../Settings/Config/Module/MQTTConfig.swift | 1 - .../Settings/Config/PositionConfig.swift | 8 +-- Widgets/WidgetsLiveActivity.swift | 2 +- 32 files changed, 80 insertions(+), 155 deletions(-) diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 59a50868..39426e2f 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -56,7 +56,6 @@ B399E8A42B6F486400E4488E /* RetryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = B399E8A32B6F486400E4488E /* RetryButton.swift */; }; B3E905B12B71F7F300654D07 /* TextMessageField.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3E905B02B71F7F300654D07 /* TextMessageField.swift */; }; BC47C2EF2CE0017D008245CA /* MessageNodeIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC47C2EE2CE0017D008245CA /* MessageNodeIntent.swift */; }; - BC5EBA3C2D002A2000C442FF /* MessageNodeIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC5EBA3B2D002A2000C442FF /* MessageNodeIntent.swift */; }; BC6B45FF2CB2F98900723CEB /* SaveChannelSettingsIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC6B45FE2CB2F98900723CEB /* SaveChannelSettingsIntent.swift */; }; BCB613812C67290800485544 /* SendWaypointIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB613802C67290800485544 /* SendWaypointIntent.swift */; }; BCB613832C672A2600485544 /* MessageChannelIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCB613822C672A2600485544 /* MessageChannelIntent.swift */; }; @@ -1237,7 +1236,7 @@ attributes = { BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1540; - LastUpgradeCheck = 1600; + LastUpgradeCheck = 1630; TargetAttributes = { 25F5D5C62C4375A8008036E3 = { CreatedOnToolsVersion = 15.4; @@ -1482,7 +1481,6 @@ 251926872C3BAE2200249DF5 /* NodeAlertsButton.swift in Sources */, DDA1C48E28DB49D3009933EC /* ChannelRoles.swift in Sources */, DDD5BB092C285DDC007E03CA /* AppLog.swift in Sources */, - BC5EBA3C2D002A2000C442FF /* MessageNodeIntent.swift in Sources */, DD8ED9C8289CE4B900B3B0AB /* RoutingError.swift in Sources */, 233E99C52D84A0B600CC3A77 /* CompactWidget.swift in Sources */, DDC1B81A2AB5377B00C71E39 /* MessagesTips.swift in Sources */, @@ -1604,7 +1602,6 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = GCH7VS5Y9R; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; @@ -1628,7 +1625,6 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = GCH7VS5Y9R; GCC_C_LANGUAGE_STANDARD = gnu17; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 17.0; @@ -1678,6 +1674,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = GCH7VS5Y9R; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -1742,6 +1739,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = GCH7VS5Y9R; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1778,12 +1776,11 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"Meshtastic/Preview Content\""; - DEVELOPMENT_TEAM = GCH7VS5Y9R; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = Meshtastic/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Meshtastic; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; - IPHONEOS_DEPLOYMENT_TARGET = 17.2; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1812,12 +1809,11 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"Meshtastic/Preview Content\""; - DEVELOPMENT_TEAM = GCH7VS5Y9R; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = Meshtastic/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Meshtastic; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; - IPHONEOS_DEPLOYMENT_TARGET = 17.2; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1843,12 +1839,11 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = GCH7VS5Y9R; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = Widgets/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Widgets; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 17.2; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1876,12 +1871,11 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = GCH7VS5Y9R; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = Widgets/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Widgets; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 17.2; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Meshtastic.xcodeproj/xcshareddata/xcschemes/Meshtastic.xcscheme b/Meshtastic.xcodeproj/xcshareddata/xcschemes/Meshtastic.xcscheme index 508a6cab..53ea5ca7 100644 --- a/Meshtastic.xcodeproj/xcshareddata/xcschemes/Meshtastic.xcscheme +++ b/Meshtastic.xcodeproj/xcshareddata/xcschemes/Meshtastic.xcscheme @@ -1,6 +1,6 @@ some IntentResult & ProvidesDialog { if !BLEManager.shared.isConnected { throw AppIntentErrors.AppIntentError.notConnected } - + let fetchNodeInfoRequest: NSFetchRequest = NSFetchRequest(entityName: "NodeInfoEntity") fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) - + do { guard let fetchedNode = try PersistenceController.shared.container.viewContext.fetch(fetchNodeInfoRequest) as? [NodeInfoEntity], fetchedNode.count == 1 else { throw $nodeNum.needsValueError("Could not find node") } - + let nodeInfo = fetchedNode[0] if let latitude = nodeInfo.latestPosition?.coordinate.latitude, let longitude = nodeInfo.latestPosition?.coordinate.longitude { - + let url = URL(string: "maps://?saddr=&daddr=\(latitude),\(longitude)") - + if let mapURL = url, UIApplication.shared.canOpenURL(mapURL) { // Request to continue in foreground before opening the app try await requestToContinueInForeground() - + // Open Apple Maps for navigation UIApplication.shared.open(mapURL, options: [:], completionHandler: nil) return .result(dialog: "Navigating to node location.") diff --git a/Meshtastic/AppIntents/SaveChannelSettingsIntent.swift b/Meshtastic/AppIntents/SaveChannelSettingsIntent.swift index 902a66cc..095112ff 100644 --- a/Meshtastic/AppIntents/SaveChannelSettingsIntent.swift +++ b/Meshtastic/AppIntents/SaveChannelSettingsIntent.swift @@ -29,12 +29,9 @@ struct SaveChannelSettingsIntent: AppIntent { if channelUrl.absoluteString.lowercased().contains("meshtastic.org/e/#") { // Split the URL to get the portion after "#" let components = channelUrl.absoluteString.components(separatedBy: "#") - // Add channels flag based on the URL query parameter (if present) let addChannels = Bool(channelUrl["add"] ?? "false") ?? false - var channelSettings: String? - // Extract the Base64 encoded channel settings (after "#") if let lastComponent = components.last { channelSettings = lastComponent.components(separatedBy: "?").first // Ignore any query parameters @@ -44,7 +41,6 @@ struct SaveChannelSettingsIntent: AppIntent { if let channelSettings = channelSettings { // Call the BLEManager to save the channel settings let saveResult = BLEManager.shared.saveChannelSet(base64UrlString: channelSettings, addChannels: addChannels) - if !saveResult { throw AppIntentErrors.AppIntentError.message("Failed to save the channel settings.") } diff --git a/Meshtastic/Export/CsvDocument.swift b/Meshtastic/Export/CsvDocument.swift index f4bb04ac..7133633e 100644 --- a/Meshtastic/Export/CsvDocument.swift +++ b/Meshtastic/Export/CsvDocument.swift @@ -20,13 +20,10 @@ struct CsvDocument: FileDocument { } init(configuration: ReadConfiguration) throws { - if let data = configuration.file.regularFileContents { - - csvData = String(decoding: data, as: UTF8.self) + csvData = String(data: data, encoding: .utf8) ?? "" } else { - throw CocoaError(.fileReadCorruptFile) } } diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index b9f2a7d8..b46e6a46 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -579,7 +579,6 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { if let error { - Logger.services.error("🚫 [BLE] didUpdateValueFor Characteristic error \(error.localizedDescription, privacy: .public)") let errorCode = (error as NSError).code if errorCode == 5 || errorCode == 15 { @@ -633,14 +632,9 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } catch { Logger.services.error("💥 \(error.localizedDescription, privacy: .public) \(characteristic.value!, privacy: .public)") } - // Publish mqttClientProxyMessages received on the from radio if decodedInfo.payloadVariant == FromRadio.OneOf_PayloadVariant.mqttClientProxyMessage(decodedInfo.mqttClientProxyMessage) { - let message = CocoaMQTTMessage( - topic: decodedInfo.mqttClientProxyMessage.topic, - payload: [UInt8](decodedInfo.mqttClientProxyMessage.data), - retained: decodedInfo.mqttClientProxyMessage.retained - ) + let message = CocoaMQTTMessage(topic: decodedInfo.mqttClientProxyMessage.topic, payload: [UInt8](decodedInfo.mqttClientProxyMessage.data), retained: decodedInfo.mqttClientProxyMessage.retained) mqttManager.mqttClientProxy?.publish(message) } else if decodedInfo.payloadVariant == FromRadio.OneOf_PayloadVariant.clientNotification(decodedInfo.clientNotification) { if decodedInfo.clientNotification.hasReplyID { @@ -782,13 +776,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate adminAppPacket(packet: decodedInfo.packet, context: context) case .replyApp: Logger.mesh.info("🕸️ MESH PACKET received for Reply App handling as a text message") - textMessageAppPacket( - packet: decodedInfo.packet, - wantRangeTestPackets: wantRangeTestPackets, - connectedNode: (self.connectedPeripheral != nil ? connectedPeripheral.num : 0), - context: context, - appState: appState - ) + textMessageAppPacket(packet: decodedInfo.packet, wantRangeTestPackets: wantRangeTestPackets, connectedNode: (self.connectedPeripheral != nil ? connectedPeripheral.num : 0), context: context, appState: appState) case .ipTunnelApp: Logger.mesh.info("🕸️ MESH PACKET received for IP Tunnel App UNHANDLED UNHANDLED") case .serialApp: diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index 83f0b8ef..4b0aa7b4 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -686,20 +686,15 @@ func routingPacket (packet: MeshPacket, connectedNodeNum: Int64, context: NSMana func telemetryPacket(packet: MeshPacket, connectedNode: Int64, context: NSManagedObjectContext) { if let telemetryMessage = try? Telemetry(serializedBytes: packet.decoded.payload) { - let logString = String.localizedStringWithFormat("mesh.log.telemetry.received %@".localized, String(packet.from)) Logger.mesh.info("📈 \(logString, privacy: .public)") - if telemetryMessage.variant != Telemetry.OneOf_Variant.deviceMetrics(telemetryMessage.deviceMetrics) && telemetryMessage.variant != Telemetry.OneOf_Variant.environmentMetrics(telemetryMessage.environmentMetrics) && telemetryMessage.variant != Telemetry.OneOf_Variant.localStats(telemetryMessage.localStats) && telemetryMessage.variant != Telemetry.OneOf_Variant.powerMetrics(telemetryMessage.powerMetrics) { /// Other unhandled telemetry packets return } - let telemetry = TelemetryEntity(context: context) - let fetchNodeTelemetryRequest = NodeInfoEntity.fetchRequest() fetchNodeTelemetryRequest.predicate = NSPredicate(format: "num == %lld", Int64(packet.from)) - do { let fetchedNode = try context.fetch(fetchNodeTelemetryRequest) if fetchedNode.count == 1 { @@ -756,7 +751,6 @@ func telemetryPacket(packet: MeshPacket, connectedNode: Int64, context: NSManage Logger.statistics.info("📈 [Mesh Statistics] Channel Utilization: \(telemetryMessage.localStats.channelUtilization, privacy: .public) Airtime: \(telemetryMessage.localStats.airUtilTx, privacy: .public) Packets Sent: \(telemetryMessage.localStats.numPacketsTx, privacy: .public) Packets Received: \(telemetryMessage.localStats.numPacketsRx, privacy: .public) Bad Packets Received: \(telemetryMessage.localStats.numPacketsRxBad, privacy: .public) Nodes Online: \(telemetryMessage.localStats.numOnlineNodes, privacy: .public) of \(telemetryMessage.localStats.numTotalNodes, privacy: .public) nodes for Node: \(packet.from.toHex(), privacy: .public)") } else if telemetryMessage.variant == Telemetry.OneOf_Variant.powerMetrics(telemetryMessage.powerMetrics) { Logger.data.info("📈 [Power Metrics] Received for Node: \(packet.from.toHex(), privacy: .public)") - telemetry.powerCh1Voltage = telemetryMessage.powerMetrics.hasCh1Voltage.then(telemetryMessage.powerMetrics.ch1Voltage) telemetry.powerCh1Current = telemetryMessage.powerMetrics.hasCh1Current.then(telemetryMessage.powerMetrics.ch1Current) telemetry.powerCh2Voltage = telemetryMessage.powerMetrics.hasCh2Voltage.then(telemetryMessage.powerMetrics.ch2Voltage) @@ -764,7 +758,6 @@ func telemetryPacket(packet: MeshPacket, connectedNode: Int64, context: NSManage telemetry.powerCh3Voltage = telemetryMessage.powerMetrics.hasCh3Voltage.then(telemetryMessage.powerMetrics.ch3Voltage) telemetry.powerCh3Current = telemetryMessage.powerMetrics.hasCh3Current.then(telemetryMessage.powerMetrics.ch3Current) telemetry.metricsType = 2 - } telemetry.snr = packet.rxSnr telemetry.rssi = packet.rxRssi @@ -781,7 +774,6 @@ func telemetryPacket(packet: MeshPacket, connectedNode: Int64, context: NSManage fetchedNode[0].telemetries = mutableTelemetries.copy() as? NSOrderedSet } try context.save() - Logger.data.info("💾 [TelemetryEntity] of type \(MetricsTypes(rawValue: Int(telemetry.metricsType))?.name ?? "Unknown Metrics Type", privacy: .public) Saved for Node: \(packet.from.toHex(), privacy: .public)") if telemetry.metricsType == 0 { // Connected Device Metrics diff --git a/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift b/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift index 6dc1854b..435e162b 100644 --- a/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift +++ b/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift @@ -43,18 +43,13 @@ class MqttClientProxyManager { let port = defaultServerPort let username = node.mqttConfig?.username let password = node.mqttConfig?.password - // if host == defaultServerAddress { - //username = ProcessInfo.processInfo.environment["PUBLIC_MQTT_USERNAME"] - //password = ProcessInfo.processInfo.environment["PUBLIC_MQTT_PASSWORD"] - // } let root = node.mqttConfig?.root?.count ?? 0 > 0 ? node.mqttConfig?.root : "msh" let prefix = root! topic = prefix + "/2/e" + "/#" - let qos = CocoaMQTTQoS(rawValue: UInt8(1))! - connect(host: host, port: port, useSsl: useSsl, username: username, password: password, topic: topic, qos: qos, cleanSession: true) + connect(host: host, port: port, useSsl: useSsl, username: username, password: password, topic: topic) } } - func connect(host: String, port: Int, useSsl: Bool, username: String?, password: String?, topic: String?, qos: CocoaMQTTQoS, cleanSession: Bool) { + func connect(host: String, port: Int, useSsl: Bool, username: String?, password: String?, topic: String?) { guard !host.isEmpty else { delegate?.onMqttDisconnected() return @@ -67,7 +62,7 @@ class MqttClientProxyManager { mqttClient.username = username mqttClient.password = password mqttClient.keepAlive = 60 - mqttClient.cleanSession = cleanSession + mqttClient.cleanSession = true if debugLog { mqttClient.logLevel = .debug } diff --git a/Meshtastic/Model/Metrics Visualization/MetricsChartSeries.swift b/Meshtastic/Model/Metrics Visualization/MetricsChartSeries.swift index ab68c4cc..42e35ce0 100644 --- a/Meshtastic/Model/Metrics Visualization/MetricsChartSeries.swift +++ b/Meshtastic/Model/Metrics Visualization/MetricsChartSeries.swift @@ -41,7 +41,6 @@ class MetricsChartSeries: ObservableObject { // Used for scaling the Y-axis let initialYAxisRange: ClosedRange? let minumumYAxisSpan: Float? - // Main initializer init( id: String, diff --git a/Meshtastic/Model/Metrics Visualization/MetricsSeriesList.swift b/Meshtastic/Model/Metrics Visualization/MetricsSeriesList.swift index fb68af92..1def5f47 100644 --- a/Meshtastic/Model/Metrics Visualization/MetricsSeriesList.swift +++ b/Meshtastic/Model/Metrics Visualization/MetricsSeriesList.swift @@ -67,12 +67,12 @@ class MetricsSeriesList: ObservableObject, RandomAccessCollection, RangeReplacea for aSeries in self.visible { var seriesUpper = range[aSeries]?.upperBound ?? -.infinity var seriesLower = range[aSeries]?.lowerBound ?? .infinity - + if let value = aSeries.valueFor(te) { // Update the global bounds if value > globalUpper {globalUpper = value} if value < globalLower {globalLower = value} - + // Update the series bounds if necessary if value > seriesUpper || value < seriesLower { if value > seriesUpper { diff --git a/Meshtastic/Views/Helpers/CircleText.swift b/Meshtastic/Views/Helpers/CircleText.swift index c9ee41c6..f85decf4 100644 --- a/Meshtastic/Views/Helpers/CircleText.swift +++ b/Meshtastic/Views/Helpers/CircleText.swift @@ -10,11 +10,11 @@ struct CircleText: View { var text: String var color: Color var circleSize: CGFloat = 45 - var node: NodeInfoEntity? = nil - + var node: NodeInfoEntity? + var body: some View { if let node = node { - NavigationStack{ + NavigationStack { NavigationLink(destination: NodeDetail(node: node)) { circleContent } diff --git a/Meshtastic/Views/Helpers/Compact Widgets/CompactWidget.swift b/Meshtastic/Views/Helpers/Compact Widgets/CompactWidget.swift index 42411cc1..a999dae0 100644 --- a/Meshtastic/Views/Helpers/Compact Widgets/CompactWidget.swift +++ b/Meshtastic/Views/Helpers/Compact Widgets/CompactWidget.swift @@ -31,7 +31,7 @@ import SwiftUI WeightCompactWidget(weight: "123", unit: "kg") SoilTemperatureCompactWidget(temperature: "23", unit: "°C") SoilMoistureCompactWidget(moisture: "23", unit: "%") - + let rain: Float = 10.1 let locale = NSLocale.current as NSLocale let usesMetricSystem = locale.usesMetricSystem // Returns true for metric (mm), false for imperial (inches) diff --git a/Meshtastic/Views/Helpers/Compact Widgets/RadiationCompactWidget.swift b/Meshtastic/Views/Helpers/Compact Widgets/RadiationCompactWidget.swift index b5cd7232..582a1c26 100644 --- a/Meshtastic/Views/Helpers/Compact Widgets/RadiationCompactWidget.swift +++ b/Meshtastic/Views/Helpers/Compact Widgets/RadiationCompactWidget.swift @@ -16,7 +16,7 @@ struct RadiationCompactWidget: View { HStack(alignment: .firstTextBaseline) { Text(verbatim: "☢") .font(.system(size: 30, design: .monospaced)) - .foregroundColor(.accentColor) + .tint(.accentColor) Text("Radiation") .textCase(.uppercase) .font(.callout) diff --git a/Meshtastic/Views/Helpers/Compact Widgets/WeatherConditionsCompactWidget.swift b/Meshtastic/Views/Helpers/Compact Widgets/WeatherConditionsCompactWidget.swift index 4918c7b6..3cac48bf 100644 --- a/Meshtastic/Views/Helpers/Compact Widgets/WeatherConditionsCompactWidget.swift +++ b/Meshtastic/Views/Helpers/Compact Widgets/WeatherConditionsCompactWidget.swift @@ -39,4 +39,3 @@ struct WeatherConditionsCompactWidget: View { } } } - diff --git a/Meshtastic/Views/Messages/ChannelMessageList.swift b/Meshtastic/Views/Messages/ChannelMessageList.swift index 0696e9d8..f787f4f1 100644 --- a/Meshtastic/Views/Messages/ChannelMessageList.swift +++ b/Meshtastic/Views/Messages/ChannelMessageList.swift @@ -14,19 +14,16 @@ struct ChannelMessageList: View { @EnvironmentObject var appState: AppState @Environment(\.managedObjectContext) var context @EnvironmentObject var bleManager: BLEManager - // Keyboard State @FocusState var messageFieldFocused: Bool - @ObservedObject var myInfo: MyInfoEntity @ObservedObject var channel: ChannelEntity @State private var replyMessageId: Int64 = 0 @AppStorage("preferredPeripheralNum") private var preferredPeripheralNum = -1 - // Scroll state - @State private var showScrollToBottomButton = false - @State private var hasReachedBottom = false - @State private var gotFirstUnreadMessage: Bool = false + @State private var showScrollToBottomButton = false + @State private var hasReachedBottom = false + @State private var gotFirstUnreadMessage: Bool = false var body: some View { VStack { @@ -118,7 +115,7 @@ struct ChannelMessageList: View { .frame(maxWidth: .infinity) .id(message.messageId) .onAppear { - if gotFirstUnreadMessage{ + if gotFirstUnreadMessage { if !message.read { message.read = true do { @@ -184,7 +181,6 @@ struct ChannelMessageList: View { showScrollToBottomButton = true } } - // Scroll to bottom button if showScrollToBottomButton { Button { diff --git a/Meshtastic/Views/Messages/MessageText.swift b/Meshtastic/Views/Messages/MessageText.swift index 002d2c4c..c8a994c3 100644 --- a/Meshtastic/Views/Messages/MessageText.swift +++ b/Meshtastic/Views/Messages/MessageText.swift @@ -73,7 +73,6 @@ struct MessageText: View { } else { EmptyView() } - } .contextMenu { MessageContextMenuItems( diff --git a/Meshtastic/Views/Messages/UserMessageList.swift b/Meshtastic/Views/Messages/UserMessageList.swift index 6f995756..9824f621 100644 --- a/Meshtastic/Views/Messages/UserMessageList.swift +++ b/Meshtastic/Views/Messages/UserMessageList.swift @@ -20,7 +20,6 @@ struct UserMessageList: View { // View State Items @ObservedObject var user: UserEntity @State private var replyMessageId: Int64 = 0 - // Scroll state @State private var showScrollToBottomButton = false @State private var hasReachedBottom = false @@ -171,7 +170,6 @@ struct UserMessageList: View { showScrollToBottomButton = true } } - // Scroll to bottom button if showScrollToBottomButton { Button { diff --git a/Meshtastic/Views/Nodes/Helpers/Actions/NavigateToButton.swift b/Meshtastic/Views/Nodes/Helpers/Actions/NavigateToButton.swift index 78917082..403d1b98 100644 --- a/Meshtastic/Views/Nodes/Helpers/Actions/NavigateToButton.swift +++ b/Meshtastic/Views/Nodes/Helpers/Actions/NavigateToButton.swift @@ -14,45 +14,43 @@ struct NavigateToButton: View { var node: NodeInfoEntity var body: some View { - Button { - guard let userNum = node.user?.num else { - Logger.services.error("NavigateToAction: Selected node does not exist") + Button { + guard let userNum = node.user?.num else { + Logger.services.error("NavigateToAction: Selected node does not exist") + return + } + Logger.services.info("Fetching NodeInfoEntity for userNum: \(userNum, privacy: .public)") + + let fetchRequest: NSFetchRequest = NSFetchRequest(entityName: "NodeInfoEntity") + fetchRequest.predicate = NSPredicate(format: "num == %lld", Int64(userNum)) + + do { + let fetchedNodes = try PersistenceController.shared.container.viewContext.fetch(fetchRequest) + guard let nodeInfo = fetchedNodes.first else { + Logger.services.error("NavigateToAction: Node with userNum \(userNum, privacy: .public) not found in Core Data") return } - - Logger.services.info("Fetching NodeInfoEntity for userNum: \(userNum, privacy: .public)") - - let fetchRequest: NSFetchRequest = NSFetchRequest(entityName: "NodeInfoEntity") - fetchRequest.predicate = NSPredicate(format: "num == %lld", Int64(userNum)) - - do { - let fetchedNodes = try PersistenceController.shared.container.viewContext.fetch(fetchRequest) - - guard let nodeInfo = fetchedNodes.first else { - Logger.services.error("NavigateToAction: Node with userNum \(userNum, privacy: .public) not found in Core Data") - return - } - if let latitude = nodeInfo.latestPosition?.latitude, - let longitude = nodeInfo.latestPosition?.longitude { - if let url = URL(string: "maps://?saddr=&daddr=\(latitude),\(longitude)") { - UIApplication.shared.open(url, options: [:], completionHandler: nil) - } else { - Logger.services.error("Failed to create URL for navigation") - } + if let latitude = nodeInfo.latestPosition?.latitude, + let longitude = nodeInfo.latestPosition?.longitude { + if let url = URL(string: "maps://?saddr=&daddr=\(latitude),\(longitude)") { + UIApplication.shared.open(url, options: [:], completionHandler: nil) } else { - Logger.services.warning("NavigateToAction: Node \(userNum, privacy: .public) has invalid or missing coordinates") + Logger.services.error("Failed to create URL for navigation") } - } catch { - Logger.services.error("NavigateToAction: Failed to fetch node with userNum \(userNum, privacy: .public): \(error.localizedDescription, privacy: .public)") - } - } label: { - Label { - Text("Navigate to node") - } icon: { - Image(systemName: "map") - .symbolRenderingMode(.hierarchical) + } else { + Logger.services.warning("NavigateToAction: Node \(userNum, privacy: .public) has invalid or missing coordinates") } + } catch { + Logger.services.error("NavigateToAction: Failed to fetch node with userNum \(userNum, privacy: .public): \(error.localizedDescription, privacy: .public)") + } + } label: { + Label { + Text("Navigate to node") + } icon: { + Image(systemName: "map") + .symbolRenderingMode(.hierarchical) } } + } } diff --git a/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift b/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift index ce7a10ef..97df2327 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift @@ -23,7 +23,7 @@ struct PositionPopover: View { var body: some View { // Node Color from node.num let nodeColor = UIColor(hex: UInt32(position.nodePosition?.num ?? 0)) - NavigationStack{ + NavigationStack { VStack { HStack { ZStack { @@ -105,7 +105,6 @@ struct PositionPopover: View { .foregroundColor(.primary) .font(idiom == .phone ? .callout : .body) } - } icon: { Image(systemName: "mountain.2.fill") .symbolRenderingMode(.hierarchical) @@ -180,7 +179,6 @@ struct PositionPopover: View { } .padding(.bottom, 5) if position.nodePosition?.viaMqtt ?? false { - Label { Text("MQTT") .font(idiom == .phone ? .callout : .body) diff --git a/Meshtastic/Views/Nodes/Helpers/Metrics Columns/EnvironmentDefaultColumns.swift b/Meshtastic/Views/Nodes/Helpers/Metrics Columns/EnvironmentDefaultColumns.swift index ffd86987..42cf8663 100644 --- a/Meshtastic/Views/Nodes/Helpers/Metrics Columns/EnvironmentDefaultColumns.swift +++ b/Meshtastic/Views/Nodes/Helpers/Metrics Columns/EnvironmentDefaultColumns.swift @@ -220,7 +220,6 @@ extension MetricsColumnList { ) } ?? Text(Constants.nilValueIndicator) }), - // Rainfall 24-hour MetricsTableColumn( id: "rainfall24H", diff --git a/Meshtastic/Views/Nodes/Helpers/Metrics Columns/EnvironmentDefaultSeries.swift b/Meshtastic/Views/Nodes/Helpers/Metrics Columns/EnvironmentDefaultSeries.swift index d3762845..b2590b51 100644 --- a/Meshtastic/Views/Nodes/Helpers/Metrics Columns/EnvironmentDefaultSeries.swift +++ b/Meshtastic/Views/Nodes/Helpers/Metrics Columns/EnvironmentDefaultSeries.swift @@ -80,7 +80,7 @@ extension MetricsSeriesList { .alignsMarkStylesWithPlotArea() } }), - + // Barometric Pressure Series Configuration MetricsChartSeries( id: "barometricPressure", @@ -106,7 +106,7 @@ extension MetricsSeriesList { .alignsMarkStylesWithPlotArea() } }), - + // Indoor Air Quality Series Configuration MetricsChartSeries( id: "iaq", @@ -134,7 +134,7 @@ extension MetricsSeriesList { .alignsMarkStylesWithPlotArea() } }), - + // Lux MetricsChartSeries( id: "lux", @@ -460,7 +460,7 @@ extension MetricsSeriesList { .lineStyle(StrokeStyle(lineWidth: 4)) .alignsMarkStylesWithPlotArea() } - }), + }) ]) } } diff --git a/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift b/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift index cabfabc6..958906aa 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift @@ -77,7 +77,7 @@ struct NodeListItem: View { imageColor: .green, text: "connected".localized) } - if node.lastHeard?.timeIntervalSince1970 ?? 0 > 0 && node.lastHeard! < Calendar.current.date(byAdding: .year, value: 1, to: Date())!{ + if node.lastHeard?.timeIntervalSince1970 ?? 0 > 0 && node.lastHeard! < Calendar.current.date(byAdding: .year, value: 1, to: Date())! { IconAndText(systemName: node.isOnline ? "checkmark.circle.fill" : "moon.circle.fill", imageColor: node.isOnline ? .green : .orange, text: node.lastHeard?.formatted() ?? "unknown.age".localized) diff --git a/Meshtastic/Views/Nodes/NodeList.swift b/Meshtastic/Views/Nodes/NodeList.swift index 49b2d3a1..de1b522a 100644 --- a/Meshtastic/Views/Nodes/NodeList.swift +++ b/Meshtastic/Views/Nodes/NodeList.swift @@ -65,10 +65,7 @@ struct NodeList: View { var nodes: FetchedResults var connectedNode: NodeInfoEntity? { - getNodeInfo( - id: bleManager.connectedPeripheral?.num ?? 0, - context: context - ) + getNodeInfo(id: bleManager.connectedPeripheral?.num ?? 0, context: context) } @ViewBuilder @@ -78,19 +75,11 @@ struct NodeList: View { ) -> some View { /// Allow users to mute notifications for a node even if they are not connected if let user = node.user { - NodeAlertsButton( - context: context, - node: node, - user: user - ) + NodeAlertsButton(context: context, node: node, user: user) } if let connectedNode { /// Favoriting a node requires being connected - FavoriteNodeButton( - bleManager: bleManager, - context: context, - node: node - ) + FavoriteNodeButton(bleManager: bleManager, context: context, node: node) /// Don't show message, trace route, position exchange or delete context menu items for the connected node if connectedNode.num != node.num { if !node.viaMqtt || node.viaMqtt && node.hopsAway == 0 { diff --git a/Meshtastic/Views/Nodes/PositionLog.swift b/Meshtastic/Views/Nodes/PositionLog.swift index 6c78d1c3..5af381c9 100644 --- a/Meshtastic/Views/Nodes/PositionLog.swift +++ b/Meshtastic/Views/Nodes/PositionLog.swift @@ -65,8 +65,6 @@ struct PositionLog: View { .width(min: 180) } .textSelection(.enabled) - - } else { ScrollView { // Use a grid on iOS as a table only shows a single column diff --git a/Meshtastic/Views/Settings/About.swift b/Meshtastic/Views/Settings/About.swift index 84fa4b83..f6854bcb 100644 --- a/Meshtastic/Views/Settings/About.swift +++ b/Meshtastic/Views/Settings/About.swift @@ -14,7 +14,6 @@ struct AboutMeshtastic: View { var body: some View { VStack { - List { Section(header: Text("What is Meshtastic?")) { Text("An open source, off-grid, decentralized, mesh network that runs on affordable, low-power radios.") @@ -44,7 +43,7 @@ struct AboutMeshtastic: View { Button("Review the app") { if let scene = UIApplication.shared.connectedScenes .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene { - SKStoreReviewController.requestReview(in: scene) + AppStore.requestReview(in: scene) } } .font(.title2) diff --git a/Meshtastic/Views/Settings/AppLog.swift b/Meshtastic/Views/Settings/AppLog.swift index 53a32e07..88f8ab55 100644 --- a/Meshtastic/Views/Settings/AppLog.swift +++ b/Meshtastic/Views/Settings/AppLog.swift @@ -270,4 +270,4 @@ extension AppLog { } } -extension OSLogEntry: Identifiable { } +extension OSLogEntry: @retroactive Identifiable { } diff --git a/Meshtastic/Views/Settings/Config/DeviceConfig.swift b/Meshtastic/Views/Settings/Config/DeviceConfig.swift index 3fdc73b9..d8d0296d 100644 --- a/Meshtastic/Views/Settings/Config/DeviceConfig.swift +++ b/Meshtastic/Views/Settings/Config/DeviceConfig.swift @@ -30,11 +30,9 @@ struct DeviceConfig: View { @State var ledHeartbeatEnabled = true @State var tripleClickAsAdHocPing = true @State var tzdef = "" - @State private var showRouterWarning = false @State private var confirmWarning = false - var body: some View { VStack { Form { diff --git a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift index 21297a16..f9f9e499 100644 --- a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift @@ -388,7 +388,6 @@ struct MQTTConfig: View { } if let placemarks = placemarks, let placemark = placemarks.first { - let cc = locale.region?.identifier ?? "UNK" /// Country Topic unless your region is a country if !(region?.isCountry ?? false) { let countryTopic = defaultTopic + "/" + (placemark.isoCountryCode ?? "") diff --git a/Meshtastic/Views/Settings/Config/PositionConfig.swift b/Meshtastic/Views/Settings/Config/PositionConfig.swift index d8e6ad9f..b22e0dfd 100644 --- a/Meshtastic/Views/Settings/Config/PositionConfig.swift +++ b/Meshtastic/Views/Settings/Config/PositionConfig.swift @@ -139,7 +139,6 @@ struct PositionConfig: View { ForEach(GpsMode.allCases, id: \.self) { at in Text(at.description) .tag(at.id) - } } .pickerStyle(SegmentedPickerStyle()) @@ -314,7 +313,6 @@ struct PositionConfig: View { .font(.caption) } } - var saveButton: some View { SaveConfigButton(node: node, hasChanges: $hasChanges) { if fixedPosition && !supportedVersion { @@ -399,11 +397,7 @@ struct PositionConfig: View { .navigationTitle("position.config") .navigationBarItems( trailing: ZStack { - ConnectedDevice( - bluetoothOn: bleManager.isSwitchedOn, - deviceConnected: bleManager.connectedPeripheral != nil, - name: bleManager.connectedPeripheral?.shortName ?? "?" - ) + ConnectedDevice(bluetoothOn: bleManager.isSwitchedOn, deviceConnected: bleManager.connectedPeripheral != nil, name: bleManager.connectedPeripheral?.shortName ?? "?") } ) .onFirstAppear { diff --git a/Widgets/WidgetsLiveActivity.swift b/Widgets/WidgetsLiveActivity.swift index 3923fee7..656cc8a1 100644 --- a/Widgets/WidgetsLiveActivity.swift +++ b/Widgets/WidgetsLiveActivity.swift @@ -224,7 +224,7 @@ struct NodeInfoView: View { .foregroundStyle(.secondary) .opacity(isLuminanceReduced ? 0.8 : 1.0) .fixedSize() - + let now = Date() Text("Last Heard: \(now.formatted())") .font(.caption) From 339317086f40dc95272b98c838de09c4069d1bc5 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 27 Apr 2025 15:08:06 -0700 Subject: [PATCH 51/93] Mark a couple of polish keys as reviewed --- Localizable.xcstrings | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index c99fa002..f74299df 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -7906,7 +7906,7 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Domyślny" } }, @@ -15358,7 +15358,7 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Dołącz" } }, From 0854ead4f28d40d05c1cecdc4e2964fafac285ef Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 27 Apr 2025 15:15:39 -0700 Subject: [PATCH 52/93] Fix typo --- Meshtastic/Enums/PositionConfigEnums.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Meshtastic/Enums/PositionConfigEnums.swift b/Meshtastic/Enums/PositionConfigEnums.swift index 43f9f73e..6ee5059c 100644 --- a/Meshtastic/Enums/PositionConfigEnums.swift +++ b/Meshtastic/Enums/PositionConfigEnums.swift @@ -112,7 +112,7 @@ enum GpsMode: Int, CaseIterable, Equatable { case .disabled: return "Disabled".localized case .enabled: - return "Eenabled".localized + return "Enabled".localized case .notPresent: return "Not Present".localized } From a0e94bd518774b9ff507143f475b48c617090f31 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 27 Apr 2025 16:19:10 -0700 Subject: [PATCH 53/93] More translation key cleanup --- Localizable.xcstrings | 309 +++++------------- Meshtastic/Enums/IntervalEnums.swift | 4 +- Meshtastic/Enums/SerialConfigEnums.swift | 2 +- .../CoreData/PositionEntityExtension.swift | 2 +- Meshtastic/Helpers/BLEManager.swift | 130 ++++---- Meshtastic/Helpers/MeshPackets.swift | 10 +- Meshtastic/Persistence/UpdateCoreData.swift | 2 +- Meshtastic/Views/Bluetooth/Connect.swift | 6 +- .../Views/Messages/ChannelMessageList.swift | 4 +- Meshtastic/Views/Messages/UserList.swift | 2 +- .../Helpers/Actions/DeleteNodeButton.swift | 2 +- .../Nodes/Helpers/Map/NodeMapSwiftUI.swift | 2 +- .../Views/Nodes/Helpers/NodeDetail.swift | 4 +- .../Views/Nodes/Helpers/NodeInfoItem.swift | 2 +- .../Views/Nodes/Helpers/NodeListItem.swift | 4 +- Meshtastic/Views/Nodes/NodeList.swift | 2 +- Meshtastic/Views/Nodes/TraceRouteLog.swift | 12 +- .../Views/Settings/Channels/ChannelForm.swift | 2 +- .../Views/Settings/Config/DeviceConfig.swift | 4 +- .../Config/Module/CannedMessagesConfig.swift | 6 +- .../Config/Module/DetectionSensorConfig.swift | 2 +- .../Module/ExternalNotificationConfig.swift | 6 +- .../Config/Module/PaxCounterConfig.swift | 2 +- .../Settings/Config/Module/SerialConfig.swift | 8 +- .../Config/Module/StoreForwardConfig.swift | 6 +- .../Views/Settings/Config/NetworkConfig.swift | 4 +- .../Settings/Config/PositionConfig.swift | 8 +- .../Views/Settings/Config/PowerConfig.swift | 2 +- .../Settings/Config/SaveConfigButton.swift | 2 +- Meshtastic/Views/Settings/Firmware.swift | 4 +- Meshtastic/Views/Settings/Routes.swift | 2 +- Meshtastic/Views/Settings/Settings.swift | 16 +- 32 files changed, 206 insertions(+), 367 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index f74299df..616fb034 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -5848,64 +5848,6 @@ } } }, - "config.module.paxcounter.updateinterval" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Update Interval" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Update Interval" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Update Interval" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervallo di aggiornamento" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Update Interval" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uppdateringsintervall" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Интервал ажурирања" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "更新间隔" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "更新時間間隔" - } - } - } - }, "config.module.paxcounter.updateinterval.description" : { "localizations" : { "de" : { @@ -6236,64 +6178,6 @@ } } }, - "config.power.settings" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Strom" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Power" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Power" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Potenza" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Power" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ström" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Снага" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "电源" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "休眠" - } - } - } - }, "config.power.shutdown.after.secs" : { "localizations" : { "de" : { @@ -11070,65 +10954,59 @@ } } }, - "echo" : { + "Echo" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Echo" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Echo" } }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Écho" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "הד" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Eco" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Echo" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Eko" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Ехо" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "回声" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Echo" } } @@ -22922,59 +22800,53 @@ } } }, - "mode" : { + "Mode" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Modus" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mode" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Mode" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "מצב" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Modalità" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Tryb" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Läge" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Мод" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "模式" } }, @@ -25340,75 +25212,59 @@ } } }, - "password" : { - "localizations" : { - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "密碼" - } - } - } - }, "Password" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Passwort" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Password" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Mot de passe" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "סיסמא" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Password" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Hasło" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Lösenord" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Лозинка" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "密码" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "密碼" } } @@ -26046,7 +25902,7 @@ } } }, - "position" : { + "Position" : { "localizations" : { "de" : { "stringUnit" : { @@ -26432,22 +26288,52 @@ }, "Power" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Strom" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Power" + } + }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Potenza" } }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Power" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ström" + } + }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Снага" } }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "电源" + } + }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", - "value" : "電源" + "state" : "needs_review", + "value" : "休眠" } } } @@ -36792,28 +36678,6 @@ } } }, - "unknown" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "sconosciuto" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "непознато" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "未知" - } - } - } - }, "Unknown" : { "localizations" : { "de" : { @@ -36936,53 +36800,47 @@ } } }, - "unset" : { + "Unset" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Unset" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Unset" } }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Désactivé" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "לא נקבע" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Non impostato" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nieustawiony" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Återställ" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Уклони" } }, @@ -37279,6 +37137,9 @@ } }, "uptime" : { + + }, + "Uptime" : { "localizations" : { "de" : { "stringUnit" : { @@ -37318,28 +37179,6 @@ } } }, - "Uptime" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tempo di attività" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Време рада" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "已開機時間" - } - } - } - }, "Use a PWM output (like the RAK Buzzer) for tunes instead of an on/off output. This will ignore the output, output duration and active settings and use the device config buzzer GPIO option instead." : { "localizations" : { "it" : { diff --git a/Meshtastic/Enums/IntervalEnums.swift b/Meshtastic/Enums/IntervalEnums.swift index 0f967f28..976c8c92 100644 --- a/Meshtastic/Enums/IntervalEnums.swift +++ b/Meshtastic/Enums/IntervalEnums.swift @@ -22,7 +22,7 @@ enum NagIntervals: Int, CaseIterable, Identifiable { var description: String { switch self { case .unset: - return "unset".localized + return "Unset".localized case .oneSecond: return "interval.one.second".localized case .fiveSeconds: @@ -59,7 +59,7 @@ enum OutputIntervals: Int, CaseIterable, Identifiable { switch self { case .unset: - return "unset".localized + return "Unset".localized case .oneSecond: return "interval.one.second".localized case .twoSeconds: diff --git a/Meshtastic/Enums/SerialConfigEnums.swift b/Meshtastic/Enums/SerialConfigEnums.swift index 34388f40..2d31725b 100644 --- a/Meshtastic/Enums/SerialConfigEnums.swift +++ b/Meshtastic/Enums/SerialConfigEnums.swift @@ -166,7 +166,7 @@ enum SerialTimeoutIntervals: Int, CaseIterable, Identifiable { var description: String { switch self { case .unset: - return "unset".localized + return "Unset".localized case .oneSecond: return "interval.one.second".localized case .fiveSeconds: diff --git a/Meshtastic/Extensions/CoreData/PositionEntityExtension.swift b/Meshtastic/Extensions/CoreData/PositionEntityExtension.swift index a9eea507..4e05bcd6 100644 --- a/Meshtastic/Extensions/CoreData/PositionEntityExtension.swift +++ b/Meshtastic/Extensions/CoreData/PositionEntityExtension.swift @@ -89,6 +89,6 @@ extension PositionEntity { extension PositionEntity: MKAnnotation { public var coordinate: CLLocationCoordinate2D { nodeCoordinate ?? LocationsHandler.DefaultLocation } - public var title: String? { nodePosition?.user?.shortName ?? "unknown".localized } + public var title: String? { nodePosition?.user?.shortName ?? "Unknown".localized } public var subtitle: String? { time?.formatted() } } diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index b46e6a46..5391796d 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -261,7 +261,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate Notification( id: (peripheral.identifier.uuidString), title: "Radio Disconnected".localized, - subtitle: "\(peripheral.name ?? "unknown".localized)", + subtitle: "\(peripheral.name ?? "Unknown".localized)", content: e.localizedDescription, target: "bluetooth", path: "meshtastic:///bluetooth" @@ -281,7 +281,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate Notification( id: (peripheral.identifier.uuidString), title: "Radio Disconnected".localized, - subtitle: "\(peripheral.name ?? "unknown".localized)", + subtitle: "\(peripheral.name ?? "Unknown".localized)", content: e.localizedDescription, target: "bluetooth", path: "meshtastic:///bluetooth" @@ -428,7 +428,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate return 0 } - let messageDescription = "🛎️ [Device Metadata] Requested for node \(toUser.longName ?? "unknown".localized) by \(fromUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ [Device Metadata] Requested for node \(toUser.longName ?? "Unknown".localized) by \(fromUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return Int64(meshPacket.id) } @@ -477,7 +477,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate traceRoute.node = receivingNode do { try context.save() - Logger.data.info("💾 Saved TraceRoute sent to node: \(String(receivingNode?.user?.longName ?? "unknown".localized), privacy: .public)") + Logger.data.info("💾 Saved TraceRoute sent to node: \(String(receivingNode?.user?.longName ?? "Unknown".localized), privacy: .public)") } catch { context.rollback() let nsError = error as NSError @@ -503,7 +503,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate return } else { - let nodeName = connectedPeripheral?.peripheral.name ?? "unknown".localized + let nodeName = connectedPeripheral?.peripheral.name ?? "Unknown".localized let logString = String.localizedStringWithFormat("mesh.log.wantconfig %@".localized, nodeName) Logger.mesh.info("🛎️ \(logString, privacy: .public)") // BLE Characteristics discovered, issue wantConfig @@ -680,8 +680,8 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate if myInfo != nil { UserDefaults.preferredPeripheralNum = Int(myInfo?.myNodeNum ?? 0) connectedPeripheral.num = myInfo?.myNodeNum ?? 0 - connectedPeripheral.name = myInfo?.bleName ?? "unknown".localized - connectedPeripheral.longName = myInfo?.bleName ?? "unknown".localized + connectedPeripheral.name = myInfo?.bleName ?? "Unknown".localized + connectedPeripheral.longName = myInfo?.bleName ?? "Unknown".localized let newConnection = Int64(UserDefaults.preferredPeripheralNum) != Int64(decodedInfo.myInfo.myNodeNum) if newConnection { // Onboard a new device connection here @@ -696,7 +696,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate if self.connectedPeripheral != nil && self.connectedPeripheral.num == nodeInfo.num { if nodeInfo.user != nil { connectedPeripheral.shortName = nodeInfo.user?.shortName ?? "?" - connectedPeripheral.longName = nodeInfo.user?.longName ?? "unknown".localized + connectedPeripheral.longName = nodeInfo.user?.longName ?? "Unknown".localized } } } @@ -861,13 +861,13 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } hopNodes.append(traceRouteHop) - let hopName = hopNode?.user?.longName ?? (node == 4294967295 ? "Repeater" : String(hopNode?.num.toHex() ?? "unknown".localized)) + let hopName = hopNode?.user?.longName ?? (node == 4294967295 ? "Repeater" : String(hopNode?.num.toHex() ?? "Unknown".localized)) let mqttLabel = hopNode?.viaMqtt ?? false ? "MQTT " : "" let snrLabel = (traceRouteHop.snr != -32) ? String(traceRouteHop.snr) : "unknown ".localized routeString += "\(hopName) \(mqttLabel)(\(snrLabel)dB) --> " } let destinationHop = TraceRouteHopEntity(context: context) - destinationHop.name = traceRoute?.node?.user?.longName ?? "unknown".localized + destinationHop.name = traceRoute?.node?.user?.longName ?? "Unknown".localized destinationHop.time = Date() // If nil, set to unknown, INT8_MIN (-128) then divide by 4 destinationHop.snr = Float(routingMessage.snrTowards.last ?? -128) / 4 @@ -880,14 +880,14 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } hopNodes.append(destinationHop) /// Add the destination node to the end of the route towards string and the beginning of the route back string - routeString += "\(traceRoute?.node?.user?.longName ?? "unknown".localized) \((traceRoute?.node?.num ?? 0).toHex()) (\(destinationHop.snr != -32 ? String(destinationHop.snr) : "unknown ".localized)dB)" + routeString += "\(traceRoute?.node?.user?.longName ?? "Unknown".localized) \((traceRoute?.node?.num ?? 0).toHex()) (\(destinationHop.snr != -32 ? String(destinationHop.snr) : "unknown ".localized)dB)" traceRoute?.routeText = routeString // Default to -1 only fill in if routeBack is valid below traceRoute?.hopsBack = -1 // Only if hopStart is set and there is an SNR entry if decodedInfo.packet.hopStart > 0 && routingMessage.snrBack.count > 0 { traceRoute?.hopsBack = Int32(routingMessage.routeBack.count) - var routeBackString = "\(traceRoute?.node?.user?.longName ?? "unknown".localized) \((traceRoute?.node?.num ?? 0).toHex()) --> " + var routeBackString = "\(traceRoute?.node?.user?.longName ?? "Unknown".localized) \((traceRoute?.node?.num ?? 0).toHex()) --> " for (index, node) in routingMessage.routeBack.enumerated() { var hopNode = getNodeInfo(id: Int64(node), context: context) if hopNode == nil && hopNode?.num ?? 0 > 0 && node != 4294967295 { @@ -918,7 +918,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } hopNodes.append(traceRouteHop) - let hopName = hopNode?.user?.longName ?? (node == 4294967295 ? "Repeater" : String(hopNode?.num.toHex() ?? "unknown".localized)) + let hopName = hopNode?.user?.longName ?? (node == 4294967295 ? "Repeater" : String(hopNode?.num.toHex() ?? "Unknown".localized)) let mqttLabel = hopNode?.viaMqtt ?? false ? "MQTT " : "" let snrLabel = (traceRouteHop.snr != -32) ? String(traceRouteHop.snr) : "unknown ".localized routeBackString += "\(hopName) \(mqttLabel)(\(snrLabel)dB) --> " @@ -938,7 +938,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate id: (UUID().uuidString), title: "Traceroute Complete", subtitle: "TR received back from \(destinationHop.name ?? "unknown")", - content: "Hops from: \(tr.hopsTowards), Hops back: \(tr.hopsBack)\n\(tr.routeText ?? "unknown".localized)\n\(tr.routeBackText ?? "unknown".localized)", + content: "Hops from: \(tr.hopsTowards), Hops back: \(tr.hopsBack)\n\(tr.routeText ?? "Unknown".localized)\n\(tr.routeBackText ?? "Unknown".localized)", target: "nodes", path: "meshtastic:///nodes?nodenum=\(connectedNode.user?.num ?? 0)" ) @@ -1057,7 +1057,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate if preferredPeripheral != nil && preferredPeripheral?.peripheral != nil { connectTo(peripheral: preferredPeripheral!.peripheral) } - let nodeName = connectedPeripheral?.peripheral.name ?? "unknown".localized + let nodeName = connectedPeripheral?.peripheral.name ?? "Unknown".localized let logString = String.localizedStringWithFormat("mesh.log.textmessage.send.failed %@".localized, nodeName) Logger.mesh.info("🚫 \(logString, privacy: .public)") @@ -1292,7 +1292,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } else { return false } - let messageDescription = "🚀 Sent Set Fixed Postion Admin Message to: \(fromUser.longName ?? "unknown".localized) from: \(fromUser.longName ?? "unknown".localized)" + let messageDescription = "🚀 Sent Set Fixed Postion Admin Message to: \(fromUser.longName ?? "Unknown".localized) from: \(fromUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -1317,7 +1317,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } else { return false } - let messageDescription = "🚀 Sent Remove Fixed Position Admin Message to: \(fromUser.longName ?? "unknown".localized) from: \(fromUser.longName ?? "unknown".localized)" + let messageDescription = "🚀 Sent Remove Fixed Position Admin Message to: \(fromUser.longName ?? "Unknown".localized) from: \(fromUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -1422,7 +1422,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } else { return false } - let messageDescription = "🚀 Sent Shutdown Admin Message to: \(toUser.longName ?? "unknown".localized) from: \(fromUser.longName ?? "unknown".localized)" + let messageDescription = "🚀 Sent Shutdown Admin Message to: \(toUser.longName ?? "Unknown".localized) from: \(fromUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -1450,7 +1450,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } else { return false } - let messageDescription = "🚀 Sent Reboot Admin Message to: \(toUser.longName ?? "unknown".localized) from: \(fromUser.longName ?? "unknown".localized)" + let messageDescription = "🚀 Sent Reboot Admin Message to: \(toUser.longName ?? "Unknown".localized) from: \(fromUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -1478,7 +1478,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } else { return false } - let messageDescription = "🚀 Sent Reboot OTA Admin Message to: \(toUser.longName ?? "unknown".localized) from: \(fromUser.longName ?? "unknown".localized)" + let messageDescription = "🚀 Sent Reboot OTA Admin Message to: \(toUser.longName ?? "Unknown".localized) from: \(fromUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -1507,7 +1507,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate return false } automaticallyReconnect = false - let messageDescription = "🚀 Sent enter DFU mode Admin Message to: \(toUser.longName ?? "unknown".localized) from: \(fromUser.longName ?? "unknown".localized)" + let messageDescription = "🚀 Sent enter DFU mode Admin Message to: \(toUser.longName ?? "Unknown".localized) from: \(fromUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -1535,7 +1535,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate return false } - let messageDescription = "🚀 Sent Factory Reset Admin Message to: \(toUser.longName ?? "unknown".localized) from: \(fromUser.longName ?? "unknown".localized)" + let messageDescription = "🚀 Sent Factory Reset Admin Message to: \(toUser.longName ?? "Unknown".localized) from: \(fromUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -1562,7 +1562,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🚀 Sent NodeDB Reset Admin Message to: \(toUser.longName ?? "unknown".localized) from: \(fromUser.longName ?? "unknown".localized)" + let messageDescription = "🚀 Sent NodeDB Reset Admin Message to: \(toUser.longName ?? "Unknown".localized) from: \(fromUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -1605,7 +1605,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.wantResponse = true meshPacket.decoded = dataMessage - let messageDescription = "🎛️ Requested Channel \(channel.index) for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🎛️ Requested Channel \(channel.index) for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return Int64(meshPacket.id) } @@ -1629,7 +1629,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.wantResponse = true meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Channel \(channel.index) for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Channel \(channel.index) for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return Int64(meshPacket.id) } @@ -1778,7 +1778,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } else { return 0 } - let messageDescription = "🛟 Saved User Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved User Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return Int64(meshPacket.id) } @@ -1960,7 +1960,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.payload = adminData dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Ham Parameters for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Ham Parameters for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return Int64(meshPacket.id) } @@ -1986,7 +1986,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.payload = adminData dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Bluetooth Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Bluetooth Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertBluetoothConfigPacket(config: config, nodeNum: toUser.num, sessionPasskey: toUser.userNode?.sessionPasskey, context: context) @@ -2017,7 +2017,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.payload = adminData dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Device Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Device Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertDeviceConfigPacket(config: config, nodeNum: toUser.num, sessionPasskey: toUser.userNode?.sessionPasskey, context: context) return Int64(meshPacket.id) @@ -2047,7 +2047,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.payload = adminData dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Display Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Display Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertDisplayConfigPacket(config: config, nodeNum: toUser.num, sessionPasskey: toUser.userNode?.sessionPasskey, context: context) return Int64(meshPacket.id) @@ -2076,7 +2076,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.payload = adminData dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved LoRa Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved LoRa Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertLoRaConfigPacket(config: config, nodeNum: toUser.num, sessionPasskey: toUser.userNode?.sessionPasskey, context: context) @@ -2108,7 +2108,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Position Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Position Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertPositionConfigPacket(config: config, nodeNum: toUser.num, context: context) @@ -2139,7 +2139,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Power Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Power Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertPowerConfigPacket(config: config, nodeNum: toUser.num, context: context) @@ -2172,7 +2172,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Network Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Network Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertNetworkConfigPacket(config: config, nodeNum: toUser.num, context: context) @@ -2205,7 +2205,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Security Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Security Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertSecurityConfigPacket(config: config, nodeNum: toUser.num, context: context) @@ -2237,7 +2237,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Ambient Lighting Module Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Ambient Lighting Module Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertAmbientLightingModuleConfigPacket(config: config, nodeNum: toUser.num, context: context) @@ -2269,7 +2269,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Canned Message Module Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Canned Message Module Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertCannedMessagesModuleConfigPacket(config: config, nodeNum: toUser.num, context: context) @@ -2302,7 +2302,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.wantResponse = true meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Canned Message Module Messages for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Canned Message Module Messages for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { @@ -2335,7 +2335,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Detection Sensor Module Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Detection Sensor Module Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertDetectionSensorModuleConfigPacket(config: config, nodeNum: toUser.num, context: context) return Int64(meshPacket.id) @@ -2366,7 +2366,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved External Notification Module Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved External Notification Module Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertExternalNotificationModuleConfigPacket(config: config, nodeNum: toUser.num, context: context) return Int64(meshPacket.id) @@ -2397,7 +2397,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved PAX Counter Module Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved PAX Counter Module Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertPaxCounterModuleConfigPacket(config: config, nodeNum: toUser.num, context: context) return Int64(meshPacket.id) @@ -2428,7 +2428,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved RTTTL Ringtone Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved RTTTL Ringtone Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertRtttlConfigPacket(ringtone: ringtone, nodeNum: toUser.num, context: context) @@ -2462,7 +2462,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved MQTT Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved MQTT Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertMqttModuleConfigPacket(config: config, nodeNum: toUser.num, context: context) return Int64(meshPacket.id) @@ -2492,7 +2492,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Range Test Module Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Range Test Module Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertRangeTestModuleConfigPacket(config: config, nodeNum: toUser.num, context: context) @@ -2525,7 +2525,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Serial Module Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Serial Module Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertSerialModuleConfigPacket(config: config, nodeNum: toUser.num, context: context) return Int64(meshPacket.id) @@ -2556,7 +2556,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "🛟 Saved Store & Forward Module Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛟 Saved Store & Forward Module Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertStoreForwardModuleConfigPacket(config: config, nodeNum: toUser.num, context: context) return Int64(meshPacket.id) @@ -2587,7 +2587,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.portnum = PortNum.adminApp meshPacket.decoded = dataMessage - let messageDescription = "Saved Telemetry Module Config for \(toUser.longName ?? "unknown".localized)" + let messageDescription = "Saved Telemetry Module Config for \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { upsertTelemetryModuleConfigPacket(config: config, nodeNum: toUser.num, context: context) return Int64(meshPacket.id) @@ -2617,7 +2617,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Sent a Get Channel \(channelIndex) Request Admin Message for node: \(toUser.longName ?? "unknown".localized))" + let messageDescription = "🛎️ Sent a Get Channel \(channelIndex) Request Admin Message for node: \(toUser.longName ?? "Unknown".localized))" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { @@ -2723,7 +2723,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested Device Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested Device Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true @@ -2753,7 +2753,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested Display Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested Display Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true @@ -2783,7 +2783,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested LoRa Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested LoRa Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { @@ -2814,7 +2814,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate dataMessage.wantResponse = true meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested Network Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested Network Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true @@ -2844,7 +2844,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested Position Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested Position Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -2873,7 +2873,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested Power Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested Power Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -2902,7 +2902,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested Security Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested Security Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -2931,7 +2931,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested Ambient Lighting Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested Ambient Lighting Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -2960,7 +2960,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested Canned Messages Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested Canned Messages Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -2989,7 +2989,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested External Notificaiton Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested External Notificaiton Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -3018,7 +3018,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested PAX Counter Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested PAX Counter Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -3047,7 +3047,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested RTTTL Ringtone Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested RTTTL Ringtone Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -3076,7 +3076,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested Range Test Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested Range Test Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -3134,7 +3134,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested Detection Sensor Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested Detection Sensor Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -3163,7 +3163,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested Serial Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested Serial Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -3192,7 +3192,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested Store and Forward Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested Store and Forward Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } @@ -3222,7 +3222,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate meshPacket.decoded = dataMessage - let messageDescription = "🛎️ Requested Telemetry Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "unknown".localized)" + let messageDescription = "🛎️ Requested Telemetry Module Config on admin channel \(adminIndex) for node: \(toUser.longName ?? "Unknown".localized)" if sendAdminMessageToRadio(meshPacket: meshPacket, adminDescription: messageDescription) { return true } diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index 4b0aa7b4..bcc4659b 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -625,7 +625,7 @@ func routingPacket (packet: MeshPacket, connectedNodeNum: Int64, context: NSMana let routingError = RoutingError(rawValue: routingMessage.errorReason.rawValue) - let routingErrorString = routingError?.display ?? "unknown".localized + let routingErrorString = routingError?.display ?? "Unknown".localized let logString = String.localizedStringWithFormat("mesh.log.routing.message %@ %@".localized, String(packet.decoded.requestID), routingErrorString) Logger.mesh.info("🕸️ \(logString, privacy: .public)") @@ -972,7 +972,7 @@ func textMessageAppPacket( manager.notifications = [ Notification( id: ("notification.id.\(newMessage.messageId)"), - title: "\(newMessage.fromUser?.longName ?? "unknown".localized)", + title: "\(newMessage.fromUser?.longName ?? "Unknown".localized)", subtitle: "AKA \(newMessage.fromUser?.shortName ?? "?")", content: messageText!, target: "messages", @@ -984,7 +984,7 @@ func textMessageAppPacket( ) ] manager.schedule() - Logger.services.debug("iOS Notification Scheduled for text message from \(newMessage.fromUser?.longName ?? "unknown".localized, privacy: .public)") + Logger.services.debug("iOS Notification Scheduled for text message from \(newMessage.fromUser?.longName ?? "Unknown".localized, privacy: .public)") } } else if newMessage.fromUser != nil && newMessage.toUser == nil { let fetchMyInfoRequest = MyInfoEntity.fetchRequest() @@ -1003,7 +1003,7 @@ func textMessageAppPacket( manager.notifications = [ Notification( id: ("notification.id.\(newMessage.messageId)"), - title: "\(newMessage.fromUser?.longName ?? "unknown".localized)", + title: "\(newMessage.fromUser?.longName ?? "Unknown".localized)", subtitle: "AKA \(newMessage.fromUser?.shortName ?? "?")", content: messageText!, target: "messages", @@ -1015,7 +1015,7 @@ func textMessageAppPacket( ) ] manager.schedule() - Logger.services.debug("iOS Notification Scheduled for text message from \(newMessage.fromUser?.longName ?? "unknown".localized, privacy: .public)") + Logger.services.debug("iOS Notification Scheduled for text message from \(newMessage.fromUser?.longName ?? "Unknown".localized, privacy: .public)") } } } diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index e5e7bd87..b2673477 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -200,7 +200,7 @@ func upsertNodeInfoPacket (packet: MeshPacket, context: NSManagedObjectContext) Notification( id: (UUID().uuidString), title: "New Node".localized, - subtitle: "\(newUser.longName ?? "unknown".localized)", + subtitle: "\(newUser.longName ?? "Unknown".localized)", content: "New Node has been discovered".localized, target: "nodes", path: "meshtastic:///nodes?nodenum=\(newUser.num)" diff --git a/Meshtastic/Views/Bluetooth/Connect.swift b/Meshtastic/Views/Bluetooth/Connect.swift index 6dacb044..8e04f857 100644 --- a/Meshtastic/Views/Bluetooth/Connect.swift +++ b/Meshtastic/Views/Bluetooth/Connect.swift @@ -64,10 +64,10 @@ struct Connect: View { if node != nil { Text(connectedPeripheral.longName.addingVariationSelectors).font(.title2) } - Text("BLE Name").font(.callout)+Text(": \(bleManager.connectedPeripheral?.peripheral.name?.addingVariationSelectors ?? "unknown".localized)") + Text("BLE Name").font(.callout)+Text(": \(bleManager.connectedPeripheral?.peripheral.name?.addingVariationSelectors ?? "Unknown".localized)") .font(.callout).foregroundColor(Color.gray) if node != nil { - Text("Firmware Version").font(.callout)+Text(": \(node?.metadata?.firmwareVersion ?? "unknown".localized)") + Text("Firmware Version").font(.callout)+Text(": \(node?.metadata?.firmwareVersion ?? "Unknown".localized)") .font(.callout).foregroundColor(Color.gray) } if bleManager.isSubscribed { @@ -121,7 +121,7 @@ struct Connect: View { #endif Text("Num: \(String(node!.num))") Text("Short Name: \(node?.user?.shortName ?? "?")") - Text("Long Name: \(node?.user?.longName?.addingVariationSelectors ?? "unknown".localized)") + Text("Long Name: \(node?.user?.longName?.addingVariationSelectors ?? "Unknown".localized)") Text("BLE RSSI: \(connectedPeripheral.rssi)") Button { diff --git a/Meshtastic/Views/Messages/ChannelMessageList.swift b/Meshtastic/Views/Messages/ChannelMessageList.swift index f787f4f1..e400b5fe 100644 --- a/Meshtastic/Views/Messages/ChannelMessageList.swift +++ b/Meshtastic/Views/Messages/ChannelMessageList.swift @@ -60,7 +60,7 @@ struct ChannelMessageList: View { let isDetectionSensorMessage = message.portNum == Int32(PortNum.detectionSensorApp.rawValue) if !currentUser && message.fromUser != nil { - Text("\(message.fromUser?.longName ?? "unknown".localized ) (\(message.fromUser?.userId ?? "?"))") + Text("\(message.fromUser?.longName ?? "Unknown".localized ) (\(message.fromUser?.userId ?? "?"))") .font(.caption) .foregroundColor(.gray) .offset(y: 8) @@ -212,7 +212,7 @@ struct ChannelMessageList: View { ToolbarItem(placement: .principal) { HStack { CircleText(text: String(channel.index), color: .accentColor, circleSize: 44).fixedSize() - Text(String(channel.name ?? "unknown".localized).camelCaseToWords()).font(.headline) + Text(String(channel.name ?? "Unknown".localized).camelCaseToWords()).font(.headline) } } ToolbarItem(placement: .navigationBarTrailing) { diff --git a/Meshtastic/Views/Messages/UserList.swift b/Meshtastic/Views/Messages/UserList.swift index b0602d5f..2888a54e 100644 --- a/Meshtastic/Views/Messages/UserList.swift +++ b/Meshtastic/Views/Messages/UserList.swift @@ -93,7 +93,7 @@ struct UserList: View { Image(systemName: "lock.open.fill") .foregroundColor(.yellow) } - Text(user.longName ?? "unknown".localized) + Text(user.longName ?? "Unknown".localized) .font(.headline) .allowsTightening(true) Spacer() diff --git a/Meshtastic/Views/Nodes/Helpers/Actions/DeleteNodeButton.swift b/Meshtastic/Views/Nodes/Helpers/Actions/DeleteNodeButton.swift index 127a31d7..c5495c10 100644 --- a/Meshtastic/Views/Nodes/Helpers/Actions/DeleteNodeButton.swift +++ b/Meshtastic/Views/Nodes/Helpers/Actions/DeleteNodeButton.swift @@ -49,7 +49,7 @@ struct DeleteNodeButton: View { connectedNodeNum: connectedNode.num ) if !success { - Logger.data.error("Failed to delete node \(deleteNode.user?.longName ?? "unknown".localized, privacy: .public)") + Logger.data.error("Failed to delete node \(deleteNode.user?.longName ?? "Unknown".localized, privacy: .public)") } else { dismiss() } diff --git a/Meshtastic/Views/Nodes/Helpers/Map/NodeMapSwiftUI.swift b/Meshtastic/Views/Nodes/Helpers/Map/NodeMapSwiftUI.swift index 36d9a915..f5a2f84c 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/NodeMapSwiftUI.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/NodeMapSwiftUI.swift @@ -189,7 +189,7 @@ struct NodeMapSwiftUI: View { UIApplication.shared.isIdleTimerDisabled = false } }} - .navigationBarTitle(String((node.user?.shortName ?? "unknown".localized) + (" \(node.positions?.count ?? 0) points")), displayMode: .inline) + .navigationBarTitle(String((node.user?.shortName ?? "Unknown".localized) + (" \(node.positions?.count ?? 0) points")), displayMode: .inline) .navigationBarItems(trailing: ZStack { ConnectedDevice( diff --git a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift index bd2abae8..01f3a406 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift @@ -127,7 +127,7 @@ struct NodeDetail: View { } Spacer() - Text(metadata.firmwareVersion ?? "unknown".localized) + Text(metadata.firmwareVersion ?? "Unknown".localized) } } @@ -520,7 +520,7 @@ struct NodeDetail: View { } } .listStyle(.insetGrouped) - .navigationBarTitle(String(node.user?.longName?.addingVariationSelectors ?? "unknown".localized), displayMode: .inline) + .navigationBarTitle(String(node.user?.longName?.addingVariationSelectors ?? "Unknown".localized), displayMode: .inline) } } } diff --git a/Meshtastic/Views/Nodes/Helpers/NodeInfoItem.swift b/Meshtastic/Views/Nodes/Helpers/NodeInfoItem.swift index 6a8f468a..07f3d92c 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeInfoItem.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeInfoItem.swift @@ -74,7 +74,7 @@ struct NodeInfoItem: View { } Spacer() if user.hwModel != "UNSET" { - Text(String(node.user?.hwDisplayName ?? (node.user?.hwModel ?? "unset".localized))) + Text(String(node.user?.hwDisplayName ?? (node.user?.hwModel ?? "Unset".localized))) } else { Text(String("incomplete".localized)) } diff --git a/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift b/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift index 958906aa..9c7201e1 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift @@ -64,7 +64,7 @@ struct NodeListItem: View { let (image, color) = userKeyStatus IconAndText(systemName: image, imageColor: color, - text: node.user?.longName?.addingVariationSelectors ?? "unknown".localized, + text: node.user?.longName?.addingVariationSelectors ?? "Unknown".localized, textColor: .primary) if node.favorite { Spacer() @@ -84,7 +84,7 @@ struct NodeListItem: View { } let role = DeviceRoles(rawValue: Int(node.user?.role ?? 0)) IconAndText(systemName: role?.systemName ?? "figure", - text: "Role: \(role?.name ?? "unknown".localized)") + text: "Role: \(role?.name ?? "Unknown".localized)") if node.isStoreForwardRouter { IconAndText(systemName: "envelope.arrow.triangle.branch", renderingMode: .multicolor, diff --git a/Meshtastic/Views/Nodes/NodeList.swift b/Meshtastic/Views/Nodes/NodeList.swift index de1b522a..b4713dbd 100644 --- a/Meshtastic/Views/Nodes/NodeList.swift +++ b/Meshtastic/Views/Nodes/NodeList.swift @@ -226,7 +226,7 @@ struct NodeList: View { if deleteNode != nil { let success = bleManager.removeNode(node: deleteNode!, connectedNodeNum: Int64(bleManager.connectedPeripheral?.num ?? -1)) if !success { - Logger.data.error("Failed to delete node \(deleteNode?.user?.longName ?? "unknown".localized, privacy: .public)") + Logger.data.error("Failed to delete node \(deleteNode?.user?.longName ?? "Unknown".localized, privacy: .public)") } } } diff --git a/Meshtastic/Views/Nodes/TraceRouteLog.swift b/Meshtastic/Views/Nodes/TraceRouteLog.swift index e4ad4add..bd50f3ac 100644 --- a/Meshtastic/Views/Nodes/TraceRouteLog.swift +++ b/Meshtastic/Views/Nodes/TraceRouteLog.swift @@ -37,14 +37,14 @@ struct TraceRouteLog: View { VStack { List(node.traceRoutes?.reversed() as? [TraceRouteEntity] ?? [], id: \.self, selection: $selectedRoute) { route in Label { - let routeTime = route.time?.formatted() ?? "unknown".localized + let routeTime = route.time?.formatted() ?? "Unknown".localized if route.response && route.hopsTowards == route.hopsBack { let hopString = String(localized: "\(route.hopsTowards) Hops") Text("\(routeTime) - \(hopString)") .font(.caption) } else if route.response { let hopTowardsString = String(localized: "\(route.hopsTowards) Hops") - let hopBackString = route.hopsBack >= 0 ? String(localized: "\(route.hopsBack) Hops") : String(localized: "unknown") + let hopBackString = route.hopsBack >= 0 ? String(localized: "\(route.hopsBack) Hops") : String(localized: "Unknown") Text("\(routeTime) - \(hopTowardsString) Towards \(hopBackString) Back") .font(.caption) } else if route.sent { @@ -78,14 +78,14 @@ struct TraceRouteLog: View { if selectedRoute != nil { if selectedRoute?.response ?? false && selectedRoute?.hopsTowards ?? 0 >= 0 { Label { - Text("Route: \(selectedRoute?.routeText ?? "unknown".localized)") + Text("Route: \(selectedRoute?.routeText ?? "Unknown".localized)") } icon: { Image(systemName: "signpost.right") .symbolRenderingMode(.hierarchical) } .font(.title3) Label { - Text("Route Back: \(selectedRoute?.routeBackText ?? "unknown".localized)") + Text("Route Back: \(selectedRoute?.routeBackText ?? "Unknown".localized)") } icon: { Image(systemName: "signpost.left") .symbolRenderingMode(.hierarchical) @@ -94,7 +94,7 @@ struct TraceRouteLog: View { } else if !(selectedRoute?.sent ?? true) { Label { VStack { - Text("Trace route to \(selectedRoute?.node?.user?.longName ?? "unknown".localized) was not sent.") + Text("Trace route to \(selectedRoute?.node?.user?.longName ?? "Unknown".localized) was not sent.") .font(idiom == .phone ? .body : .largeTitle) .fontWeight(.semibold) Text("Trace Route was rate limited. You can send a trace route a maximum of once every thirty seconds.") @@ -109,7 +109,7 @@ struct TraceRouteLog: View { } else { Label { VStack { - Text("Trace route sent to \(selectedRoute?.node?.user?.longName ?? "unknown".localized)") + Text("Trace route sent to \(selectedRoute?.node?.user?.longName ?? "Unknown".localized)") .font(idiom == .phone ? .body : .largeTitle) .fontWeight(.semibold) Text("A Trace Route was sent, no response has been received.") diff --git a/Meshtastic/Views/Settings/Channels/ChannelForm.swift b/Meshtastic/Views/Settings/Channels/ChannelForm.swift index 0b449274..92f1b8e2 100644 --- a/Meshtastic/Views/Settings/Channels/ChannelForm.swift +++ b/Meshtastic/Views/Settings/Channels/ChannelForm.swift @@ -128,7 +128,7 @@ struct ChannelForm: View { } } - Section(header: Text("position")) { + Section(header: Text("Position")) { VStack(alignment: .leading) { Toggle(isOn: $positionsEnabled) { Label(channelRole == 1 ? "Positions Enabled" : "Allow Position Requests", systemImage: positionsEnabled ? "mappin" : "mappin.slash") diff --git a/Meshtastic/Views/Settings/Config/DeviceConfig.swift b/Meshtastic/Views/Settings/Config/DeviceConfig.swift index d8d0296d..807aa673 100644 --- a/Meshtastic/Views/Settings/Config/DeviceConfig.swift +++ b/Meshtastic/Views/Settings/Config/DeviceConfig.swift @@ -147,7 +147,7 @@ struct DeviceConfig: View { Picker("Button GPIO", selection: $buttonGPIO) { ForEach(0..<49) { if $0 == 0 { - Text("unset") + Text("Unset") } else { Text("Pin \($0)") } @@ -157,7 +157,7 @@ struct DeviceConfig: View { Picker("Buzzer GPIO", selection: $buzzerGPIO) { ForEach(0..<49) { if $0 == 0 { - Text("unset") + Text("Unset") } else { Text("Pin \($0)") } diff --git a/Meshtastic/Views/Settings/Config/Module/CannedMessagesConfig.swift b/Meshtastic/Views/Settings/Config/Module/CannedMessagesConfig.swift index e95d524f..20a62136 100644 --- a/Meshtastic/Views/Settings/Config/Module/CannedMessagesConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/CannedMessagesConfig.swift @@ -103,7 +103,7 @@ struct CannedMessagesConfig: View { Picker("Pin A", selection: $inputbrokerPinA) { ForEach(0..<49) { if $0 == 0 { - Text("unset") + Text("Unset") } else { Text("Pin \($0)") } @@ -118,7 +118,7 @@ struct CannedMessagesConfig: View { Picker("Pin B", selection: $inputbrokerPinB) { ForEach(0..<49) { if $0 == 0 { - Text("unset") + Text("Unset") } else { Text("Pin \($0)") } @@ -133,7 +133,7 @@ struct CannedMessagesConfig: View { Picker("Press Pin", selection: $inputbrokerPinPress) { ForEach(0..<49) { if $0 == 0 { - Text("unset") + Text("Unset") } else { Text("Pin \($0)") } diff --git a/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift b/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift index 21e24177..bdbffa39 100644 --- a/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift @@ -108,7 +108,7 @@ struct DetectionSensorConfig: View { Picker("GPIO Pin to monitor", selection: $monitorPin) { ForEach(0..<49) { if $0 == 0 { - Text("unset") + Text("Unset") } else { Text("Pin \($0)") } diff --git a/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift b/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift index 01d2f247..fc1835fb 100644 --- a/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift @@ -82,7 +82,7 @@ struct ExternalNotificationConfig: View { Picker("Output pin GPIO", selection: $output) { ForEach(0..<49) { if $0 == 0 { - Text("unset") + Text("Unset") } else { Text("Pin \($0)") } @@ -138,7 +138,7 @@ struct ExternalNotificationConfig: View { Picker("Output pin buzzer GPIO ", selection: $outputBuzzer) { ForEach(0..<49) { if $0 == 0 { - Text("unset") + Text("Unset") } else { Text("Pin \($0)") } @@ -148,7 +148,7 @@ struct ExternalNotificationConfig: View { Picker("Output pin vibra GPIO", selection: $outputVibra) { ForEach(0..<49) { if $0 == 0 { - Text("unset") + Text("Unset") } else { Text("Pin \($0)") } diff --git a/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift b/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift index 5f78379e..492e3d2d 100644 --- a/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift @@ -32,7 +32,7 @@ struct PaxCounterConfig: View { .toggleStyle(SwitchToggleStyle(tint: .accentColor)) .listRowSeparator(.visible) if enabled { - Picker("config.module.paxcounter.updateinterval", selection: $paxcounterUpdateInterval) { + Picker("Update Interval", selection: $paxcounterUpdateInterval) { ForEach(UpdateIntervals.allCases) { at in if at.rawValue >= 300 { Text(at.description) diff --git a/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift b/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift index 06b4b06a..47dca015 100644 --- a/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift @@ -41,7 +41,7 @@ struct SerialConfig: View { .toggleStyle(SwitchToggleStyle(tint: .accentColor)) Toggle(isOn: $echo) { - Label("echo", systemImage: "repeat") + Label("Echo", systemImage: "repeat") Text("If set, any packets you send will be echoed back to your device.") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) @@ -64,7 +64,7 @@ struct SerialConfig: View { .foregroundColor(.gray) .font(.callout) - Picker("mode", selection: $mode ) { + Picker("Mode", selection: $mode ) { ForEach(SerialModeTypes.allCases) { smt in Text(smt.description) } @@ -76,7 +76,7 @@ struct SerialConfig: View { Picker("Receive data (rxd) GPIO pin", selection: $rxd) { ForEach(0..<49) { if $0 == 0 { - Text("unset") + Text("Unset") } else { Text("Pin \($0)") } @@ -88,7 +88,7 @@ struct SerialConfig: View { Picker("Transmit data (txd) GPIO pin", selection: $txd) { ForEach(0..<49) { if $0 == 0 { - Text("unset") + Text("Unset") } else { Text("Pin \($0)") } diff --git a/Meshtastic/Views/Settings/Config/Module/StoreForwardConfig.swift b/Meshtastic/Views/Settings/Config/Module/StoreForwardConfig.swift index 3f2e66f6..d3bbf314 100644 --- a/Meshtastic/Views/Settings/Config/Module/StoreForwardConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/StoreForwardConfig.swift @@ -50,7 +50,7 @@ struct StoreForwardConfig: View { Text("Send a heartbeat to advertise the server's presence.") } Picker("Number of records", selection: $records) { - Text("unset").tag(0) + Text("Unset").tag(0) Text("25").tag(25) Text("50").tag(50) Text("75").tag(75) @@ -58,7 +58,7 @@ struct StoreForwardConfig: View { } .pickerStyle(DefaultPickerStyle()) Picker("History Return Max", selection: $historyReturnMax) { - Text("unset").tag(0) + Text("Unset").tag(0) Text("25").tag(25) Text("50").tag(50) Text("75").tag(75) @@ -66,7 +66,7 @@ struct StoreForwardConfig: View { } .pickerStyle(DefaultPickerStyle()) Picker("History Return Window", selection: $historyReturnWindow) { - Text("unset").tag(0) + Text("Unset").tag(0) Text("One Minute").tag(60) Text("Five Minutes").tag(300) Text("Ten Minutes").tag(600) diff --git a/Meshtastic/Views/Settings/Config/NetworkConfig.swift b/Meshtastic/Views/Settings/Config/NetworkConfig.swift index b8e51fe3..566bbbf5 100644 --- a/Meshtastic/Views/Settings/Config/NetworkConfig.swift +++ b/Meshtastic/Views/Settings/Config/NetworkConfig.swift @@ -60,8 +60,8 @@ struct NetworkConfig: View { } .keyboardType(.default) HStack { - Label("password", systemImage: "wallet.pass") - TextField("password", text: $wifiPsk) + Label("Password", systemImage: "wallet.pass") + TextField("Password", text: $wifiPsk) .foregroundColor(.gray) .autocapitalization(.none) .disableAutocorrection(true) diff --git a/Meshtastic/Views/Settings/Config/PositionConfig.swift b/Meshtastic/Views/Settings/Config/PositionConfig.swift index b22e0dfd..136d52bd 100644 --- a/Meshtastic/Views/Settings/Config/PositionConfig.swift +++ b/Meshtastic/Views/Settings/Config/PositionConfig.swift @@ -114,7 +114,7 @@ struct PositionConfig: View { Picker("Minimum Distance", selection: $broadcastSmartMinimumDistance) { ForEach(10..<151) { if $0 == 0 { - Text("unset") + Text("Unset") } else { if $0.isMultiple(of: 5) { Text("\($0)") @@ -282,7 +282,7 @@ struct PositionConfig: View { Picker("GPS Receive GPIO", selection: $rxGpio) { ForEach(0..<49) { if $0 == 0 { - Text("unset") + Text("Unset") } else { Text("Pin \($0)") } @@ -292,7 +292,7 @@ struct PositionConfig: View { Picker("GPS Transmit GPIO", selection: $txGpio) { ForEach(0..<49) { if $0 == 0 { - Text("unset") + Text("Unset") } else { Text("Pin \($0)") } @@ -302,7 +302,7 @@ struct PositionConfig: View { Picker("GPS EN GPIO", selection: $gpsEnGpio) { ForEach(0..<49) { if $0 == 0 { - Text("unset") + Text("Unset") } else { Text("Pin \($0)") } diff --git a/Meshtastic/Views/Settings/Config/PowerConfig.swift b/Meshtastic/Views/Settings/Config/PowerConfig.swift index abd2e30f..6aa3d716 100644 --- a/Meshtastic/Views/Settings/Config/PowerConfig.swift +++ b/Meshtastic/Views/Settings/Config/PowerConfig.swift @@ -50,7 +50,7 @@ struct PowerConfig: View { .pickerStyle(DefaultPickerStyle()) } } header: { - Text("config.power.settings") + Text("Power") } if currentDevice?.architecture == .esp32 || currentDevice?.architecture == .esp32S3 { Section { diff --git a/Meshtastic/Views/Settings/Config/SaveConfigButton.swift b/Meshtastic/Views/Settings/Config/SaveConfigButton.swift index 3b185129..0c948a28 100644 --- a/Meshtastic/Views/Settings/Config/SaveConfigButton.swift +++ b/Meshtastic/Views/Settings/Config/SaveConfigButton.swift @@ -24,7 +24,7 @@ struct SaveConfigButton: View { isPresented: $isPresentingSaveConfirm, titleVisibility: .visible ) { - let nodeName = node?.user?.longName ?? "unknown".localized + let nodeName = node?.user?.longName ?? "Unknown".localized let buttonText = String.localizedStringWithFormat("save.config %@".localized, nodeName) Button(buttonText) { onConfirmation() diff --git a/Meshtastic/Views/Settings/Firmware.swift b/Meshtastic/Views/Settings/Firmware.swift index b0c9c08f..ad885d86 100644 --- a/Meshtastic/Views/Settings/Firmware.swift +++ b/Meshtastic/Views/Settings/Firmware.swift @@ -77,7 +77,7 @@ struct Firmware: View { Text("Get the latest stable firmware") .fixedSize(horizontal: false, vertical: true) .font(.callout) - Link("\(latestStable?.title ?? "unknown".localized)", destination: URL(string: "\(latestStable?.zipURL ?? "https://meshtastic.org")")!) + Link("\(latestStable?.title ?? "Unknown".localized)", destination: URL(string: "\(latestStable?.zipURL ?? "https://meshtastic.org")")!) .font(.caption) Link("Release Notes", destination: URL(string: "\(latestStable?.pageURL ?? "https://meshtastic.org")")!) .font(.caption) @@ -86,7 +86,7 @@ struct Firmware: View { Text("Get the latest alpha firmware") .fixedSize(horizontal: false, vertical: true) .font(.callout) - Link("\(latestAlpha?.title ?? "unknown".localized)", destination: URL(string: "\(latestAlpha?.zipURL ?? "https://meshtastic.org")")!) + Link("\(latestAlpha?.title ?? "Unknown".localized)", destination: URL(string: "\(latestAlpha?.zipURL ?? "https://meshtastic.org")")!) .font(.caption) Link("Release Notes", destination: URL(string: "\(latestAlpha?.pageURL ?? "https://meshtastic.org")")!) .font(.caption) diff --git a/Meshtastic/Views/Settings/Routes.swift b/Meshtastic/Views/Settings/Routes.swift index 7e6407bc..138fab99 100644 --- a/Meshtastic/Views/Settings/Routes.swift +++ b/Meshtastic/Views/Settings/Routes.swift @@ -200,7 +200,7 @@ struct Routes: View { .foregroundColor(Color.gray) } .onAppear { - name = selectedRoute?.name ?? "unknown".localized + name = selectedRoute?.name ?? "Unknown".localized notes = selectedRoute?.notes ?? "" enabled = selectedRoute?.enabled ?? false color = Color(UIColor(hex: UInt32(selectedRoute?.color ?? 0))) diff --git a/Meshtastic/Views/Settings/Settings.swift b/Meshtastic/Views/Settings/Settings.swift index 5a5b6aec..939cb90d 100644 --- a/Meshtastic/Views/Settings/Settings.swift +++ b/Meshtastic/Views/Settings/Settings.swift @@ -148,7 +148,7 @@ struct Settings: View { NavigationLink(value: SettingsNavigationState.position) { Label { - Text("position") + Text("Position") } icon: { Image(systemName: "location") } @@ -156,7 +156,7 @@ struct Settings: View { NavigationLink(value: SettingsNavigationState.power) { Label { - Text("config.power.settings") + Text("Power") } icon: { Image(systemName: "bolt.fill") } @@ -388,14 +388,14 @@ struct Settings: View { /// Connected Node if node.num == bleManager.connectedPeripheral?.num ?? 0 { Label { - Text("BLE: \(node.user?.longName?.addingVariationSelectors ?? "unknown".localized)") + Text("BLE: \(node.user?.longName?.addingVariationSelectors ?? "Unknown".localized)") } icon: { Image(systemName: "antenna.radiowaves.left.and.right") } .tag(Int(node.num)) } else if node.canRemoteAdmin && UserDefaults.enableAdministration && node.sessionPasskey != nil { /// Nodes using the new PKI system Label { - Text("Remote PKI Admin: \(node.user?.longName ?? "unknown".localized)") + Text("Remote PKI Admin: \(node.user?.longName ?? "Unknown".localized)") } icon: { Image(systemName: "av.remote") } @@ -403,21 +403,21 @@ struct Settings: View { .tag(Int(node.num)) } else if !UserDefaults.enableAdministration && node.metadata != nil { /// Nodes using the old admin system Label { - Text("Remote Legacy Admin: \(node.user?.longName ?? "unknown".localized)") + Text("Remote Legacy Admin: \(node.user?.longName ?? "Unknown".localized)") } icon: { Image(systemName: "av.remote") } .tag(Int(node.num)) } else if UserDefaults.enableAdministration && node.user?.pkiEncrypted ?? false { Label { - Text("Request PKI Admin: \(node.user?.longName?.addingVariationSelectors ?? "unknown".localized)") + Text("Request PKI Admin: \(node.user?.longName?.addingVariationSelectors ?? "Unknown".localized)") } icon: { Image(systemName: "rectangle.and.hand.point.up.left") } .tag(Int(node.num)) } else if !UserDefaults.enableAdministration { Label { - Text("Request Legacy Admin: \(node.user?.longName?.addingVariationSelectors ?? "unknown".localized)") + Text("Request Legacy Admin: \(node.user?.longName?.addingVariationSelectors ?? "Unknown".localized)") } icon: { Image(systemName: "rectangle.and.hand.point.up.left") } @@ -442,7 +442,7 @@ struct Settings: View { TipView(AdminChannelTip(), arrowEdge: .top) } else { if bleManager.connectedPeripheral != nil { - Text("Connected Node \(node?.user?.longName?.addingVariationSelectors ?? "unknown".localized)") + Text("Connected Node \(node?.user?.longName?.addingVariationSelectors ?? "Unknown".localized)") } } } From cf0836feefc787b961c0da73d46dfb7c3dc0a221 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Mon, 28 Apr 2025 19:59:32 -0700 Subject: [PATCH 54/93] Add map reporting opt in to user defaults --- Meshtastic/Extensions/UserDefaults.swift | 4 ++++ Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Meshtastic/Extensions/UserDefaults.swift b/Meshtastic/Extensions/UserDefaults.swift index ac13f24b..e1ca67f9 100644 --- a/Meshtastic/Extensions/UserDefaults.swift +++ b/Meshtastic/Extensions/UserDefaults.swift @@ -72,6 +72,7 @@ extension UserDefaults { case firmwareVersion case environmentEnableWeatherKit case enableAdministration + case mapReportingOptIn case testIntEnum } @@ -148,6 +149,9 @@ extension UserDefaults { @UserDefault(.enableAdministration, defaultValue: false) static var enableAdministration: Bool + @UserDefault(.mapReportingOptIn, defaultValue: false) + static var mapReportingOptIn: Bool + @UserDefault(.testIntEnum, defaultValue: .one) static var testIntEnum: TestIntEnum } diff --git a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift index f9f9e499..61c2292b 100644 --- a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift @@ -30,8 +30,9 @@ struct MQTTConfig: View { @State var mqttConnected: Bool = false @State var defaultTopic = "msh/US" @State var nearbyTopics = [String]() - @State var mapReportingOptIn = false @State var mapReportingEnabled = false + @State var mapReportingOptIn = false + //@AppStorage("mapReportingOptIn") private var mapReportingOptIn: Bool = false @State var mapPublishIntervalSecs = 3600 @State var mapPositionPrecision: Double = 14.0 From ace8fe2ca9d5c58e24ca1d995d07dda21a51662c Mon Sep 17 00:00:00 2001 From: lolloandr Date: Tue, 29 Apr 2025 08:44:14 +0200 Subject: [PATCH 55/93] Fixed italian translation for PWD --- Localizable.xcstrings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index f74299df..19ec2f26 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -26983,7 +26983,7 @@ "it" : { "stringUnit" : { "state" : "translated", - "value" : "DIPARTIMENTO DELLA DIFESA" + "value" : "Alimentato" } }, "sr" : { From 0849b4f427b3928ce06203611d8edf9282df9f55 Mon Sep 17 00:00:00 2001 From: bytethis Date: Wed, 30 Apr 2025 02:18:04 +0100 Subject: [PATCH 56/93] fix typo in bluetooth error messsage for en locale --- Localizable.xcstrings | 2 +- Meshtastic/Helpers/BLEManager.swift | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index f74299df..05a4fae3 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -727,7 +727,7 @@ } } }, - "%@ This error usually cannot be fixed without forgetting the device unders Settings > Bluetooth and re-connecting to the radio." : { + "%@ This error usually cannot be fixed without forgetting the device under Settings > Bluetooth and re-connecting to the radio." : { "localizations" : { "de" : { "stringUnit" : { diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index b46e6a46..08381bc5 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -231,7 +231,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate cancelPeripheralConnection() if errorCode == 14 { // Peer removed pairing information // Forgetting and reconnecting seems to be necessary so we need to show the user an error telling them to do that - lastConnectionError = "🚨 " + String.localizedStringWithFormat("%@ This error usually cannot be fixed without forgetting the device unders Settings > Bluetooth and re pairing the radio.".localized, e.localizedDescription) + lastConnectionError = "🚨 " + String.localizedStringWithFormat("%@ This error usually cannot be fixed without forgetting the device under Settings > Bluetooth and re pairing the radio.".localized, e.localizedDescription) Logger.services.error("🚨 [BLE] Failed to connect: \(peripheral.name ?? "Unknown".localized) Error Code: \(errorCode, privacy: .public) Error: \(self.lastConnectionError, privacy: .public)") } else { lastConnectionError = "🚨 \(e.localizedDescription)" @@ -273,7 +273,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate Logger.services.error("🚨 [BLE] Disconnected: \(peripheral.name ?? "Unknown".localized, privacy: .public) Error Code: \(errorCode, privacy: .public) Error: \(e.localizedDescription, privacy: .public)") } else if errorCode == 14 { // Peer removed pairing information // Forgetting and reconnecting seems to be necessary so we need to show the user an error telling them to do that - lastConnectionError = "🚨 " + String.localizedStringWithFormat("%@ This error usually cannot be fixed without forgetting the device unders Settings > Bluetooth and re-connecting to the radio.".localized, e.localizedDescription) + lastConnectionError = "🚨 " + String.localizedStringWithFormat("%@ This error usually cannot be fixed without forgetting the device under Settings > Bluetooth and re-connecting to the radio.".localized, e.localizedDescription) Logger.services.error("🚨 [BLE] Disconnected: \(peripheral.name ?? "Unknown".localized) Error Code: \(errorCode, privacy: .public) Error: \(self.lastConnectionError, privacy: .public)") } else { if UserDefaults.preferredPeripheralId == peripheral.identifier.uuidString { From b8dbfc9260c2be260f6c458e3a255945dfe5027e Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Wed, 30 Apr 2025 08:19:30 -0700 Subject: [PATCH 57/93] Update translation keys --- Localizable.xcstrings | 3 --- Meshtastic/Export/WriteCsvFile.swift | 2 +- Meshtastic/Views/Nodes/Helpers/NodeDetail.swift | 2 +- Meshtastic/Views/Nodes/PaxCounterLog.swift | 2 +- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 616fb034..e21daf64 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -37135,9 +37135,6 @@ } } } - }, - "uptime" : { - }, "Uptime" : { "localizations" : { diff --git a/Meshtastic/Export/WriteCsvFile.swift b/Meshtastic/Export/WriteCsvFile.swift index a1380c77..af3472b2 100644 --- a/Meshtastic/Export/WriteCsvFile.swift +++ b/Meshtastic/Export/WriteCsvFile.swift @@ -14,7 +14,7 @@ func telemetryToCsvFile(telemetry: [TelemetryEntity], metricsType: Int) -> Strin let dateFormatString = (localeDateFormat ?? "MM/dd/YY j:mma").replacingOccurrences(of: ",", with: "") if metricsType == 0 { // Create Device Metrics Header - csvString = "\("battery.level".localized), \("Voltage".localized), \("Channel Utilization".localized), \("airtime".localized), \("uptime".localized), \("Timestamp".localized)" + csvString = "\("battery.level".localized), \("Voltage".localized), \("Channel Utilization".localized), \("airtime".localized), \("Uptime".localized), \("Timestamp".localized)" for dm in telemetry where dm.metricsType == 0 { csvString += "\n" csvString += dm.batteryLevel?.formatted(.number.grouping(.never)) ?? "" diff --git a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift index 01f3a406..bd913d10 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift @@ -147,7 +147,7 @@ struct NodeDetail: View { if let dm = node.telemetries?.filtered(using: NSPredicate(format: "metricsType == 0")).lastObject as? TelemetryEntity, let uptimeSeconds = dm.uptimeSeconds { HStack { Label { - Text("\("uptime".localized)") + Text("\("Uptime".localized)") } icon: { Image(systemName: "checkmark.circle.fill") .foregroundColor(.green) diff --git a/Meshtastic/Views/Nodes/PaxCounterLog.swift b/Meshtastic/Views/Nodes/PaxCounterLog.swift index 37ca7c30..bcc0dd60 100644 --- a/Meshtastic/Views/Nodes/PaxCounterLog.swift +++ b/Meshtastic/Views/Nodes/PaxCounterLog.swift @@ -98,7 +98,7 @@ struct PaxCounterLog: View { TableColumn("paxcounter.total") { pc in Text("\(pc.wifi + pc.ble)") } - TableColumn("uptime") { pc in + TableColumn("Uptime") { pc in let now = Date.now let later = now + TimeInterval(pc.uptime) let components = (now.. Date: Wed, 30 Apr 2025 18:02:39 -0700 Subject: [PATCH 58/93] Persist MQTT Map report opt in and prevent proxy connections without accepting terms. --- Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift | 7 ++++++- Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift | 5 ++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift b/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift index 435e162b..cf21d92e 100644 --- a/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift +++ b/Meshtastic/Helpers/Mqtt/MqttClientProxyManager.swift @@ -46,7 +46,12 @@ class MqttClientProxyManager { let root = node.mqttConfig?.root?.count ?? 0 > 0 ? node.mqttConfig?.root : "msh" let prefix = root! topic = prefix + "/2/e" + "/#" - connect(host: host, port: port, useSsl: useSsl, username: username, password: password, topic: topic) + // Require opt in to map report terms to connect + if node.mqttConfig?.mapReportingEnabled ?? false && UserDefaults.mapReportingOptIn || !(node.mqttConfig?.mapReportingEnabled ?? false) { + connect(host: host, port: port, useSsl: useSsl, username: username, password: password, topic: topic) + } else { + delegate?.onMqttError(message: "MQTT Map Reporting Terms need to be accepted.") + } } } func connect(host: String, port: Int, useSsl: Bool, username: String?, password: String?, topic: String?) { diff --git a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift index 61c2292b..217205cd 100644 --- a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift @@ -31,8 +31,7 @@ struct MQTTConfig: View { @State var defaultTopic = "msh/US" @State var nearbyTopics = [String]() @State var mapReportingEnabled = false - @State var mapReportingOptIn = false - //@AppStorage("mapReportingOptIn") private var mapReportingOptIn: Bool = false + @AppStorage("mapReportingOptIn") private var mapReportingOptIn: Bool = false @State var mapPublishIntervalSecs = 3600 @State var mapPositionPrecision: Double = 14.0 @@ -267,7 +266,7 @@ struct MQTTConfig: View { mqtt.encryptionEnabled = self.encryptionEnabled mqtt.jsonEnabled = self.jsonEnabled mqtt.tlsEnabled = self.tlsEnabled - mqtt.mapReportingEnabled = (self.mapReportingEnabled && self.mapReportingOptIn) + mqtt.mapReportingEnabled = self.mapReportingEnabled mqtt.mapReportSettings.positionPrecision = UInt32(self.mapPositionPrecision) mqtt.mapReportSettings.publishIntervalSecs = UInt32(self.mapPublishIntervalSecs) let adminMessageId = bleManager.saveMQTTConfig(config: mqtt, fromUser: connectedNode!.user!, toUser: node!.user!, adminIndex: connectedNode?.myInfo?.adminIndex ?? 0) From f7bb80ec25b76add895dd286043fa9a454eb8dbd Mon Sep 17 00:00:00 2001 From: unojazz Date: Thu, 1 May 2025 16:54:46 -0400 Subject: [PATCH 59/93] Updating DeviceEnums.swift --- Meshtastic/Enums/DeviceEnums.swift | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Meshtastic/Enums/DeviceEnums.swift b/Meshtastic/Enums/DeviceEnums.swift index 4e0bdf27..5eb48564 100644 --- a/Meshtastic/Enums/DeviceEnums.swift +++ b/Meshtastic/Enums/DeviceEnums.swift @@ -144,7 +144,8 @@ enum RebroadcastModes: Int, CaseIterable, Identifiable { case allSkipDecoding = 1 case localOnly = 2 case knownOnly = 3 - case corePortnums = 4 + case none = 4 + case corePortnums = 5 var id: Int { self.rawValue } @@ -158,6 +159,8 @@ enum RebroadcastModes: Int, CaseIterable, Identifiable { return "Local Only" case .knownOnly: return "Known Only" + case .none: + return "None" case .corePortnums: return "Core Portnums Only" } @@ -172,6 +175,8 @@ enum RebroadcastModes: Int, CaseIterable, Identifiable { return "Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. Only rebroadcasts message on the nodes local primary / secondary channels." case .knownOnly: return "Ignores observed messages from foreign meshes like Local Only, but takes it step further by also ignoring messages from nodes not already in the node's known list." + case .none: + return "Only permitted for SENSOR, TRACKER and TAK_TRACKER roles, this will inhibit all rebroadcasts, not unlike CLIENT_MUTE role." case .corePortnums: return "Only rebroadcasts packets from the core portnums: NodeInfo, Text, Position, Telemetry, and Routing." } @@ -187,6 +192,8 @@ enum RebroadcastModes: Int, CaseIterable, Identifiable { return Config.DeviceConfig.RebroadcastMode.localOnly case .knownOnly: return Config.DeviceConfig.RebroadcastMode.knownOnly + case .none: + return Config.DeviceConfig.RebroadcastMode.none case .corePortnums: return Config.DeviceConfig.RebroadcastMode.corePortnumsOnly } From d37572fde20ba4ef3bd56b29b58a1338090e6d9d Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Fri, 2 May 2025 16:54:16 -0700 Subject: [PATCH 60/93] Reply updates --- Localizable.xcstrings | 3 + .../Views/Messages/ChannelMessageList.swift | 45 +++++-- .../TextMessageField/TextMessageField.swift | 110 ++++++++++-------- .../Views/Messages/UserMessageList.swift | 44 +++++-- 4 files changed, 135 insertions(+), 67 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index a29691fb..834f3238 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -28749,6 +28749,9 @@ } } } + }, + "Replying to a message" : { + }, "Request Legacy Admin: %@" : { "localizations" : { diff --git a/Meshtastic/Views/Messages/ChannelMessageList.swift b/Meshtastic/Views/Messages/ChannelMessageList.swift index 0696e9d8..59d68e9e 100644 --- a/Meshtastic/Views/Messages/ChannelMessageList.swift +++ b/Meshtastic/Views/Messages/ChannelMessageList.swift @@ -28,6 +28,8 @@ struct ChannelMessageList: View { @State private var hasReachedBottom = false @State private var gotFirstUnreadMessage: Bool = false + @State private var messageToHighlight: Int64 = 0 + var body: some View { VStack { ScrollViewReader { scrollView in @@ -39,16 +41,33 @@ struct ChannelMessageList: View { if message.replyID > 0 { let messageReply = channel.allPrivateMessages.first(where: { $0.messageId == message.replyID }) HStack { - Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) - .padding(10) - .overlay( - RoundedRectangle(cornerRadius: 18) - .stroke(Color.blue, lineWidth: 0.5) - ) - Image(systemName: "arrowshape.turn.up.left.fill") - .symbolRenderingMode(.hierarchical) - .imageScale(.large).foregroundColor(.accentColor) - .padding(.trailing) + Button { + if let messageNum = messageReply?.messageId { + withAnimation(.easeInOut(duration: 0.5)) { + messageToHighlight = messageNum + } + scrollView.scrollTo(messageNum, anchor: .center) + + // Reset highlight after delay + Task { + try? await Task.sleep(nanoseconds: 1_000_000_000) // 1 second + withAnimation(.easeInOut(duration: 0.5)) { + messageToHighlight = -1 + } + } + } + } label: { + Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) + .padding(10) + .overlay( + RoundedRectangle(cornerRadius: 18) + .stroke(Color.blue, lineWidth: 0.5) + ) + Image(systemName: "arrowshape.turn.up.left.fill") + .symbolRenderingMode(.hierarchical) + .imageScale(.large).foregroundColor(.accentColor) + .padding(.trailing) + } } } HStack(alignment: .bottom) { @@ -114,6 +133,12 @@ struct ChannelMessageList: View { Spacer(minLength: 50) } } + + .overlay { + RoundedRectangle(cornerRadius: 10) + .stroke(.blue, lineWidth: 2) + .opacity(((messageToHighlight == message.messageId) || (replyMessageId == message.messageId)) ? 1 : 0) + } .padding([.leading, .trailing]) .frame(maxWidth: .infinity) .id(message.messageId) diff --git a/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift b/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift index c8def69b..e6d7a15b 100644 --- a/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift +++ b/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift @@ -28,59 +28,75 @@ struct TextMessageField: View { #endif HStack(alignment: .top) { - ZStack { - TextField("message", text: $typingMessage, axis: .vertical) - .onChange(of: typingMessage) { _, value in - totalBytes = value.utf8.count - // Only mess with the value if it is too big - while totalBytes > Self.maxbytes { - typingMessage = String(typingMessage.dropLast()) - totalBytes = typingMessage.utf8.count - } - } - .keyboardType(.default) - .toolbar { - ToolbarItemGroup(placement: .keyboard) { - Button("Dismiss") { - isFocused = false + if replyMessageId != 0 { + + HStack { + Button { + withAnimation(.easeInOut(duration: 0.2)) { + replyMessageId = 0 } - .font(.subheadline) + isFocused = false + } label : { + Image(systemName: "x.circle.fill") + } + Text("Replying to a message") - if destination.showAlertButton { + } + } + ZStack { + TextField("message", text: $typingMessage, axis: .vertical) + .onChange(of: typingMessage) { _, value in + totalBytes = value.utf8.count + // Only mess with the value if it is too big + while totalBytes > Self.maxbytes { + typingMessage = String(typingMessage.dropLast()) + totalBytes = typingMessage.utf8.count + } + } + .keyboardType(.default) + .toolbar { + ToolbarItemGroup(placement: .keyboard) { + Button("Dismiss") { + isFocused = false + } + .font(.subheadline) + + if destination.showAlertButton { + Spacer() + AlertButton { typingMessage += "🔔 Alert Bell Character! \u{7}" } + } + Spacer() - AlertButton { typingMessage += "🔔 Alert Bell Character! \u{7}" } + RequestPositionButton(action: requestPosition) + TextMessageSize(maxbytes: Self.maxbytes, totalBytes: totalBytes) } - - Spacer() - RequestPositionButton(action: requestPosition) - TextMessageSize(maxbytes: Self.maxbytes, totalBytes: totalBytes) } - } - .padding(.horizontal, 8) - .focused($isFocused) - .multilineTextAlignment(.leading) - .frame(minHeight: 50) - .keyboardShortcut(.defaultAction) - .onSubmit { - #if targetEnvironment(macCatalyst) - sendMessage() - #endif - } - - Text(typingMessage) - .opacity(0) - .padding(.all, 0) + .padding(.horizontal, 8) + .focused($isFocused) + .multilineTextAlignment(.leading) + .frame(minHeight: 50) + .keyboardShortcut(.defaultAction) + .onSubmit { +#if targetEnvironment(macCatalyst) + sendMessage() +#endif + } + + Text(typingMessage) + .opacity(0) + .padding(.all, 0) + } + .overlay(RoundedRectangle(cornerRadius: 20).stroke(.tertiary, lineWidth: 1)) + .padding(.bottom, 15) + + Button(action: sendMessage) { + Image(systemName: "arrow.up.circle.fill") + .font(.largeTitle) + .foregroundColor(.accentColor) + } } - .overlay(RoundedRectangle(cornerRadius: 20).stroke(.tertiary, lineWidth: 1)) - .padding(.bottom, 15) - - Button(action: sendMessage) { - Image(systemName: "arrow.up.circle.fill") - .font(.largeTitle) - .foregroundColor(.accentColor) - } - } - .padding(.all, 15) + .padding(.all, 15) + } private func requestPosition() { diff --git a/Meshtastic/Views/Messages/UserMessageList.swift b/Meshtastic/Views/Messages/UserMessageList.swift index 6f995756..e1861240 100644 --- a/Meshtastic/Views/Messages/UserMessageList.swift +++ b/Meshtastic/Views/Messages/UserMessageList.swift @@ -26,6 +26,8 @@ struct UserMessageList: View { @State private var hasReachedBottom = false @State private var gotFirstUnreadMessage: Bool = false + @State private var messageToHighlight: Int64 = 0 + var body: some View { VStack { ScrollViewReader { scrollView in @@ -39,16 +41,33 @@ struct UserMessageList: View { if message.replyID > 0 { let messageReply = user.messageList.first(where: { $0.messageId == message.replyID }) HStack { - Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) - .padding(10) - .overlay( - RoundedRectangle(cornerRadius: 18) - .stroke(Color.blue, lineWidth: 0.5) - ) - Image(systemName: "arrowshape.turn.up.left.fill") - .symbolRenderingMode(.hierarchical) - .imageScale(.large).foregroundColor(.accentColor) - .padding(.trailing) + Button { + if let messageNum = messageReply?.messageId { + withAnimation(.easeInOut(duration: 0.5)) { + messageToHighlight = messageNum + } + scrollView.scrollTo(messageNum, anchor: .center) + + // Reset highlight after delay + Task { + try? await Task.sleep(nanoseconds: 1_000_000_000) // 1 second + withAnimation(.easeInOut(duration: 0.5)) { + messageToHighlight = -1 + } + } + } + } label: { + Text(messageReply?.messagePayload ?? "EMPTY MESSAGE").foregroundColor(.accentColor).font(.caption2) + .padding(10) + .overlay( + RoundedRectangle(cornerRadius: 18) + .stroke(Color.blue, lineWidth: 0.5) + ) + Image(systemName: "arrowshape.turn.up.left.fill") + .symbolRenderingMode(.hierarchical) + .imageScale(.large).foregroundColor(.accentColor) + .padding(.trailing) + } } } HStack(alignment: .top) { @@ -101,6 +120,11 @@ struct UserMessageList: View { Spacer(minLength: 50) } } + .overlay { + RoundedRectangle(cornerRadius: 10) + .stroke(.blue, lineWidth: 2) + .opacity(((messageToHighlight == message.messageId) || (replyMessageId == message.messageId)) ? 1 : 0) + } .padding([.leading, .trailing]) .frame(maxWidth: .infinity) .id(message.messageId) From 454ea409fb4f4768e927df28e8e369deb1b4c06a Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sat, 3 May 2025 08:08:54 -0700 Subject: [PATCH 61/93] Proto updates --- .../Sources/meshtastic/admin.pb.swift | 325 +++++++-- .../Sources/meshtastic/apponly.pb.swift | 8 +- .../Sources/meshtastic/atak.pb.swift | 69 +- .../meshtastic/cannedmessages.pb.swift | 8 +- .../Sources/meshtastic/channel.pb.swift | 38 +- .../Sources/meshtastic/clientonly.pb.swift | 8 +- .../Sources/meshtastic/config.pb.swift | 500 ++++++++------ .../meshtastic/connection_status.pb.swift | 23 +- .../Sources/meshtastic/device_ui.pb.swift | 49 +- .../Sources/meshtastic/deviceonly.pb.swift | 33 +- .../Sources/meshtastic/interdevice.pb.swift | 64 +- .../Sources/meshtastic/localonly.pb.swift | 11 +- .../Sources/meshtastic/mesh.pb.swift | 614 ++++++++++++++---- .../Sources/meshtastic/module_config.pb.swift | 290 ++++++--- .../Sources/meshtastic/mqtt.pb.swift | 11 +- .../Sources/meshtastic/paxcount.pb.swift | 8 +- .../Sources/meshtastic/portnums.pb.swift | 16 +- .../Sources/meshtastic/powermon.pb.swift | 117 ++-- .../meshtastic/remote_hardware.pb.swift | 37 +- .../Sources/meshtastic/rtttl.pb.swift | 8 +- .../Sources/meshtastic/storeforward.pb.swift | 94 ++- .../Sources/meshtastic/telemetry.pb.swift | 85 ++- .../Sources/meshtastic/xmodem.pb.swift | 40 +- protobufs | 2 +- 24 files changed, 1795 insertions(+), 663 deletions(-) diff --git a/MeshtasticProtobufs/Sources/meshtastic/admin.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/admin.pb.swift index 5a9a75a5..e450d566 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/admin.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/admin.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/admin.proto @@ -25,7 +24,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// This message is handled by the Admin module and is responsible for all settings/channel read/write operations. /// This message is used to do settings operations to both remote AND local nodes. /// (Prior to 1.2 these operations were done via special ToRadio operations) -public struct AdminMessage: @unchecked Sendable { +public struct AdminMessage { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -564,7 +563,7 @@ public struct AdminMessage: @unchecked Sendable { /// /// TODO: REPLACE - public enum OneOf_PayloadVariant: Equatable, Sendable { + public enum OneOf_PayloadVariant: Equatable { /// /// Send the specified channel in the response to this message /// NOTE: This field is sent with the channel index + 1 (to ensure we never try to send 'zero' - which protobufs treats as not present) @@ -729,11 +728,225 @@ public struct AdminMessage: @unchecked Sendable { /// Tell the node to reset the nodedb. case nodedbReset(Int32) + #if !swift(>=4.1) + public static func ==(lhs: AdminMessage.OneOf_PayloadVariant, rhs: AdminMessage.OneOf_PayloadVariant) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.getChannelRequest, .getChannelRequest): return { + guard case .getChannelRequest(let l) = lhs, case .getChannelRequest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getChannelResponse, .getChannelResponse): return { + guard case .getChannelResponse(let l) = lhs, case .getChannelResponse(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getOwnerRequest, .getOwnerRequest): return { + guard case .getOwnerRequest(let l) = lhs, case .getOwnerRequest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getOwnerResponse, .getOwnerResponse): return { + guard case .getOwnerResponse(let l) = lhs, case .getOwnerResponse(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getConfigRequest, .getConfigRequest): return { + guard case .getConfigRequest(let l) = lhs, case .getConfigRequest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getConfigResponse, .getConfigResponse): return { + guard case .getConfigResponse(let l) = lhs, case .getConfigResponse(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getModuleConfigRequest, .getModuleConfigRequest): return { + guard case .getModuleConfigRequest(let l) = lhs, case .getModuleConfigRequest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getModuleConfigResponse, .getModuleConfigResponse): return { + guard case .getModuleConfigResponse(let l) = lhs, case .getModuleConfigResponse(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getCannedMessageModuleMessagesRequest, .getCannedMessageModuleMessagesRequest): return { + guard case .getCannedMessageModuleMessagesRequest(let l) = lhs, case .getCannedMessageModuleMessagesRequest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getCannedMessageModuleMessagesResponse, .getCannedMessageModuleMessagesResponse): return { + guard case .getCannedMessageModuleMessagesResponse(let l) = lhs, case .getCannedMessageModuleMessagesResponse(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getDeviceMetadataRequest, .getDeviceMetadataRequest): return { + guard case .getDeviceMetadataRequest(let l) = lhs, case .getDeviceMetadataRequest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getDeviceMetadataResponse, .getDeviceMetadataResponse): return { + guard case .getDeviceMetadataResponse(let l) = lhs, case .getDeviceMetadataResponse(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getRingtoneRequest, .getRingtoneRequest): return { + guard case .getRingtoneRequest(let l) = lhs, case .getRingtoneRequest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getRingtoneResponse, .getRingtoneResponse): return { + guard case .getRingtoneResponse(let l) = lhs, case .getRingtoneResponse(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getDeviceConnectionStatusRequest, .getDeviceConnectionStatusRequest): return { + guard case .getDeviceConnectionStatusRequest(let l) = lhs, case .getDeviceConnectionStatusRequest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getDeviceConnectionStatusResponse, .getDeviceConnectionStatusResponse): return { + guard case .getDeviceConnectionStatusResponse(let l) = lhs, case .getDeviceConnectionStatusResponse(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.setHamMode, .setHamMode): return { + guard case .setHamMode(let l) = lhs, case .setHamMode(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getNodeRemoteHardwarePinsRequest, .getNodeRemoteHardwarePinsRequest): return { + guard case .getNodeRemoteHardwarePinsRequest(let l) = lhs, case .getNodeRemoteHardwarePinsRequest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getNodeRemoteHardwarePinsResponse, .getNodeRemoteHardwarePinsResponse): return { + guard case .getNodeRemoteHardwarePinsResponse(let l) = lhs, case .getNodeRemoteHardwarePinsResponse(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.enterDfuModeRequest, .enterDfuModeRequest): return { + guard case .enterDfuModeRequest(let l) = lhs, case .enterDfuModeRequest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.deleteFileRequest, .deleteFileRequest): return { + guard case .deleteFileRequest(let l) = lhs, case .deleteFileRequest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.setScale, .setScale): return { + guard case .setScale(let l) = lhs, case .setScale(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.backupPreferences, .backupPreferences): return { + guard case .backupPreferences(let l) = lhs, case .backupPreferences(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.restorePreferences, .restorePreferences): return { + guard case .restorePreferences(let l) = lhs, case .restorePreferences(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.removeBackupPreferences, .removeBackupPreferences): return { + guard case .removeBackupPreferences(let l) = lhs, case .removeBackupPreferences(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.setOwner, .setOwner): return { + guard case .setOwner(let l) = lhs, case .setOwner(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.setChannel, .setChannel): return { + guard case .setChannel(let l) = lhs, case .setChannel(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.setConfig, .setConfig): return { + guard case .setConfig(let l) = lhs, case .setConfig(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.setModuleConfig, .setModuleConfig): return { + guard case .setModuleConfig(let l) = lhs, case .setModuleConfig(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.setCannedMessageModuleMessages, .setCannedMessageModuleMessages): return { + guard case .setCannedMessageModuleMessages(let l) = lhs, case .setCannedMessageModuleMessages(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.setRingtoneMessage, .setRingtoneMessage): return { + guard case .setRingtoneMessage(let l) = lhs, case .setRingtoneMessage(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.removeByNodenum, .removeByNodenum): return { + guard case .removeByNodenum(let l) = lhs, case .removeByNodenum(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.setFavoriteNode, .setFavoriteNode): return { + guard case .setFavoriteNode(let l) = lhs, case .setFavoriteNode(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.removeFavoriteNode, .removeFavoriteNode): return { + guard case .removeFavoriteNode(let l) = lhs, case .removeFavoriteNode(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.setFixedPosition, .setFixedPosition): return { + guard case .setFixedPosition(let l) = lhs, case .setFixedPosition(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.removeFixedPosition, .removeFixedPosition): return { + guard case .removeFixedPosition(let l) = lhs, case .removeFixedPosition(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.setTimeOnly, .setTimeOnly): return { + guard case .setTimeOnly(let l) = lhs, case .setTimeOnly(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getUiConfigRequest, .getUiConfigRequest): return { + guard case .getUiConfigRequest(let l) = lhs, case .getUiConfigRequest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.getUiConfigResponse, .getUiConfigResponse): return { + guard case .getUiConfigResponse(let l) = lhs, case .getUiConfigResponse(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.storeUiConfig, .storeUiConfig): return { + guard case .storeUiConfig(let l) = lhs, case .storeUiConfig(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.setIgnoredNode, .setIgnoredNode): return { + guard case .setIgnoredNode(let l) = lhs, case .setIgnoredNode(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.removeIgnoredNode, .removeIgnoredNode): return { + guard case .removeIgnoredNode(let l) = lhs, case .removeIgnoredNode(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.beginEditSettings, .beginEditSettings): return { + guard case .beginEditSettings(let l) = lhs, case .beginEditSettings(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.commitEditSettings, .commitEditSettings): return { + guard case .commitEditSettings(let l) = lhs, case .commitEditSettings(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.factoryResetDevice, .factoryResetDevice): return { + guard case .factoryResetDevice(let l) = lhs, case .factoryResetDevice(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.rebootOtaSeconds, .rebootOtaSeconds): return { + guard case .rebootOtaSeconds(let l) = lhs, case .rebootOtaSeconds(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.exitSimulator, .exitSimulator): return { + guard case .exitSimulator(let l) = lhs, case .exitSimulator(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.rebootSeconds, .rebootSeconds): return { + guard case .rebootSeconds(let l) = lhs, case .rebootSeconds(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.shutdownSeconds, .shutdownSeconds): return { + guard case .shutdownSeconds(let l) = lhs, case .shutdownSeconds(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.factoryResetConfig, .factoryResetConfig): return { + guard case .factoryResetConfig(let l) = lhs, case .factoryResetConfig(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.nodedbReset, .nodedbReset): return { + guard case .nodedbReset(let l) = lhs, case .nodedbReset(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif } /// /// TODO: REPLACE - public enum ConfigType: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum ConfigType: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -813,25 +1026,11 @@ public struct AdminMessage: @unchecked Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [AdminMessage.ConfigType] = [ - .deviceConfig, - .positionConfig, - .powerConfig, - .networkConfig, - .displayConfig, - .loraConfig, - .bluetoothConfig, - .securityConfig, - .sessionkeyConfig, - .deviceuiConfig, - ] - } /// /// TODO: REPLACE - public enum ModuleConfigType: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum ModuleConfigType: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -929,26 +1128,9 @@ public struct AdminMessage: @unchecked Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [AdminMessage.ModuleConfigType] = [ - .mqttConfig, - .serialConfig, - .extnotifConfig, - .storeforwardConfig, - .rangetestConfig, - .telemetryConfig, - .cannedmsgConfig, - .audioConfig, - .remotehardwareConfig, - .neighborinfoConfig, - .ambientlightingConfig, - .detectionsensorConfig, - .paxcounterConfig, - ] - } - public enum BackupLocation: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum BackupLocation: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -980,20 +1162,61 @@ public struct AdminMessage: @unchecked Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [AdminMessage.BackupLocation] = [ - .flash, - .sd, - ] - } public init() {} } +#if swift(>=4.2) + +extension AdminMessage.ConfigType: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [AdminMessage.ConfigType] = [ + .deviceConfig, + .positionConfig, + .powerConfig, + .networkConfig, + .displayConfig, + .loraConfig, + .bluetoothConfig, + .securityConfig, + .sessionkeyConfig, + .deviceuiConfig, + ] +} + +extension AdminMessage.ModuleConfigType: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [AdminMessage.ModuleConfigType] = [ + .mqttConfig, + .serialConfig, + .extnotifConfig, + .storeforwardConfig, + .rangetestConfig, + .telemetryConfig, + .cannedmsgConfig, + .audioConfig, + .remotehardwareConfig, + .neighborinfoConfig, + .ambientlightingConfig, + .detectionsensorConfig, + .paxcounterConfig, + ] +} + +extension AdminMessage.BackupLocation: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [AdminMessage.BackupLocation] = [ + .flash, + .sd, + ] +} + +#endif // swift(>=4.2) + /// /// Parameters for setting up Meshtastic for ameteur radio usage -public struct HamParameters: Sendable { +public struct HamParameters { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1023,7 +1246,7 @@ public struct HamParameters: Sendable { /// /// Response envelope for node_remote_hardware_pins -public struct NodeRemoteHardwarePinsResponse: Sendable { +public struct NodeRemoteHardwarePinsResponse { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1037,6 +1260,16 @@ public struct NodeRemoteHardwarePinsResponse: Sendable { public init() {} } +#if swift(>=5.5) && canImport(_Concurrency) +extension AdminMessage: @unchecked Sendable {} +extension AdminMessage.OneOf_PayloadVariant: @unchecked Sendable {} +extension AdminMessage.ConfigType: @unchecked Sendable {} +extension AdminMessage.ModuleConfigType: @unchecked Sendable {} +extension AdminMessage.BackupLocation: @unchecked Sendable {} +extension HamParameters: @unchecked Sendable {} +extension NodeRemoteHardwarePinsResponse: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" @@ -1890,7 +2123,7 @@ extension HamParameters: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa if self.txPower != 0 { try visitor.visitSingularInt32Field(value: self.txPower, fieldNumber: 2) } - if self.frequency.bitPattern != 0 { + if self.frequency != 0 { try visitor.visitSingularFloatField(value: self.frequency, fieldNumber: 3) } if !self.shortName.isEmpty { diff --git a/MeshtasticProtobufs/Sources/meshtastic/apponly.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/apponly.pb.swift index 52dac5ca..0457077c 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/apponly.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/apponly.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/apponly.proto @@ -8,6 +7,7 @@ // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ +import Foundation import SwiftProtobuf // If the compiler emits an error on this type, it is because this file @@ -26,7 +26,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// any SECONDARY channels. /// No DISABLED channels are included. /// This abstraction is used only on the the 'app side' of the world (ie python, javascript and android etc) to show a group of Channels as a (long) URL -public struct ChannelSet: Sendable { +public struct ChannelSet { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -53,6 +53,10 @@ public struct ChannelSet: Sendable { fileprivate var _loraConfig: Config.LoRaConfig? = nil } +#if swift(>=5.5) && canImport(_Concurrency) +extension ChannelSet: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/MeshtasticProtobufs/Sources/meshtastic/atak.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/atak.pb.swift index 06d6af88..867648a9 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/atak.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/atak.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/atak.proto @@ -21,7 +20,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP typealias Version = _2 } -public enum Team: SwiftProtobuf.Enum, Swift.CaseIterable { +public enum Team: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -131,6 +130,11 @@ public enum Team: SwiftProtobuf.Enum, Swift.CaseIterable { } } +} + +#if swift(>=4.2) + +extension Team: CaseIterable { // The compiler won't synthesize support with the UNRECOGNIZED case. public static let allCases: [Team] = [ .unspecifedColor, @@ -149,12 +153,13 @@ public enum Team: SwiftProtobuf.Enum, Swift.CaseIterable { .darkGreen, .brown, ] - } +#endif // swift(>=4.2) + /// /// Role of the group member -public enum MemberRole: SwiftProtobuf.Enum, Swift.CaseIterable { +public enum MemberRole: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -228,6 +233,11 @@ public enum MemberRole: SwiftProtobuf.Enum, Swift.CaseIterable { } } +} + +#if swift(>=4.2) + +extension MemberRole: CaseIterable { // The compiler won't synthesize support with the UNRECOGNIZED case. public static let allCases: [MemberRole] = [ .unspecifed, @@ -240,12 +250,13 @@ public enum MemberRole: SwiftProtobuf.Enum, Swift.CaseIterable { .rto, .k9, ] - } +#endif // swift(>=4.2) + /// /// Packets for the official ATAK Plugin -public struct TAKPacket: @unchecked Sendable { +public struct TAKPacket { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -326,7 +337,7 @@ public struct TAKPacket: @unchecked Sendable { /// /// The payload of the packet - public enum OneOf_PayloadVariant: Equatable, @unchecked Sendable { + public enum OneOf_PayloadVariant: Equatable { /// /// TAK position report case pli(PLI) @@ -338,6 +349,28 @@ public struct TAKPacket: @unchecked Sendable { /// May be compressed / truncated by the sender (EUD) case detail(Data) + #if !swift(>=4.1) + public static func ==(lhs: TAKPacket.OneOf_PayloadVariant, rhs: TAKPacket.OneOf_PayloadVariant) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.pli, .pli): return { + guard case .pli(let l) = lhs, case .pli(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.chat, .chat): return { + guard case .chat(let l) = lhs, case .chat(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.detail, .detail): return { + guard case .detail(let l) = lhs, case .detail(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif } public init() {} @@ -349,7 +382,7 @@ public struct TAKPacket: @unchecked Sendable { /// /// ATAK GeoChat message -public struct GeoChat: Sendable { +public struct GeoChat { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -391,7 +424,7 @@ public struct GeoChat: Sendable { /// /// ATAK Group /// <__group role='Team Member' name='Cyan'/> -public struct Group: Sendable { +public struct Group { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -413,7 +446,7 @@ public struct Group: Sendable { /// /// ATAK EUD Status /// -public struct Status: Sendable { +public struct Status { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -430,7 +463,7 @@ public struct Status: Sendable { /// /// ATAK Contact /// -public struct Contact: Sendable { +public struct Contact { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -450,7 +483,7 @@ public struct Contact: Sendable { /// /// Position Location Information from ATAK -public struct PLI: Sendable { +public struct PLI { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -482,6 +515,18 @@ public struct PLI: Sendable { public init() {} } +#if swift(>=5.5) && canImport(_Concurrency) +extension Team: @unchecked Sendable {} +extension MemberRole: @unchecked Sendable {} +extension TAKPacket: @unchecked Sendable {} +extension TAKPacket.OneOf_PayloadVariant: @unchecked Sendable {} +extension GeoChat: @unchecked Sendable {} +extension Group: @unchecked Sendable {} +extension Status: @unchecked Sendable {} +extension Contact: @unchecked Sendable {} +extension PLI: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/MeshtasticProtobufs/Sources/meshtastic/cannedmessages.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/cannedmessages.pb.swift index ce1f0503..1b8c84de 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/cannedmessages.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/cannedmessages.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/cannedmessages.proto @@ -8,6 +7,7 @@ // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ +import Foundation import SwiftProtobuf // If the compiler emits an error on this type, it is because this file @@ -22,7 +22,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// /// Canned message module configuration. -public struct CannedMessageModuleConfig: Sendable { +public struct CannedMessageModuleConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -36,6 +36,10 @@ public struct CannedMessageModuleConfig: Sendable { public init() {} } +#if swift(>=5.5) && canImport(_Concurrency) +extension CannedMessageModuleConfig: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/MeshtasticProtobufs/Sources/meshtastic/channel.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/channel.pb.swift index 180cd698..5b9c7e49 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/channel.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/channel.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/channel.proto @@ -37,15 +36,13 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// FIXME: Add description of multi-channel support and how primary vs secondary channels are used. /// FIXME: explain how apps use channels for security. /// explain how remote settings and remote gpio are managed as an example -public struct ChannelSettings: @unchecked Sendable { +public struct ChannelSettings { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. /// /// Deprecated in favor of LoraConfig.channel_num - /// - /// NOTE: This field was marked as deprecated in the .proto file. public var channelNum: UInt32 = 0 /// @@ -114,7 +111,7 @@ public struct ChannelSettings: @unchecked Sendable { /// /// This message is specifically for modules to store per-channel configuration data. -public struct ModuleSettings: Sendable { +public struct ModuleSettings { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -135,7 +132,7 @@ public struct ModuleSettings: Sendable { /// /// A pair of a channel number, mode and the (sharable) settings for that channel -public struct Channel: Sendable { +public struct Channel { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -173,7 +170,7 @@ public struct Channel: Sendable { /// cross band routing as needed. /// If a device has only a single radio (the common case) only one channel can be PRIMARY at a time /// (but any number of SECONDARY channels can't be sent received on that common frequency) - public enum Role: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum Role: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -212,13 +209,6 @@ public struct Channel: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Channel.Role] = [ - .disabled, - .primary, - .secondary, - ] - } public init() {} @@ -226,6 +216,26 @@ public struct Channel: Sendable { fileprivate var _settings: ChannelSettings? = nil } +#if swift(>=4.2) + +extension Channel.Role: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Channel.Role] = [ + .disabled, + .primary, + .secondary, + ] +} + +#endif // swift(>=4.2) + +#if swift(>=5.5) && canImport(_Concurrency) +extension ChannelSettings: @unchecked Sendable {} +extension ModuleSettings: @unchecked Sendable {} +extension Channel: @unchecked Sendable {} +extension Channel.Role: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/MeshtasticProtobufs/Sources/meshtastic/clientonly.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/clientonly.pb.swift index d72c0ae1..f89a8e3c 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/clientonly.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/clientonly.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/clientonly.proto @@ -8,6 +7,7 @@ // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ +import Foundation import SwiftProtobuf // If the compiler emits an error on this type, it is because this file @@ -23,7 +23,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// /// This abstraction is used to contain any configuration for provisioning a node on any client. /// It is useful for importing and exporting configurations. -public struct DeviceProfile: Sendable { +public struct DeviceProfile { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -130,6 +130,10 @@ public struct DeviceProfile: Sendable { fileprivate var _cannedMessages: String? = nil } +#if swift(>=5.5) && canImport(_Concurrency) +extension DeviceProfile: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/MeshtasticProtobufs/Sources/meshtastic/config.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/config.pb.swift index b3988aaa..e0d45bcf 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/config.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/config.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/config.proto @@ -21,7 +20,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP typealias Version = _2 } -public struct Config: Sendable { +public struct Config { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -114,7 +113,7 @@ public struct Config: Sendable { /// /// Payload Variant - public enum OneOf_PayloadVariant: Equatable, Sendable { + public enum OneOf_PayloadVariant: Equatable { case device(Config.DeviceConfig) case position(Config.PositionConfig) case power(Config.PowerConfig) @@ -126,11 +125,61 @@ public struct Config: Sendable { case sessionkey(Config.SessionkeyConfig) case deviceUi(DeviceUIConfig) + #if !swift(>=4.1) + public static func ==(lhs: Config.OneOf_PayloadVariant, rhs: Config.OneOf_PayloadVariant) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.device, .device): return { + guard case .device(let l) = lhs, case .device(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.position, .position): return { + guard case .position(let l) = lhs, case .position(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.power, .power): return { + guard case .power(let l) = lhs, case .power(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.network, .network): return { + guard case .network(let l) = lhs, case .network(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.display, .display): return { + guard case .display(let l) = lhs, case .display(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.lora, .lora): return { + guard case .lora(let l) = lhs, case .lora(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.bluetooth, .bluetooth): return { + guard case .bluetooth(let l) = lhs, case .bluetooth(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.security, .security): return { + guard case .security(let l) = lhs, case .security(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.sessionkey, .sessionkey): return { + guard case .sessionkey(let l) = lhs, case .sessionkey(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.deviceUi, .deviceUi): return { + guard case .deviceUi(let l) = lhs, case .deviceUi(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif } /// /// Configuration - public struct DeviceConfig: Sendable { + public struct DeviceConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -142,8 +191,6 @@ public struct Config: Sendable { /// /// Disabling this will disable the SerialConsole by not initilizing the StreamAPI /// Moved to SecurityConfig - /// - /// NOTE: This field was marked as deprecated in the .proto file. public var serialEnabled: Bool = false /// @@ -173,8 +220,6 @@ public struct Config: Sendable { /// If true, device is considered to be "managed" by a mesh administrator /// Clients should then limit available configuration and administrative options inside the user interface /// Moved to SecurityConfig - /// - /// NOTE: This field was marked as deprecated in the .proto file. public var isManaged: Bool = false /// @@ -193,7 +238,7 @@ public struct Config: Sendable { /// /// Defines the device's role on the Mesh network - public enum Role: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum Role: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -211,8 +256,6 @@ public struct Config: Sendable { /// The wifi radio and the oled screen will be put to sleep. /// This mode may still potentially have higher power usage due to it's preference in message rebroadcasting on the mesh. case router // = 2 - - /// NOTE: This enum value was marked as deprecated in the .proto file case routerClient // = 3 /// @@ -313,27 +356,11 @@ public struct Config: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Config.DeviceConfig.Role] = [ - .client, - .clientMute, - .router, - .routerClient, - .repeater, - .tracker, - .sensor, - .tak, - .clientHidden, - .lostAndFound, - .takTracker, - .routerLate, - ] - } /// /// Defines the device's behavior for how messages are rebroadcast - public enum RebroadcastMode: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum RebroadcastMode: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -394,16 +421,6 @@ public struct Config: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Config.DeviceConfig.RebroadcastMode] = [ - .all, - .allSkipDecoding, - .localOnly, - .knownOnly, - .none, - .corePortnumsOnly, - ] - } public init() {} @@ -411,7 +428,7 @@ public struct Config: Sendable { /// /// Position Config - public struct PositionConfig: Sendable { + public struct PositionConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -433,8 +450,6 @@ public struct Config: Sendable { /// /// Is GPS enabled for this node? - /// - /// NOTE: This field was marked as deprecated in the .proto file. public var gpsEnabled: Bool = false /// @@ -445,8 +460,6 @@ public struct Config: Sendable { /// /// Deprecated in favor of using smart / regular broadcast intervals as implicit attempt time - /// - /// NOTE: This field was marked as deprecated in the .proto file. public var gpsAttemptTime: UInt32 = 0 /// @@ -487,7 +500,7 @@ public struct Config: Sendable { /// are always included (also time if GPS-synced) /// NOTE: the more fields are included, the larger the message will be - /// leading to longer airtime and a higher risk of packet loss - public enum PositionFlags: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum PositionFlags: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -577,24 +590,9 @@ public struct Config: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Config.PositionConfig.PositionFlags] = [ - .unset, - .altitude, - .altitudeMsl, - .geoidalSeparation, - .dop, - .hvdop, - .satinview, - .seqNo, - .timestamp, - .heading, - .speed, - ] - } - public enum GpsMode: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum GpsMode: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -632,13 +630,6 @@ public struct Config: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Config.PositionConfig.GpsMode] = [ - .disabled, - .enabled, - .notPresent, - ] - } public init() {} @@ -647,7 +638,7 @@ public struct Config: Sendable { /// /// Power Config\ /// See [Power Config](/docs/settings/config/power) for additional power config details. - public struct PowerConfig: Sendable { + public struct PowerConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -707,7 +698,7 @@ public struct Config: Sendable { /// /// Network Config - public struct NetworkConfig: Sendable { + public struct NetworkConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -758,7 +749,7 @@ public struct Config: Sendable { public var unknownFields = SwiftProtobuf.UnknownStorage() - public enum AddressMode: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum AddressMode: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -790,17 +781,11 @@ public struct Config: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Config.NetworkConfig.AddressMode] = [ - .dhcp, - .static, - ] - } /// /// Available flags auxiliary network protocols - public enum ProtocolFlags: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum ProtocolFlags: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -832,15 +817,9 @@ public struct Config: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Config.NetworkConfig.ProtocolFlags] = [ - .noBroadcast, - .udpBroadcast, - ] - } - public struct IpV4Config: Sendable { + public struct IpV4Config { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -873,7 +852,7 @@ public struct Config: Sendable { /// /// Display Config - public struct DisplayConfig: Sendable { + public struct DisplayConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -934,7 +913,7 @@ public struct Config: Sendable { /// /// How the GPS coordinates are displayed on the OLED screen. - public enum GpsCoordinateFormat: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum GpsCoordinateFormat: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -997,21 +976,11 @@ public struct Config: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Config.DisplayConfig.GpsCoordinateFormat] = [ - .dec, - .dms, - .utm, - .mgrs, - .olc, - .osgr, - ] - } /// /// Unit display preference - public enum DisplayUnits: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum DisplayUnits: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -1043,34 +1012,32 @@ public struct Config: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Config.DisplayConfig.DisplayUnits] = [ - .metric, - .imperial, - ] - } /// /// Override OLED outo detect with this if it fails. - public enum OledType: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum OledType: SwiftProtobuf.Enum { public typealias RawValue = Int /// - /// Default / Auto + /// Default / Autodetect case oledAuto // = 0 /// - /// Default / Auto + /// Default / Autodetect case oledSsd1306 // = 1 /// - /// Default / Auto + /// Default / Autodetect case oledSh1106 // = 2 /// /// Can not be auto detected but set by proto. Used for 128x128 screens case oledSh1107 // = 3 + + /// + /// Can not be auto detected but set by proto. Used for 128x64 screens + case oledSh110712864 // = 4 case UNRECOGNIZED(Int) public init() { @@ -1083,6 +1050,7 @@ public struct Config: Sendable { case 1: self = .oledSsd1306 case 2: self = .oledSh1106 case 3: self = .oledSh1107 + case 4: self = .oledSh110712864 default: self = .UNRECOGNIZED(rawValue) } } @@ -1093,21 +1061,14 @@ public struct Config: Sendable { case .oledSsd1306: return 1 case .oledSh1106: return 2 case .oledSh1107: return 3 + case .oledSh110712864: return 4 case .UNRECOGNIZED(let i): return i } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Config.DisplayConfig.OledType] = [ - .oledAuto, - .oledSsd1306, - .oledSh1106, - .oledSh1107, - ] - } - public enum DisplayMode: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum DisplayMode: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -1151,17 +1112,9 @@ public struct Config: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Config.DisplayConfig.DisplayMode] = [ - .default, - .twocolor, - .inverted, - .color, - ] - } - public enum CompassOrientation: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum CompassOrientation: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -1229,18 +1182,6 @@ public struct Config: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Config.DisplayConfig.CompassOrientation] = [ - .degrees0, - .degrees90, - .degrees180, - .degrees270, - .degrees0Inverted, - .degrees90Inverted, - .degrees180Inverted, - .degrees270Inverted, - ] - } public init() {} @@ -1248,7 +1189,7 @@ public struct Config: Sendable { /// /// Lora Config - public struct LoRaConfig: @unchecked Sendable { + public struct LoRaConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1412,7 +1353,7 @@ public struct Config: Sendable { public var unknownFields = SwiftProtobuf.UnknownStorage() - public enum RegionCode: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum RegionCode: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -1564,38 +1505,12 @@ public struct Config: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Config.LoRaConfig.RegionCode] = [ - .unset, - .us, - .eu433, - .eu868, - .cn, - .jp, - .anz, - .kr, - .tw, - .ru, - .in, - .nz865, - .th, - .lora24, - .ua433, - .ua868, - .my433, - .my919, - .sg923, - .ph433, - .ph868, - .ph915, - ] - } /// /// Standard predefined channel settings /// Note: these mappings must match ModemPreset Choice in the device code. - public enum ModemPreset: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum ModemPreset: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -1609,8 +1524,6 @@ public struct Config: Sendable { /// /// Very Long Range - Slow /// Deprecated in 2.5: Works only with txco and is unusably slow - /// - /// NOTE: This enum value was marked as deprecated in the .proto file case veryLongSlow // = 2 /// @@ -1674,19 +1587,6 @@ public struct Config: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Config.LoRaConfig.ModemPreset] = [ - .longFast, - .longSlow, - .veryLongSlow, - .mediumSlow, - .mediumFast, - .shortSlow, - .shortFast, - .longModerate, - .shortTurbo, - ] - } public init() {} @@ -1694,7 +1594,7 @@ public struct Config: Sendable { fileprivate var _storage = _StorageClass.defaultInstance } - public struct BluetoothConfig: Sendable { + public struct BluetoothConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1713,7 +1613,7 @@ public struct Config: Sendable { public var unknownFields = SwiftProtobuf.UnknownStorage() - public enum PairingMode: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum PairingMode: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -1751,19 +1651,12 @@ public struct Config: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Config.BluetoothConfig.PairingMode] = [ - .randomPin, - .fixedPin, - .noPin, - ] - } public init() {} } - public struct SecurityConfig: @unchecked Sendable { + public struct SecurityConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1807,7 +1700,7 @@ public struct Config: Sendable { /// /// Blank config request, strictly for getting the session key - public struct SessionkeyConfig: Sendable { + public struct SessionkeyConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1820,6 +1713,218 @@ public struct Config: Sendable { public init() {} } +#if swift(>=4.2) + +extension Config.DeviceConfig.Role: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Config.DeviceConfig.Role] = [ + .client, + .clientMute, + .router, + .routerClient, + .repeater, + .tracker, + .sensor, + .tak, + .clientHidden, + .lostAndFound, + .takTracker, + .routerLate, + ] +} + +extension Config.DeviceConfig.RebroadcastMode: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Config.DeviceConfig.RebroadcastMode] = [ + .all, + .allSkipDecoding, + .localOnly, + .knownOnly, + .none, + .corePortnumsOnly, + ] +} + +extension Config.PositionConfig.PositionFlags: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Config.PositionConfig.PositionFlags] = [ + .unset, + .altitude, + .altitudeMsl, + .geoidalSeparation, + .dop, + .hvdop, + .satinview, + .seqNo, + .timestamp, + .heading, + .speed, + ] +} + +extension Config.PositionConfig.GpsMode: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Config.PositionConfig.GpsMode] = [ + .disabled, + .enabled, + .notPresent, + ] +} + +extension Config.NetworkConfig.AddressMode: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Config.NetworkConfig.AddressMode] = [ + .dhcp, + .static, + ] +} + +extension Config.NetworkConfig.ProtocolFlags: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Config.NetworkConfig.ProtocolFlags] = [ + .noBroadcast, + .udpBroadcast, + ] +} + +extension Config.DisplayConfig.GpsCoordinateFormat: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Config.DisplayConfig.GpsCoordinateFormat] = [ + .dec, + .dms, + .utm, + .mgrs, + .olc, + .osgr, + ] +} + +extension Config.DisplayConfig.DisplayUnits: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Config.DisplayConfig.DisplayUnits] = [ + .metric, + .imperial, + ] +} + +extension Config.DisplayConfig.OledType: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Config.DisplayConfig.OledType] = [ + .oledAuto, + .oledSsd1306, + .oledSh1106, + .oledSh1107, + .oledSh110712864, + ] +} + +extension Config.DisplayConfig.DisplayMode: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Config.DisplayConfig.DisplayMode] = [ + .default, + .twocolor, + .inverted, + .color, + ] +} + +extension Config.DisplayConfig.CompassOrientation: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Config.DisplayConfig.CompassOrientation] = [ + .degrees0, + .degrees90, + .degrees180, + .degrees270, + .degrees0Inverted, + .degrees90Inverted, + .degrees180Inverted, + .degrees270Inverted, + ] +} + +extension Config.LoRaConfig.RegionCode: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Config.LoRaConfig.RegionCode] = [ + .unset, + .us, + .eu433, + .eu868, + .cn, + .jp, + .anz, + .kr, + .tw, + .ru, + .in, + .nz865, + .th, + .lora24, + .ua433, + .ua868, + .my433, + .my919, + .sg923, + .ph433, + .ph868, + .ph915, + ] +} + +extension Config.LoRaConfig.ModemPreset: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Config.LoRaConfig.ModemPreset] = [ + .longFast, + .longSlow, + .veryLongSlow, + .mediumSlow, + .mediumFast, + .shortSlow, + .shortFast, + .longModerate, + .shortTurbo, + ] +} + +extension Config.BluetoothConfig.PairingMode: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Config.BluetoothConfig.PairingMode] = [ + .randomPin, + .fixedPin, + .noPin, + ] +} + +#endif // swift(>=4.2) + +#if swift(>=5.5) && canImport(_Concurrency) +extension Config: @unchecked Sendable {} +extension Config.OneOf_PayloadVariant: @unchecked Sendable {} +extension Config.DeviceConfig: @unchecked Sendable {} +extension Config.DeviceConfig.Role: @unchecked Sendable {} +extension Config.DeviceConfig.RebroadcastMode: @unchecked Sendable {} +extension Config.PositionConfig: @unchecked Sendable {} +extension Config.PositionConfig.PositionFlags: @unchecked Sendable {} +extension Config.PositionConfig.GpsMode: @unchecked Sendable {} +extension Config.PowerConfig: @unchecked Sendable {} +extension Config.NetworkConfig: @unchecked Sendable {} +extension Config.NetworkConfig.AddressMode: @unchecked Sendable {} +extension Config.NetworkConfig.ProtocolFlags: @unchecked Sendable {} +extension Config.NetworkConfig.IpV4Config: @unchecked Sendable {} +extension Config.DisplayConfig: @unchecked Sendable {} +extension Config.DisplayConfig.GpsCoordinateFormat: @unchecked Sendable {} +extension Config.DisplayConfig.DisplayUnits: @unchecked Sendable {} +extension Config.DisplayConfig.OledType: @unchecked Sendable {} +extension Config.DisplayConfig.DisplayMode: @unchecked Sendable {} +extension Config.DisplayConfig.CompassOrientation: @unchecked Sendable {} +extension Config.LoRaConfig: @unchecked Sendable {} +extension Config.LoRaConfig.RegionCode: @unchecked Sendable {} +extension Config.LoRaConfig.ModemPreset: @unchecked Sendable {} +extension Config.BluetoothConfig: @unchecked Sendable {} +extension Config.BluetoothConfig.PairingMode: @unchecked Sendable {} +extension Config.SecurityConfig: @unchecked Sendable {} +extension Config.SessionkeyConfig: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" @@ -2327,7 +2432,7 @@ extension Config.PowerConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImple if self.onBatteryShutdownAfterSecs != 0 { try visitor.visitSingularUInt32Field(value: self.onBatteryShutdownAfterSecs, fieldNumber: 2) } - if self.adcMultiplierOverride.bitPattern != 0 { + if self.adcMultiplierOverride != 0 { try visitor.visitSingularFloatField(value: self.adcMultiplierOverride, fieldNumber: 3) } if self.waitBluetoothSecs != 0 { @@ -2636,6 +2741,7 @@ extension Config.DisplayConfig.OledType: SwiftProtobuf._ProtoNameProviding { 1: .same(proto: "OLED_SSD1306"), 2: .same(proto: "OLED_SH1106"), 3: .same(proto: "OLED_SH1107"), + 4: .same(proto: "OLED_SH1107_128_64"), ] } @@ -2794,7 +2900,7 @@ extension Config.LoRaConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem if _storage._codingRate != 0 { try visitor.visitSingularUInt32Field(value: _storage._codingRate, fieldNumber: 5) } - if _storage._frequencyOffset.bitPattern != 0 { + if _storage._frequencyOffset != 0 { try visitor.visitSingularFloatField(value: _storage._frequencyOffset, fieldNumber: 6) } if _storage._region != .unset { @@ -2818,7 +2924,7 @@ extension Config.LoRaConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem if _storage._sx126XRxBoostedGain != false { try visitor.visitSingularBoolField(value: _storage._sx126XRxBoostedGain, fieldNumber: 13) } - if _storage._overrideFrequency.bitPattern != 0 { + if _storage._overrideFrequency != 0 { try visitor.visitSingularFloatField(value: _storage._overrideFrequency, fieldNumber: 14) } if _storage._paFanDisabled != false { @@ -3035,8 +3141,8 @@ extension Config.SessionkeyConfig: SwiftProtobuf.Message, SwiftProtobuf._Message public static let _protobuf_nameMap = SwiftProtobuf._NameMap() public mutating func decodeMessage(decoder: inout D) throws { - // Load everything into unknown fields - while try decoder.nextFieldNumber() != nil {} + while let _ = try decoder.nextFieldNumber() { + } } public func traverse(visitor: inout V) throws { diff --git a/MeshtasticProtobufs/Sources/meshtastic/connection_status.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/connection_status.pb.swift index 6847c0e3..a2ec180e 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/connection_status.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/connection_status.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/connection_status.proto @@ -8,6 +7,7 @@ // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ +import Foundation import SwiftProtobuf // If the compiler emits an error on this type, it is because this file @@ -20,7 +20,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP typealias Version = _2 } -public struct DeviceConnectionStatus: Sendable { +public struct DeviceConnectionStatus { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -81,7 +81,7 @@ public struct DeviceConnectionStatus: Sendable { /// /// WiFi connection status -public struct WifiConnectionStatus: Sendable { +public struct WifiConnectionStatus { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -114,7 +114,7 @@ public struct WifiConnectionStatus: Sendable { /// /// Ethernet connection status -public struct EthernetConnectionStatus: Sendable { +public struct EthernetConnectionStatus { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -139,7 +139,7 @@ public struct EthernetConnectionStatus: Sendable { /// /// Ethernet or WiFi connection status -public struct NetworkConnectionStatus: Sendable { +public struct NetworkConnectionStatus { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -167,7 +167,7 @@ public struct NetworkConnectionStatus: Sendable { /// /// Bluetooth connection status -public struct BluetoothConnectionStatus: Sendable { +public struct BluetoothConnectionStatus { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -191,7 +191,7 @@ public struct BluetoothConnectionStatus: Sendable { /// /// Serial connection status -public struct SerialConnectionStatus: Sendable { +public struct SerialConnectionStatus { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -209,6 +209,15 @@ public struct SerialConnectionStatus: Sendable { public init() {} } +#if swift(>=5.5) && canImport(_Concurrency) +extension DeviceConnectionStatus: @unchecked Sendable {} +extension WifiConnectionStatus: @unchecked Sendable {} +extension EthernetConnectionStatus: @unchecked Sendable {} +extension NetworkConnectionStatus: @unchecked Sendable {} +extension BluetoothConnectionStatus: @unchecked Sendable {} +extension SerialConnectionStatus: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/MeshtasticProtobufs/Sources/meshtastic/device_ui.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/device_ui.pb.swift index 0281d6c1..c3835518 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/device_ui.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/device_ui.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/device_ui.proto @@ -21,7 +20,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP typealias Version = _2 } -public enum Theme: SwiftProtobuf.Enum, Swift.CaseIterable { +public enum Theme: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -59,18 +58,24 @@ public enum Theme: SwiftProtobuf.Enum, Swift.CaseIterable { } } +} + +#if swift(>=4.2) + +extension Theme: CaseIterable { // The compiler won't synthesize support with the UNRECOGNIZED case. public static let allCases: [Theme] = [ .dark, .light, .red, ] - } +#endif // swift(>=4.2) + /// /// Localization -public enum Language: SwiftProtobuf.Enum, Swift.CaseIterable { +public enum Language: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -137,6 +142,10 @@ public enum Language: SwiftProtobuf.Enum, Swift.CaseIterable { /// Slovenian case slovenian // = 15 + /// + /// Ukrainian + case ukrainian // = 16 + /// /// Simplified Chinese (experimental) case simplifiedChinese // = 30 @@ -168,6 +177,7 @@ public enum Language: SwiftProtobuf.Enum, Swift.CaseIterable { case 13: self = .greek case 14: self = .norwegian case 15: self = .slovenian + case 16: self = .ukrainian case 30: self = .simplifiedChinese case 31: self = .traditionalChinese default: self = .UNRECOGNIZED(rawValue) @@ -192,12 +202,18 @@ public enum Language: SwiftProtobuf.Enum, Swift.CaseIterable { case .greek: return 13 case .norwegian: return 14 case .slovenian: return 15 + case .ukrainian: return 16 case .simplifiedChinese: return 30 case .traditionalChinese: return 31 case .UNRECOGNIZED(let i): return i } } +} + +#if swift(>=4.2) + +extension Language: CaseIterable { // The compiler won't synthesize support with the UNRECOGNIZED case. public static let allCases: [Language] = [ .english, @@ -216,13 +232,15 @@ public enum Language: SwiftProtobuf.Enum, Swift.CaseIterable { .greek, .norwegian, .slovenian, + .ukrainian, .simplifiedChinese, .traditionalChinese, ] - } -public struct DeviceUIConfig: @unchecked Sendable { +#endif // swift(>=4.2) + +public struct DeviceUIConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -343,7 +361,7 @@ public struct DeviceUIConfig: @unchecked Sendable { fileprivate var _storage = _StorageClass.defaultInstance } -public struct NodeFilter: Sendable { +public struct NodeFilter { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -381,7 +399,7 @@ public struct NodeFilter: Sendable { public init() {} } -public struct NodeHighlight: Sendable { +public struct NodeHighlight { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -411,7 +429,7 @@ public struct NodeHighlight: Sendable { public init() {} } -public struct GeoPoint: Sendable { +public struct GeoPoint { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -433,7 +451,7 @@ public struct GeoPoint: Sendable { public init() {} } -public struct Map: Sendable { +public struct Map { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -464,6 +482,16 @@ public struct Map: Sendable { fileprivate var _home: GeoPoint? = nil } +#if swift(>=5.5) && canImport(_Concurrency) +extension Theme: @unchecked Sendable {} +extension Language: @unchecked Sendable {} +extension DeviceUIConfig: @unchecked Sendable {} +extension NodeFilter: @unchecked Sendable {} +extension NodeHighlight: @unchecked Sendable {} +extension GeoPoint: @unchecked Sendable {} +extension Map: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" @@ -494,6 +522,7 @@ extension Language: SwiftProtobuf._ProtoNameProviding { 13: .same(proto: "GREEK"), 14: .same(proto: "NORWEGIAN"), 15: .same(proto: "SLOVENIAN"), + 16: .same(proto: "UKRAINIAN"), 30: .same(proto: "SIMPLIFIED_CHINESE"), 31: .same(proto: "TRADITIONAL_CHINESE"), ] diff --git a/MeshtasticProtobufs/Sources/meshtastic/deviceonly.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/deviceonly.pb.swift index 72248719..9a5dfe8f 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/deviceonly.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/deviceonly.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/deviceonly.proto @@ -23,7 +22,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// /// Position with static location information only for NodeDBLite -public struct PositionLite: Sendable { +public struct PositionLite { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -58,15 +57,13 @@ public struct PositionLite: Sendable { public init() {} } -public struct UserLite: @unchecked Sendable { +public struct UserLite { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. /// /// This is the addr of the radio. - /// - /// NOTE: This field was marked as deprecated in the .proto file. public var macaddr: Data = Data() /// @@ -105,7 +102,7 @@ public struct UserLite: @unchecked Sendable { public init() {} } -public struct NodeInfoLite: @unchecked Sendable { +public struct NodeInfoLite { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -227,7 +224,7 @@ public struct NodeInfoLite: @unchecked Sendable { /// FIXME, since we write this each time we enter deep sleep (and have infinite /// flash) it would be better to use some sort of append only data structure for /// the receive queue and use the preferences store for the other stuff -public struct DeviceState: @unchecked Sendable { +public struct DeviceState { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -287,8 +284,6 @@ public struct DeviceState: @unchecked Sendable { /// Used only during development. /// Indicates developer is testing and changes should never be saved to flash. /// Deprecated in 2.3.1 - /// - /// NOTE: This field was marked as deprecated in the .proto file. public var noSave: Bool { get {return _storage._noSave} set {_uniqueStorage()._noSave = newValue} @@ -297,8 +292,6 @@ public struct DeviceState: @unchecked Sendable { /// /// Previously used to manage GPS factory resets. /// Deprecated in 2.5.23 - /// - /// NOTE: This field was marked as deprecated in the .proto file. public var didGpsReset: Bool { get {return _storage._didGpsReset} set {_uniqueStorage()._didGpsReset = newValue} @@ -331,7 +324,7 @@ public struct DeviceState: @unchecked Sendable { fileprivate var _storage = _StorageClass.defaultInstance } -public struct NodeDatabase: Sendable { +public struct NodeDatabase { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -353,7 +346,7 @@ public struct NodeDatabase: Sendable { /// /// The on-disk saved channels -public struct ChannelFile: Sendable { +public struct ChannelFile { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -375,7 +368,7 @@ public struct ChannelFile: Sendable { /// /// The on-disk backup of the node's preferences -public struct BackupPreferences: Sendable { +public struct BackupPreferences { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -442,6 +435,16 @@ public struct BackupPreferences: Sendable { fileprivate var _owner: User? = nil } +#if swift(>=5.5) && canImport(_Concurrency) +extension PositionLite: @unchecked Sendable {} +extension UserLite: @unchecked Sendable {} +extension NodeInfoLite: @unchecked Sendable {} +extension DeviceState: @unchecked Sendable {} +extension NodeDatabase: @unchecked Sendable {} +extension ChannelFile: @unchecked Sendable {} +extension BackupPreferences: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" @@ -677,7 +680,7 @@ extension NodeInfoLite: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat try { if let v = _storage._position { try visitor.visitSingularMessageField(value: v, fieldNumber: 3) } }() - if _storage._snr.bitPattern != 0 { + if _storage._snr != 0 { try visitor.visitSingularFloatField(value: _storage._snr, fieldNumber: 4) } if _storage._lastHeard != 0 { diff --git a/MeshtasticProtobufs/Sources/meshtastic/interdevice.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/interdevice.pb.swift index 165ed685..92b72c15 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/interdevice.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/interdevice.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/interdevice.proto @@ -8,6 +7,7 @@ // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ +import Foundation import SwiftProtobuf // If the compiler emits an error on this type, it is because this file @@ -20,7 +20,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP typealias Version = _2 } -public enum MessageType: SwiftProtobuf.Enum, Swift.CaseIterable { +public enum MessageType: SwiftProtobuf.Enum { public typealias RawValue = Int case ack // = 0 @@ -82,6 +82,11 @@ public enum MessageType: SwiftProtobuf.Enum, Swift.CaseIterable { } } +} + +#if swift(>=4.2) + +extension MessageType: CaseIterable { // The compiler won't synthesize support with the UNRECOGNIZED case. public static let allCases: [MessageType] = [ .ack, @@ -97,10 +102,11 @@ public enum MessageType: SwiftProtobuf.Enum, Swift.CaseIterable { .aht20Humidity, .tvocIndex, ] - } -public struct SensorData: Sendable { +#endif // swift(>=4.2) + +public struct SensorData { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -130,16 +136,34 @@ public struct SensorData: Sendable { public var unknownFields = SwiftProtobuf.UnknownStorage() /// The sensor data, either as a float or an uint32 - public enum OneOf_Data: Equatable, Sendable { + public enum OneOf_Data: Equatable { case floatValue(Float) case uint32Value(UInt32) + #if !swift(>=4.1) + public static func ==(lhs: SensorData.OneOf_Data, rhs: SensorData.OneOf_Data) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.floatValue, .floatValue): return { + guard case .floatValue(let l) = lhs, case .floatValue(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.uint32Value, .uint32Value): return { + guard case .uint32Value(let l) = lhs, case .uint32Value(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif } public init() {} } -public struct InterdeviceMessage: Sendable { +public struct InterdeviceMessage { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -166,15 +190,41 @@ public struct InterdeviceMessage: Sendable { public var unknownFields = SwiftProtobuf.UnknownStorage() /// The message data - public enum OneOf_Data: Equatable, Sendable { + public enum OneOf_Data: Equatable { case nmea(String) case sensor(SensorData) + #if !swift(>=4.1) + public static func ==(lhs: InterdeviceMessage.OneOf_Data, rhs: InterdeviceMessage.OneOf_Data) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.nmea, .nmea): return { + guard case .nmea(let l) = lhs, case .nmea(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.sensor, .sensor): return { + guard case .sensor(let l) = lhs, case .sensor(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif } public init() {} } +#if swift(>=5.5) && canImport(_Concurrency) +extension MessageType: @unchecked Sendable {} +extension SensorData: @unchecked Sendable {} +extension SensorData.OneOf_Data: @unchecked Sendable {} +extension InterdeviceMessage: @unchecked Sendable {} +extension InterdeviceMessage.OneOf_Data: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/MeshtasticProtobufs/Sources/meshtastic/localonly.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/localonly.pb.swift index c3356286..0af27466 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/localonly.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/localonly.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/localonly.proto @@ -8,6 +7,7 @@ // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ +import Foundation import SwiftProtobuf // If the compiler emits an error on this type, it is because this file @@ -20,7 +20,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP typealias Version = _2 } -public struct LocalConfig: @unchecked Sendable { +public struct LocalConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -129,7 +129,7 @@ public struct LocalConfig: @unchecked Sendable { fileprivate var _storage = _StorageClass.defaultInstance } -public struct LocalModuleConfig: @unchecked Sendable { +public struct LocalModuleConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -293,6 +293,11 @@ public struct LocalModuleConfig: @unchecked Sendable { fileprivate var _storage = _StorageClass.defaultInstance } +#if swift(>=5.5) && canImport(_Concurrency) +extension LocalConfig: @unchecked Sendable {} +extension LocalModuleConfig: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/MeshtasticProtobufs/Sources/meshtastic/mesh.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/mesh.pb.swift index 8c869ba8..051f395f 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/mesh.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/mesh.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/mesh.proto @@ -26,7 +25,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// bin/build-all.sh script. /// Because they will be used to find firmware filenames in the android app for OTA updates. /// To match the old style filenames, _ is converted to -, p is converted to . -public enum HardwareModel: SwiftProtobuf.Enum, Swift.CaseIterable { +public enum HardwareModel: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -407,6 +406,41 @@ public enum HardwareModel: SwiftProtobuf.Enum, Swift.CaseIterable { /// Seeed XIAO nRF52840 + Wio SX1262 kit case xiaoNrf52Kit // = 88 + /// + /// Elecrow ThinkNode M1 & M2 + /// https://www.elecrow.com/wiki/ThinkNode-M1_Transceiver_Device(Meshtastic)_Power_By_nRF52840.html + /// https://www.elecrow.com/wiki/ThinkNode-M2_Transceiver_Device(Meshtastic)_Power_By_NRF52840.html (this actually uses ESP32-S3) + case thinknodeM1 // = 89 + case thinknodeM2 // = 90 + + /// + /// Lilygo T-ETH-Elite + case tEthElite // = 91 + + /// + /// Heltec HRI-3621 industrial probe + case heltecSensorHub // = 92 + + /// + /// Reserved Fried Chicken ID for future use + case reservedFriedChicken // = 93 + + /// + /// Heltec Magnetic Power Bank with Meshtastic compatible + case heltecMeshPocket // = 94 + + /// + /// Seeed Solar Node + case seeedSolarNode // = 95 + + /// + /// NomadStar Meteor Pro https://nomadstar.ch/ + case nomadstarMeteorPro // = 96 + + /// + /// Elecrow CrowPanel Advance models, ESP32-S3 and TFT with SX1262 radio plugin + case crowpanel // = 97 + /// /// ------------------------------------------------------------------------------------------------------------------------------------------ /// Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits. @@ -509,6 +543,15 @@ public enum HardwareModel: SwiftProtobuf.Enum, Swift.CaseIterable { case 86: self = .meshTab case 87: self = .meshlink case 88: self = .xiaoNrf52Kit + case 89: self = .thinknodeM1 + case 90: self = .thinknodeM2 + case 91: self = .tEthElite + case 92: self = .heltecSensorHub + case 93: self = .reservedFriedChicken + case 94: self = .heltecMeshPocket + case 95: self = .seeedSolarNode + case 96: self = .nomadstarMeteorPro + case 97: self = .crowpanel case 255: self = .privateHw default: self = .UNRECOGNIZED(rawValue) } @@ -605,11 +648,25 @@ public enum HardwareModel: SwiftProtobuf.Enum, Swift.CaseIterable { case .meshTab: return 86 case .meshlink: return 87 case .xiaoNrf52Kit: return 88 + case .thinknodeM1: return 89 + case .thinknodeM2: return 90 + case .tEthElite: return 91 + case .heltecSensorHub: return 92 + case .reservedFriedChicken: return 93 + case .heltecMeshPocket: return 94 + case .seeedSolarNode: return 95 + case .nomadstarMeteorPro: return 96 + case .crowpanel: return 97 case .privateHw: return 255 case .UNRECOGNIZED(let i): return i } } +} + +#if swift(>=4.2) + +extension HardwareModel: CaseIterable { // The compiler won't synthesize support with the UNRECOGNIZED case. public static let allCases: [HardwareModel] = [ .unset, @@ -701,14 +758,24 @@ public enum HardwareModel: SwiftProtobuf.Enum, Swift.CaseIterable { .meshTab, .meshlink, .xiaoNrf52Kit, + .thinknodeM1, + .thinknodeM2, + .tEthElite, + .heltecSensorHub, + .reservedFriedChicken, + .heltecMeshPocket, + .seeedSolarNode, + .nomadstarMeteorPro, + .crowpanel, .privateHw, ] - } +#endif // swift(>=4.2) + /// /// Shared constants between device and phone -public enum Constants: SwiftProtobuf.Enum, Swift.CaseIterable { +public enum Constants: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -743,20 +810,26 @@ public enum Constants: SwiftProtobuf.Enum, Swift.CaseIterable { } } +} + +#if swift(>=4.2) + +extension Constants: CaseIterable { // The compiler won't synthesize support with the UNRECOGNIZED case. public static let allCases: [Constants] = [ .zero, .dataPayloadLen, ] - } +#endif // swift(>=4.2) + /// /// Error codes for critical errors /// The device might report these fault codes on the screen. /// If you encounter a fault code, please post on the meshtastic.discourse.group /// and we'll try to help. -public enum CriticalErrorCode: SwiftProtobuf.Enum, Swift.CaseIterable { +public enum CriticalErrorCode: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -865,6 +938,11 @@ public enum CriticalErrorCode: SwiftProtobuf.Enum, Swift.CaseIterable { } } +} + +#if swift(>=4.2) + +extension CriticalErrorCode: CaseIterable { // The compiler won't synthesize support with the UNRECOGNIZED case. public static let allCases: [CriticalErrorCode] = [ .none, @@ -882,14 +960,15 @@ public enum CriticalErrorCode: SwiftProtobuf.Enum, Swift.CaseIterable { .flashCorruptionRecoverable, .flashCorruptionUnrecoverable, ] - } +#endif // swift(>=4.2) + /// /// Enum for modules excluded from a device's configuration. /// Each value represents a ModuleConfigType that can be toggled as excluded /// by setting its corresponding bit in the `excluded_modules` bitmask field. -public enum ExcludedModules: SwiftProtobuf.Enum, Swift.CaseIterable { +public enum ExcludedModules: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -947,6 +1026,14 @@ public enum ExcludedModules: SwiftProtobuf.Enum, Swift.CaseIterable { /// /// Paxcounter module case paxcounterConfig // = 4096 + + /// + /// Bluetooth config (not technically a module, but used to indicate bluetooth capabilities) + case bluetoothConfig // = 8192 + + /// + /// Network config (not technically a module, but used to indicate network capabilities) + case networkConfig // = 16384 case UNRECOGNIZED(Int) public init() { @@ -969,6 +1056,8 @@ public enum ExcludedModules: SwiftProtobuf.Enum, Swift.CaseIterable { case 1024: self = .ambientlightingConfig case 2048: self = .detectionsensorConfig case 4096: self = .paxcounterConfig + case 8192: self = .bluetoothConfig + case 16384: self = .networkConfig default: self = .UNRECOGNIZED(rawValue) } } @@ -989,10 +1078,17 @@ public enum ExcludedModules: SwiftProtobuf.Enum, Swift.CaseIterable { case .ambientlightingConfig: return 1024 case .detectionsensorConfig: return 2048 case .paxcounterConfig: return 4096 + case .bluetoothConfig: return 8192 + case .networkConfig: return 16384 case .UNRECOGNIZED(let i): return i } } +} + +#if swift(>=4.2) + +extension ExcludedModules: CaseIterable { // The compiler won't synthesize support with the UNRECOGNIZED case. public static let allCases: [ExcludedModules] = [ .excludedNone, @@ -1009,13 +1105,16 @@ public enum ExcludedModules: SwiftProtobuf.Enum, Swift.CaseIterable { .ambientlightingConfig, .detectionsensorConfig, .paxcounterConfig, + .bluetoothConfig, + .networkConfig, ] - } +#endif // swift(>=4.2) + /// /// A GPS Position -public struct Position: @unchecked Sendable { +public struct Position { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1232,7 +1331,7 @@ public struct Position: @unchecked Sendable { /// /// How the location was acquired: manual, onboard GPS, external (EUD) GPS - public enum LocSource: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum LocSource: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -1276,20 +1375,12 @@ public struct Position: @unchecked Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Position.LocSource] = [ - .locUnset, - .locManual, - .locInternal, - .locExternal, - ] - } /// /// How the altitude was acquired: manual, GPS int/ext, etc /// Default: same as location_source if present - public enum AltSource: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum AltSource: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -1339,15 +1430,6 @@ public struct Position: @unchecked Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Position.AltSource] = [ - .altUnset, - .altManual, - .altInternal, - .altExternal, - .altBarometric, - ] - } public init() {} @@ -1355,6 +1437,31 @@ public struct Position: @unchecked Sendable { fileprivate var _storage = _StorageClass.defaultInstance } +#if swift(>=4.2) + +extension Position.LocSource: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Position.LocSource] = [ + .locUnset, + .locManual, + .locInternal, + .locExternal, + ] +} + +extension Position.AltSource: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Position.AltSource] = [ + .altUnset, + .altManual, + .altInternal, + .altExternal, + .altBarometric, + ] +} + +#endif // swift(>=4.2) + /// /// Broadcast when a newly powered mesh node wants to find a node num it can use /// Sent from the phone over bluetooth to set the user id for the owner of this node. @@ -1376,7 +1483,7 @@ public struct Position: @unchecked Sendable { /// A few nodenums are reserved and will never be requested: /// 0xff - broadcast /// 0 through 3 - for future use -public struct User: @unchecked Sendable { +public struct User { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1401,8 +1508,6 @@ public struct User: @unchecked Sendable { /// Deprecated in Meshtastic 2.1.x /// This is the addr of the radio. /// Not populated by the phone, but added by the esp32 when broadcasting - /// - /// NOTE: This field was marked as deprecated in the .proto file. public var macaddr: Data = Data() /// @@ -1434,7 +1539,7 @@ public struct User: @unchecked Sendable { /// /// A message used in a traceroute -public struct RouteDiscovery: Sendable { +public struct RouteDiscovery { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1462,7 +1567,7 @@ public struct RouteDiscovery: Sendable { /// /// A Routing control Data packet handled by the routing module -public struct Routing: Sendable { +public struct Routing { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1502,7 +1607,7 @@ public struct Routing: Sendable { public var unknownFields = SwiftProtobuf.UnknownStorage() - public enum OneOf_Variant: Equatable, Sendable { + public enum OneOf_Variant: Equatable { /// /// A route request going from the requester case routeRequest(RouteDiscovery) @@ -1514,12 +1619,34 @@ public struct Routing: Sendable { /// in addition to ack.fail_id to provide details on the type of failure). case errorReason(Routing.Error) + #if !swift(>=4.1) + public static func ==(lhs: Routing.OneOf_Variant, rhs: Routing.OneOf_Variant) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.routeRequest, .routeRequest): return { + guard case .routeRequest(let l) = lhs, case .routeRequest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.routeReply, .routeReply): return { + guard case .routeReply(let l) = lhs, case .routeReply(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.errorReason, .errorReason): return { + guard case .errorReason(let l) = lhs, case .errorReason(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif } /// /// A failure in delivering a message (usually used for routing control messages, but might be provided in addition to ack.fail_id to provide /// details on the type of failure). - public enum Error: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum Error: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -1637,36 +1764,42 @@ public struct Routing: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [Routing.Error] = [ - .none, - .noRoute, - .gotNak, - .timeout, - .noInterface, - .maxRetransmit, - .noChannel, - .tooLarge, - .noResponse, - .dutyCycleLimit, - .badRequest, - .notAuthorized, - .pkiFailed, - .pkiUnknownPubkey, - .adminBadSessionKey, - .adminPublicKeyUnauthorized, - ] - } public init() {} } +#if swift(>=4.2) + +extension Routing.Error: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [Routing.Error] = [ + .none, + .noRoute, + .gotNak, + .timeout, + .noInterface, + .maxRetransmit, + .noChannel, + .tooLarge, + .noResponse, + .dutyCycleLimit, + .badRequest, + .notAuthorized, + .pkiFailed, + .pkiUnknownPubkey, + .adminBadSessionKey, + .adminPublicKeyUnauthorized, + ] +} + +#endif // swift(>=4.2) + /// /// (Formerly called SubPacket) /// The payload portion fo a packet, this is the actual bytes that are sent /// inside a radio packet (because from/to are broken out by the comms library) -public struct DataMessage: @unchecked Sendable { +public struct DataMessage { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1733,7 +1866,7 @@ public struct DataMessage: @unchecked Sendable { /// /// Waypoint message, used to share arbitrary locations across the mesh -public struct Waypoint: Sendable { +public struct Waypoint { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1795,7 +1928,7 @@ public struct Waypoint: Sendable { /// /// This message will be proxied over the PhoneAPI for the client to deliver to the MQTT server -public struct MqttClientProxyMessage: @unchecked Sendable { +public struct MqttClientProxyMessage { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1836,7 +1969,7 @@ public struct MqttClientProxyMessage: @unchecked Sendable { /// /// The actual service envelope payload or text for mqtt pub / sub - public enum OneOf_PayloadVariant: Equatable, @unchecked Sendable { + public enum OneOf_PayloadVariant: Equatable { /// /// Bytes case data(Data) @@ -1844,6 +1977,24 @@ public struct MqttClientProxyMessage: @unchecked Sendable { /// Text case text(String) + #if !swift(>=4.1) + public static func ==(lhs: MqttClientProxyMessage.OneOf_PayloadVariant, rhs: MqttClientProxyMessage.OneOf_PayloadVariant) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.data, .data): return { + guard case .data(let l) = lhs, case .data(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.text, .text): return { + guard case .text(let l) = lhs, case .text(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif } public init() {} @@ -1853,7 +2004,7 @@ public struct MqttClientProxyMessage: @unchecked Sendable { /// A packet envelope sent/received over the mesh /// only payload_variant is sent in the payload portion of the LORA packet. /// The other fields are either not sent at all, or sent in the special 16 byte LORA header. -public struct MeshPacket: @unchecked Sendable { +public struct MeshPacket { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1987,8 +2138,6 @@ public struct MeshPacket: @unchecked Sendable { /// /// Describe if this message is delayed - /// - /// NOTE: This field was marked as deprecated in the .proto file. public var delayed: MeshPacket.Delayed { get {return _storage._delayed} set {_uniqueStorage()._delayed = newValue} @@ -2050,7 +2199,7 @@ public struct MeshPacket: @unchecked Sendable { public var unknownFields = SwiftProtobuf.UnknownStorage() - public enum OneOf_PayloadVariant: Equatable, @unchecked Sendable { + public enum OneOf_PayloadVariant: Equatable { /// /// TODO: REPLACE case decoded(DataMessage) @@ -2058,6 +2207,24 @@ public struct MeshPacket: @unchecked Sendable { /// TODO: REPLACE case encrypted(Data) + #if !swift(>=4.1) + public static func ==(lhs: MeshPacket.OneOf_PayloadVariant, rhs: MeshPacket.OneOf_PayloadVariant) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.decoded, .decoded): return { + guard case .decoded(let l) = lhs, case .decoded(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.encrypted, .encrypted): return { + guard case .encrypted(let l) = lhs, case .encrypted(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif } /// @@ -2079,7 +2246,7 @@ public struct MeshPacket: @unchecked Sendable { /// So I bit the bullet and implemented a new (internal - not sent over the air) /// field in MeshPacket called 'priority'. /// And the transmission queue in the router object is now a priority queue. - public enum Priority: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum Priority: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -2163,25 +2330,11 @@ public struct MeshPacket: @unchecked Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [MeshPacket.Priority] = [ - .unset, - .min, - .background, - .default, - .reliable, - .response, - .high, - .alert, - .ack, - .max, - ] - } /// /// Identify if this is a delayed packet - public enum Delayed: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum Delayed: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -2219,13 +2372,6 @@ public struct MeshPacket: @unchecked Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [MeshPacket.Delayed] = [ - .noDelay, - .broadcast, - .direct, - ] - } public init() {} @@ -2233,6 +2379,35 @@ public struct MeshPacket: @unchecked Sendable { fileprivate var _storage = _StorageClass.defaultInstance } +#if swift(>=4.2) + +extension MeshPacket.Priority: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [MeshPacket.Priority] = [ + .unset, + .min, + .background, + .default, + .reliable, + .response, + .high, + .alert, + .ack, + .max, + ] +} + +extension MeshPacket.Delayed: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [MeshPacket.Delayed] = [ + .noDelay, + .broadcast, + .direct, + ] +} + +#endif // swift(>=4.2) + /// /// The bluetooth to device link: /// Old BTLE protocol docs from TODO, merge in above and make real docs... @@ -2250,7 +2425,7 @@ public struct MeshPacket: @unchecked Sendable { /// level etc) SET_CONFIG (switches device to a new set of radio params and /// preshared key, drops all existing nodes, force our node to rejoin this new group) /// Full information about a node on the mesh -public struct NodeInfo: @unchecked Sendable { +public struct NodeInfo { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -2363,7 +2538,7 @@ public struct NodeInfo: @unchecked Sendable { /// Unique local debugging info for this node /// Note: we don't include position or the user info, because that will come in the /// Sent to the phone in response to WantNodes. -public struct MyNodeInfo: @unchecked Sendable { +public struct MyNodeInfo { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -2402,7 +2577,7 @@ public struct MyNodeInfo: @unchecked Sendable { /// on the message it is assumed to be a continuation of the previously sent message. /// This allows the device code to use fixed maxlen 64 byte strings for messages, /// and then extend as needed by emitting multiple records. -public struct LogRecord: Sendable { +public struct LogRecord { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -2427,7 +2602,7 @@ public struct LogRecord: Sendable { /// /// Log levels, chosen to match python logging conventions. - public enum Level: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum Level: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -2489,23 +2664,29 @@ public struct LogRecord: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [LogRecord.Level] = [ - .unset, - .critical, - .error, - .warning, - .info, - .debug, - .trace, - ] - } public init() {} } -public struct QueueStatus: Sendable { +#if swift(>=4.2) + +extension LogRecord.Level: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [LogRecord.Level] = [ + .unset, + .critical, + .error, + .warning, + .info, + .debug, + .trace, + ] +} + +#endif // swift(>=4.2) + +public struct QueueStatus { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -2532,7 +2713,7 @@ public struct QueueStatus: Sendable { /// It will support READ and NOTIFY. When a new packet arrives the device will BLE notify? /// It will sit in that descriptor until consumed by the phone, /// at which point the next item in the FIFO will be populated. -public struct FromRadio: Sendable { +public struct FromRadio { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -2718,7 +2899,7 @@ public struct FromRadio: Sendable { /// /// Log levels, chosen to match python logging conventions. - public enum OneOf_PayloadVariant: Equatable, Sendable { + public enum OneOf_PayloadVariant: Equatable { /// /// Log levels, chosen to match python logging conventions. case packet(MeshPacket) @@ -2776,6 +2957,80 @@ public struct FromRadio: Sendable { /// Persistent data for device-ui case deviceuiConfig(DeviceUIConfig) + #if !swift(>=4.1) + public static func ==(lhs: FromRadio.OneOf_PayloadVariant, rhs: FromRadio.OneOf_PayloadVariant) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.packet, .packet): return { + guard case .packet(let l) = lhs, case .packet(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.myInfo, .myInfo): return { + guard case .myInfo(let l) = lhs, case .myInfo(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.nodeInfo, .nodeInfo): return { + guard case .nodeInfo(let l) = lhs, case .nodeInfo(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.config, .config): return { + guard case .config(let l) = lhs, case .config(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.logRecord, .logRecord): return { + guard case .logRecord(let l) = lhs, case .logRecord(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.configCompleteID, .configCompleteID): return { + guard case .configCompleteID(let l) = lhs, case .configCompleteID(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.rebooted, .rebooted): return { + guard case .rebooted(let l) = lhs, case .rebooted(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.moduleConfig, .moduleConfig): return { + guard case .moduleConfig(let l) = lhs, case .moduleConfig(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.channel, .channel): return { + guard case .channel(let l) = lhs, case .channel(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.queueStatus, .queueStatus): return { + guard case .queueStatus(let l) = lhs, case .queueStatus(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.xmodemPacket, .xmodemPacket): return { + guard case .xmodemPacket(let l) = lhs, case .xmodemPacket(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.metadata, .metadata): return { + guard case .metadata(let l) = lhs, case .metadata(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.mqttClientProxyMessage, .mqttClientProxyMessage): return { + guard case .mqttClientProxyMessage(let l) = lhs, case .mqttClientProxyMessage(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.fileInfo, .fileInfo): return { + guard case .fileInfo(let l) = lhs, case .fileInfo(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.clientNotification, .clientNotification): return { + guard case .clientNotification(let l) = lhs, case .clientNotification(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.deviceuiConfig, .deviceuiConfig): return { + guard case .deviceuiConfig(let l) = lhs, case .deviceuiConfig(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif } public init() {} @@ -2786,7 +3041,7 @@ public struct FromRadio: Sendable { /// To be used for important messages that should to be displayed to the user /// in the form of push notifications or validation messages when saving /// invalid configuration. -public struct ClientNotification: Sendable { +public struct ClientNotification { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -2823,7 +3078,7 @@ public struct ClientNotification: Sendable { /// /// Individual File info for the device -public struct FileInfo: Sendable { +public struct FileInfo { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -2844,7 +3099,7 @@ public struct FileInfo: Sendable { /// /// Packets/commands to the radio will be written (reliably) to the toRadio characteristic. /// Once the write completes the phone can assume it is handled. -public struct ToRadio: Sendable { +public struct ToRadio { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -2924,7 +3179,7 @@ public struct ToRadio: Sendable { /// /// Log levels, chosen to match python logging conventions. - public enum OneOf_PayloadVariant: Equatable, Sendable { + public enum OneOf_PayloadVariant: Equatable { /// /// Send this packet on the mesh case packet(MeshPacket) @@ -2951,6 +3206,40 @@ public struct ToRadio: Sendable { /// Heartbeat message (used to keep the device connection awake on serial) case heartbeat(Heartbeat) + #if !swift(>=4.1) + public static func ==(lhs: ToRadio.OneOf_PayloadVariant, rhs: ToRadio.OneOf_PayloadVariant) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.packet, .packet): return { + guard case .packet(let l) = lhs, case .packet(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.wantConfigID, .wantConfigID): return { + guard case .wantConfigID(let l) = lhs, case .wantConfigID(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.disconnect, .disconnect): return { + guard case .disconnect(let l) = lhs, case .disconnect(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.xmodemPacket, .xmodemPacket): return { + guard case .xmodemPacket(let l) = lhs, case .xmodemPacket(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.mqttClientProxyMessage, .mqttClientProxyMessage): return { + guard case .mqttClientProxyMessage(let l) = lhs, case .mqttClientProxyMessage(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.heartbeat, .heartbeat): return { + guard case .heartbeat(let l) = lhs, case .heartbeat(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif } public init() {} @@ -2958,7 +3247,7 @@ public struct ToRadio: Sendable { /// /// Compressed message payload -public struct Compressed: @unchecked Sendable { +public struct Compressed { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -2978,7 +3267,7 @@ public struct Compressed: @unchecked Sendable { /// /// Full info on edges for a single node -public struct NeighborInfo: Sendable { +public struct NeighborInfo { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -3006,7 +3295,7 @@ public struct NeighborInfo: Sendable { /// /// A single edge in the mesh -public struct Neighbor: Sendable { +public struct Neighbor { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -3036,7 +3325,7 @@ public struct Neighbor: Sendable { /// /// Device metadata response -public struct DeviceMetadata: Sendable { +public struct DeviceMetadata { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -3098,7 +3387,7 @@ public struct DeviceMetadata: Sendable { /// /// A heartbeat message is sent to the node from the client to keep the connection alive. /// This is currently only needed to keep serial connections alive, but can be used by any PhoneAPI. -public struct Heartbeat: Sendable { +public struct Heartbeat { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -3110,7 +3399,7 @@ public struct Heartbeat: Sendable { /// /// RemoteHardwarePins associated with a node -public struct NodeRemoteHardwarePin: Sendable { +public struct NodeRemoteHardwarePin { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -3137,7 +3426,7 @@ public struct NodeRemoteHardwarePin: Sendable { fileprivate var _pin: RemoteHardwarePin? = nil } -public struct ChunkedPayload: @unchecked Sendable { +public struct ChunkedPayload { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -3165,7 +3454,7 @@ public struct ChunkedPayload: @unchecked Sendable { /// /// Wrapper message for broken repeated oneof support -public struct resend_chunks: Sendable { +public struct resend_chunks { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -3179,7 +3468,7 @@ public struct resend_chunks: Sendable { /// /// Responses to a ChunkedPayload request -public struct ChunkedPayloadResponse: Sendable { +public struct ChunkedPayloadResponse { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -3222,7 +3511,7 @@ public struct ChunkedPayloadResponse: Sendable { public var unknownFields = SwiftProtobuf.UnknownStorage() - public enum OneOf_PayloadVariant: Equatable, Sendable { + public enum OneOf_PayloadVariant: Equatable { /// /// Request to transfer chunked payload case requestTransfer(Bool) @@ -3233,11 +3522,77 @@ public struct ChunkedPayloadResponse: Sendable { /// Request missing indexes in the chunked payload case resendChunks(resend_chunks) + #if !swift(>=4.1) + public static func ==(lhs: ChunkedPayloadResponse.OneOf_PayloadVariant, rhs: ChunkedPayloadResponse.OneOf_PayloadVariant) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.requestTransfer, .requestTransfer): return { + guard case .requestTransfer(let l) = lhs, case .requestTransfer(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.acceptTransfer, .acceptTransfer): return { + guard case .acceptTransfer(let l) = lhs, case .acceptTransfer(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.resendChunks, .resendChunks): return { + guard case .resendChunks(let l) = lhs, case .resendChunks(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif } public init() {} } +#if swift(>=5.5) && canImport(_Concurrency) +extension HardwareModel: @unchecked Sendable {} +extension Constants: @unchecked Sendable {} +extension CriticalErrorCode: @unchecked Sendable {} +extension ExcludedModules: @unchecked Sendable {} +extension Position: @unchecked Sendable {} +extension Position.LocSource: @unchecked Sendable {} +extension Position.AltSource: @unchecked Sendable {} +extension User: @unchecked Sendable {} +extension RouteDiscovery: @unchecked Sendable {} +extension Routing: @unchecked Sendable {} +extension Routing.OneOf_Variant: @unchecked Sendable {} +extension Routing.Error: @unchecked Sendable {} +extension DataMessage: @unchecked Sendable {} +extension Waypoint: @unchecked Sendable {} +extension MqttClientProxyMessage: @unchecked Sendable {} +extension MqttClientProxyMessage.OneOf_PayloadVariant: @unchecked Sendable {} +extension MeshPacket: @unchecked Sendable {} +extension MeshPacket.OneOf_PayloadVariant: @unchecked Sendable {} +extension MeshPacket.Priority: @unchecked Sendable {} +extension MeshPacket.Delayed: @unchecked Sendable {} +extension NodeInfo: @unchecked Sendable {} +extension MyNodeInfo: @unchecked Sendable {} +extension LogRecord: @unchecked Sendable {} +extension LogRecord.Level: @unchecked Sendable {} +extension QueueStatus: @unchecked Sendable {} +extension FromRadio: @unchecked Sendable {} +extension FromRadio.OneOf_PayloadVariant: @unchecked Sendable {} +extension ClientNotification: @unchecked Sendable {} +extension FileInfo: @unchecked Sendable {} +extension ToRadio: @unchecked Sendable {} +extension ToRadio.OneOf_PayloadVariant: @unchecked Sendable {} +extension Compressed: @unchecked Sendable {} +extension NeighborInfo: @unchecked Sendable {} +extension Neighbor: @unchecked Sendable {} +extension DeviceMetadata: @unchecked Sendable {} +extension Heartbeat: @unchecked Sendable {} +extension NodeRemoteHardwarePin: @unchecked Sendable {} +extension ChunkedPayload: @unchecked Sendable {} +extension resend_chunks: @unchecked Sendable {} +extension ChunkedPayloadResponse: @unchecked Sendable {} +extension ChunkedPayloadResponse.OneOf_PayloadVariant: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" @@ -3333,6 +3688,15 @@ extension HardwareModel: SwiftProtobuf._ProtoNameProviding { 86: .same(proto: "MESH_TAB"), 87: .same(proto: "MESHLINK"), 88: .same(proto: "XIAO_NRF52_KIT"), + 89: .same(proto: "THINKNODE_M1"), + 90: .same(proto: "THINKNODE_M2"), + 91: .same(proto: "T_ETH_ELITE"), + 92: .same(proto: "HELTEC_SENSOR_HUB"), + 93: .same(proto: "RESERVED_FRIED_CHICKEN"), + 94: .same(proto: "HELTEC_MESH_POCKET"), + 95: .same(proto: "SEEED_SOLAR_NODE"), + 96: .same(proto: "NOMADSTAR_METEOR_PRO"), + 97: .same(proto: "CROWPANEL"), 255: .same(proto: "PRIVATE_HW"), ] } @@ -3379,6 +3743,8 @@ extension ExcludedModules: SwiftProtobuf._ProtoNameProviding { 1024: .same(proto: "AMBIENTLIGHTING_CONFIG"), 2048: .same(proto: "DETECTIONSENSOR_CONFIG"), 4096: .same(proto: "PAXCOUNTER_CONFIG"), + 8192: .same(proto: "BLUETOOTH_CONFIG"), + 16384: .same(proto: "NETWORK_CONFIG"), ] } @@ -4288,7 +4654,7 @@ extension MeshPacket: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementatio if _storage._rxTime != 0 { try visitor.visitSingularFixed32Field(value: _storage._rxTime, fieldNumber: 7) } - if _storage._rxSnr.bitPattern != 0 { + if _storage._rxSnr != 0 { try visitor.visitSingularFloatField(value: _storage._rxSnr, fieldNumber: 8) } if _storage._hopLimit != 0 { @@ -4490,7 +4856,7 @@ extension NodeInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationB try { if let v = _storage._position { try visitor.visitSingularMessageField(value: v, fieldNumber: 3) } }() - if _storage._snr.bitPattern != 0 { + if _storage._snr != 0 { try visitor.visitSingularFloatField(value: _storage._snr, fieldNumber: 4) } if _storage._lastHeard != 0 { @@ -5369,7 +5735,7 @@ extension Neighbor: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationB if self.nodeID != 0 { try visitor.visitSingularUInt32Field(value: self.nodeID, fieldNumber: 1) } - if self.snr.bitPattern != 0 { + if self.snr != 0 { try visitor.visitSingularFloatField(value: self.snr, fieldNumber: 2) } if self.lastRxTime != 0 { @@ -5494,8 +5860,8 @@ extension Heartbeat: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementation public static let _protobuf_nameMap = SwiftProtobuf._NameMap() public mutating func decodeMessage(decoder: inout D) throws { - // Load everything into unknown fields - while try decoder.nextFieldNumber() != nil {} + while let _ = try decoder.nextFieldNumber() { + } } public func traverse(visitor: inout V) throws { diff --git a/MeshtasticProtobufs/Sources/meshtastic/module_config.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/module_config.pb.swift index 0138ccff..bcf4041c 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/module_config.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/module_config.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/module_config.proto @@ -8,6 +7,7 @@ // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ +import Foundation import SwiftProtobuf // If the compiler emits an error on this type, it is because this file @@ -20,7 +20,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP typealias Version = _2 } -public enum RemoteHardwarePinType: SwiftProtobuf.Enum, Swift.CaseIterable { +public enum RemoteHardwarePinType: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -58,18 +58,24 @@ public enum RemoteHardwarePinType: SwiftProtobuf.Enum, Swift.CaseIterable { } } +} + +#if swift(>=4.2) + +extension RemoteHardwarePinType: CaseIterable { // The compiler won't synthesize support with the UNRECOGNIZED case. public static let allCases: [RemoteHardwarePinType] = [ .unknown, .digitalRead, .digitalWrite, ] - } +#endif // swift(>=4.2) + /// /// Module Config -public struct ModuleConfig: Sendable { +public struct ModuleConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -212,7 +218,7 @@ public struct ModuleConfig: Sendable { /// /// TODO: REPLACE - public enum OneOf_PayloadVariant: Equatable, Sendable { + public enum OneOf_PayloadVariant: Equatable { /// /// TODO: REPLACE case mqtt(ModuleConfig.MQTTConfig) @@ -253,11 +259,73 @@ public struct ModuleConfig: Sendable { /// TODO: REPLACE case paxcounter(ModuleConfig.PaxcounterConfig) + #if !swift(>=4.1) + public static func ==(lhs: ModuleConfig.OneOf_PayloadVariant, rhs: ModuleConfig.OneOf_PayloadVariant) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.mqtt, .mqtt): return { + guard case .mqtt(let l) = lhs, case .mqtt(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.serial, .serial): return { + guard case .serial(let l) = lhs, case .serial(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.externalNotification, .externalNotification): return { + guard case .externalNotification(let l) = lhs, case .externalNotification(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.storeForward, .storeForward): return { + guard case .storeForward(let l) = lhs, case .storeForward(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.rangeTest, .rangeTest): return { + guard case .rangeTest(let l) = lhs, case .rangeTest(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.telemetry, .telemetry): return { + guard case .telemetry(let l) = lhs, case .telemetry(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.cannedMessage, .cannedMessage): return { + guard case .cannedMessage(let l) = lhs, case .cannedMessage(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.audio, .audio): return { + guard case .audio(let l) = lhs, case .audio(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.remoteHardware, .remoteHardware): return { + guard case .remoteHardware(let l) = lhs, case .remoteHardware(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.neighborInfo, .neighborInfo): return { + guard case .neighborInfo(let l) = lhs, case .neighborInfo(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.ambientLighting, .ambientLighting): return { + guard case .ambientLighting(let l) = lhs, case .ambientLighting(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.detectionSensor, .detectionSensor): return { + guard case .detectionSensor(let l) = lhs, case .detectionSensor(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.paxcounter, .paxcounter): return { + guard case .paxcounter(let l) = lhs, case .paxcounter(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif } /// /// MQTT Client Config - public struct MQTTConfig: Sendable { + public struct MQTTConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -332,7 +400,7 @@ public struct ModuleConfig: Sendable { /// /// Settings for reporting unencrypted information about our node to a map via MQTT - public struct MapReportSettings: Sendable { + public struct MapReportSettings { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -352,7 +420,7 @@ public struct ModuleConfig: Sendable { /// /// RemoteHardwareModule Config - public struct RemoteHardwareConfig: Sendable { + public struct RemoteHardwareConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -376,7 +444,7 @@ public struct ModuleConfig: Sendable { /// /// NeighborInfoModule Config - public struct NeighborInfoConfig: Sendable { + public struct NeighborInfoConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -402,7 +470,7 @@ public struct ModuleConfig: Sendable { /// /// Detection Sensor Module Config - public struct DetectionSensorConfig: Sendable { + public struct DetectionSensorConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -449,7 +517,7 @@ public struct ModuleConfig: Sendable { public var unknownFields = SwiftProtobuf.UnknownStorage() - public enum TriggerType: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum TriggerType: SwiftProtobuf.Enum { public typealias RawValue = Int /// Event is triggered if pin is low @@ -501,16 +569,6 @@ public struct ModuleConfig: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [ModuleConfig.DetectionSensorConfig.TriggerType] = [ - .logicLow, - .logicHigh, - .fallingEdge, - .risingEdge, - .eitherEdgeActiveLow, - .eitherEdgeActiveHigh, - ] - } public init() {} @@ -518,7 +576,7 @@ public struct ModuleConfig: Sendable { /// /// Audio Config for codec2 voice - public struct AudioConfig: Sendable { + public struct AudioConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -555,7 +613,7 @@ public struct ModuleConfig: Sendable { /// /// Baudrate for codec2 voice - public enum Audio_Baud: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum Audio_Baud: SwiftProtobuf.Enum { public typealias RawValue = Int case codec2Default // = 0 case codec23200 // = 1 @@ -602,19 +660,6 @@ public struct ModuleConfig: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [ModuleConfig.AudioConfig.Audio_Baud] = [ - .codec2Default, - .codec23200, - .codec22400, - .codec21600, - .codec21400, - .codec21300, - .codec21200, - .codec2700, - .codec2700B, - ] - } public init() {} @@ -622,7 +667,7 @@ public struct ModuleConfig: Sendable { /// /// Config for the Paxcounter Module - public struct PaxcounterConfig: Sendable { + public struct PaxcounterConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -648,7 +693,7 @@ public struct ModuleConfig: Sendable { /// /// Serial Config - public struct SerialConfig: Sendable { + public struct SerialConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -691,7 +736,7 @@ public struct ModuleConfig: Sendable { /// /// TODO: REPLACE - public enum Serial_Baud: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum Serial_Baud: SwiftProtobuf.Enum { public typealias RawValue = Int case baudDefault // = 0 case baud110 // = 1 @@ -759,31 +804,11 @@ public struct ModuleConfig: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [ModuleConfig.SerialConfig.Serial_Baud] = [ - .baudDefault, - .baud110, - .baud300, - .baud600, - .baud1200, - .baud2400, - .baud4800, - .baud9600, - .baud19200, - .baud38400, - .baud57600, - .baud115200, - .baud230400, - .baud460800, - .baud576000, - .baud921600, - ] - } /// /// TODO: REPLACE - public enum Serial_Mode: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum Serial_Mode: SwiftProtobuf.Enum { public typealias RawValue = Int case `default` // = 0 case simple // = 1 @@ -828,17 +853,6 @@ public struct ModuleConfig: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [ModuleConfig.SerialConfig.Serial_Mode] = [ - .default, - .simple, - .proto, - .textmsg, - .nmea, - .caltopo, - .ws85, - ] - } public init() {} @@ -846,7 +860,7 @@ public struct ModuleConfig: Sendable { /// /// External Notifications Config - public struct ExternalNotificationConfig: Sendable { + public struct ExternalNotificationConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -929,7 +943,7 @@ public struct ModuleConfig: Sendable { /// /// Store and Forward Module Config - public struct StoreForwardConfig: Sendable { + public struct StoreForwardConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -965,7 +979,7 @@ public struct ModuleConfig: Sendable { /// /// Preferences for the RangeTestModule - public struct RangeTestConfig: Sendable { + public struct RangeTestConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -990,7 +1004,7 @@ public struct ModuleConfig: Sendable { /// /// Configuration for both device and environment metrics - public struct TelemetryConfig: Sendable { + public struct TelemetryConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1059,7 +1073,7 @@ public struct ModuleConfig: Sendable { /// /// Canned Messages Module Config - public struct CannedMessageConfig: Sendable { + public struct CannedMessageConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1114,7 +1128,7 @@ public struct ModuleConfig: Sendable { /// /// TODO: REPLACE - public enum InputEventChar: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum InputEventChar: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -1182,18 +1196,6 @@ public struct ModuleConfig: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [ModuleConfig.CannedMessageConfig.InputEventChar] = [ - .none, - .up, - .down, - .left, - .right, - .select, - .back, - .cancel, - ] - } public init() {} @@ -1202,7 +1204,7 @@ public struct ModuleConfig: Sendable { /// ///Ambient Lighting Module - Settings for control of onboard LEDs to allow users to adjust the brightness levels and respective color levels. ///Initially created for the RAK14001 RGB LED module. - public struct AmbientLightingConfig: Sendable { + public struct AmbientLightingConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1235,9 +1237,89 @@ public struct ModuleConfig: Sendable { public init() {} } +#if swift(>=4.2) + +extension ModuleConfig.DetectionSensorConfig.TriggerType: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [ModuleConfig.DetectionSensorConfig.TriggerType] = [ + .logicLow, + .logicHigh, + .fallingEdge, + .risingEdge, + .eitherEdgeActiveLow, + .eitherEdgeActiveHigh, + ] +} + +extension ModuleConfig.AudioConfig.Audio_Baud: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [ModuleConfig.AudioConfig.Audio_Baud] = [ + .codec2Default, + .codec23200, + .codec22400, + .codec21600, + .codec21400, + .codec21300, + .codec21200, + .codec2700, + .codec2700B, + ] +} + +extension ModuleConfig.SerialConfig.Serial_Baud: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [ModuleConfig.SerialConfig.Serial_Baud] = [ + .baudDefault, + .baud110, + .baud300, + .baud600, + .baud1200, + .baud2400, + .baud4800, + .baud9600, + .baud19200, + .baud38400, + .baud57600, + .baud115200, + .baud230400, + .baud460800, + .baud576000, + .baud921600, + ] +} + +extension ModuleConfig.SerialConfig.Serial_Mode: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [ModuleConfig.SerialConfig.Serial_Mode] = [ + .default, + .simple, + .proto, + .textmsg, + .nmea, + .caltopo, + .ws85, + ] +} + +extension ModuleConfig.CannedMessageConfig.InputEventChar: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [ModuleConfig.CannedMessageConfig.InputEventChar] = [ + .none, + .up, + .down, + .left, + .right, + .select, + .back, + .cancel, + ] +} + +#endif // swift(>=4.2) + /// /// A GPIO pin definition for remote hardware module -public struct RemoteHardwarePin: Sendable { +public struct RemoteHardwarePin { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1259,6 +1341,32 @@ public struct RemoteHardwarePin: Sendable { public init() {} } +#if swift(>=5.5) && canImport(_Concurrency) +extension RemoteHardwarePinType: @unchecked Sendable {} +extension ModuleConfig: @unchecked Sendable {} +extension ModuleConfig.OneOf_PayloadVariant: @unchecked Sendable {} +extension ModuleConfig.MQTTConfig: @unchecked Sendable {} +extension ModuleConfig.MapReportSettings: @unchecked Sendable {} +extension ModuleConfig.RemoteHardwareConfig: @unchecked Sendable {} +extension ModuleConfig.NeighborInfoConfig: @unchecked Sendable {} +extension ModuleConfig.DetectionSensorConfig: @unchecked Sendable {} +extension ModuleConfig.DetectionSensorConfig.TriggerType: @unchecked Sendable {} +extension ModuleConfig.AudioConfig: @unchecked Sendable {} +extension ModuleConfig.AudioConfig.Audio_Baud: @unchecked Sendable {} +extension ModuleConfig.PaxcounterConfig: @unchecked Sendable {} +extension ModuleConfig.SerialConfig: @unchecked Sendable {} +extension ModuleConfig.SerialConfig.Serial_Baud: @unchecked Sendable {} +extension ModuleConfig.SerialConfig.Serial_Mode: @unchecked Sendable {} +extension ModuleConfig.ExternalNotificationConfig: @unchecked Sendable {} +extension ModuleConfig.StoreForwardConfig: @unchecked Sendable {} +extension ModuleConfig.RangeTestConfig: @unchecked Sendable {} +extension ModuleConfig.TelemetryConfig: @unchecked Sendable {} +extension ModuleConfig.CannedMessageConfig: @unchecked Sendable {} +extension ModuleConfig.CannedMessageConfig.InputEventChar: @unchecked Sendable {} +extension ModuleConfig.AmbientLightingConfig: @unchecked Sendable {} +extension RemoteHardwarePin: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/MeshtasticProtobufs/Sources/meshtastic/mqtt.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/mqtt.pb.swift index 006fd9c8..efe6cdd5 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/mqtt.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/mqtt.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/mqtt.proto @@ -8,6 +7,7 @@ // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ +import Foundation import SwiftProtobuf // If the compiler emits an error on this type, it is because this file @@ -22,7 +22,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// /// This message wraps a MeshPacket with extra metadata about the sender and how it arrived. -public struct ServiceEnvelope: Sendable { +public struct ServiceEnvelope { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -57,7 +57,7 @@ public struct ServiceEnvelope: Sendable { /// /// Information about a node intended to be reported unencrypted to a map using MQTT. -public struct MapReport: Sendable { +public struct MapReport { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -121,6 +121,11 @@ public struct MapReport: Sendable { public init() {} } +#if swift(>=5.5) && canImport(_Concurrency) +extension ServiceEnvelope: @unchecked Sendable {} +extension MapReport: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/MeshtasticProtobufs/Sources/meshtastic/paxcount.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/paxcount.pb.swift index e24ed371..cf8aa463 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/paxcount.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/paxcount.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/paxcount.proto @@ -8,6 +7,7 @@ // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ +import Foundation import SwiftProtobuf // If the compiler emits an error on this type, it is because this file @@ -22,7 +22,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// /// TODO: REPLACE -public struct Paxcount: Sendable { +public struct Paxcount { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -44,6 +44,10 @@ public struct Paxcount: Sendable { public init() {} } +#if swift(>=5.5) && canImport(_Concurrency) +extension Paxcount: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/MeshtasticProtobufs/Sources/meshtastic/portnums.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/portnums.pb.swift index cac96bc4..3b0efa08 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/portnums.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/portnums.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/portnums.proto @@ -8,6 +7,7 @@ // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ +import Foundation import SwiftProtobuf // If the compiler emits an error on this type, it is because this file @@ -33,7 +33,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// Note: This was formerly a Type enum named 'typ' with the same id # /// We have change to this 'portnum' based scheme for specifying app handlers for particular payloads. /// This change is backwards compatible by treating the legacy OPAQUE/CLEAR_TEXT values identically. -public enum PortNum: SwiftProtobuf.Enum, Swift.CaseIterable { +public enum PortNum: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -290,6 +290,11 @@ public enum PortNum: SwiftProtobuf.Enum, Swift.CaseIterable { } } +} + +#if swift(>=4.2) + +extension PortNum: CaseIterable { // The compiler won't synthesize support with the UNRECOGNIZED case. public static let allCases: [PortNum] = [ .unknownApp, @@ -323,9 +328,14 @@ public enum PortNum: SwiftProtobuf.Enum, Swift.CaseIterable { .atakForwarder, .max, ] - } +#endif // swift(>=4.2) + +#if swift(>=5.5) && canImport(_Concurrency) +extension PortNum: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. extension PortNum: SwiftProtobuf._ProtoNameProviding { diff --git a/MeshtasticProtobufs/Sources/meshtastic/powermon.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/powermon.pb.swift index 58c21701..5f51e948 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/powermon.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/powermon.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/powermon.proto @@ -8,6 +7,7 @@ // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ +import Foundation import SwiftProtobuf // If the compiler emits an error on this type, it is because this file @@ -22,7 +22,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// Note: There are no 'PowerMon' messages normally in use (PowerMons are sent only as structured logs - slogs). ///But we wrap our State enum in this message to effectively nest a namespace (without our linter yelling at us) -public struct PowerMon: Sendable { +public struct PowerMon { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -31,7 +31,7 @@ public struct PowerMon: Sendable { /// Any significant power changing event in meshtastic should be tagged with a powermon state transition. ///If you are making new meshtastic features feel free to add new entries at the end of this definition. - public enum State: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum State: SwiftProtobuf.Enum { public typealias RawValue = Int case none // = 0 case cpuDeepSleep // = 1 @@ -104,31 +104,37 @@ public struct PowerMon: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [PowerMon.State] = [ - .none, - .cpuDeepSleep, - .cpuLightSleep, - .vext1On, - .loraRxon, - .loraTxon, - .loraRxactive, - .btOn, - .ledOn, - .screenOn, - .screenDrawing, - .wifiOn, - .gpsActive, - ] - } public init() {} } +#if swift(>=4.2) + +extension PowerMon.State: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [PowerMon.State] = [ + .none, + .cpuDeepSleep, + .cpuLightSleep, + .vext1On, + .loraRxon, + .loraTxon, + .loraRxactive, + .btOn, + .ledOn, + .screenOn, + .screenDrawing, + .wifiOn, + .gpsActive, + ] +} + +#endif // swift(>=4.2) + /// /// PowerStress testing support via the C++ PowerStress module -public struct PowerStressMessage: Sendable { +public struct PowerStressMessage { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -145,7 +151,7 @@ public struct PowerStressMessage: Sendable { /// What operation would we like the UUT to perform. ///note: senders should probably set want_response in their request packets, so that they can know when the state ///machine has started processing their request - public enum Opcode: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum Opcode: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -266,35 +272,48 @@ public struct PowerStressMessage: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [PowerStressMessage.Opcode] = [ - .unset, - .printInfo, - .forceQuiet, - .endQuiet, - .screenOn, - .screenOff, - .cpuIdle, - .cpuDeepsleep, - .cpuFullon, - .ledOn, - .ledOff, - .loraOff, - .loraTx, - .loraRx, - .btOff, - .btOn, - .wifiOff, - .wifiOn, - .gpsOff, - .gpsOn, - ] - } public init() {} } +#if swift(>=4.2) + +extension PowerStressMessage.Opcode: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [PowerStressMessage.Opcode] = [ + .unset, + .printInfo, + .forceQuiet, + .endQuiet, + .screenOn, + .screenOff, + .cpuIdle, + .cpuDeepsleep, + .cpuFullon, + .ledOn, + .ledOff, + .loraOff, + .loraTx, + .loraRx, + .btOff, + .btOn, + .wifiOff, + .wifiOn, + .gpsOff, + .gpsOn, + ] +} + +#endif // swift(>=4.2) + +#if swift(>=5.5) && canImport(_Concurrency) +extension PowerMon: @unchecked Sendable {} +extension PowerMon.State: @unchecked Sendable {} +extension PowerStressMessage: @unchecked Sendable {} +extension PowerStressMessage.Opcode: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" @@ -304,8 +323,8 @@ extension PowerMon: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationB public static let _protobuf_nameMap = SwiftProtobuf._NameMap() public mutating func decodeMessage(decoder: inout D) throws { - // Load everything into unknown fields - while try decoder.nextFieldNumber() != nil {} + while let _ = try decoder.nextFieldNumber() { + } } public func traverse(visitor: inout V) throws { @@ -360,7 +379,7 @@ extension PowerStressMessage: SwiftProtobuf.Message, SwiftProtobuf._MessageImple if self.cmd != .unset { try visitor.visitSingularEnumField(value: self.cmd, fieldNumber: 1) } - if self.numSeconds.bitPattern != 0 { + if self.numSeconds != 0 { try visitor.visitSingularFloatField(value: self.numSeconds, fieldNumber: 2) } try unknownFields.traverse(visitor: &visitor) diff --git a/MeshtasticProtobufs/Sources/meshtastic/remote_hardware.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/remote_hardware.pb.swift index d23dc07b..ac6eeb26 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/remote_hardware.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/remote_hardware.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/remote_hardware.proto @@ -8,6 +7,7 @@ // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ +import Foundation import SwiftProtobuf // If the compiler emits an error on this type, it is because this file @@ -30,7 +30,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// because no security yet (beyond the channel mechanism). /// It should be off by default and then protected based on some TBD mechanism /// (a special channel once multichannel support is included?) -public struct HardwareMessage: Sendable { +public struct HardwareMessage { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -52,7 +52,7 @@ public struct HardwareMessage: Sendable { /// /// TODO: REPLACE - public enum TypeEnum: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum TypeEnum: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -110,21 +110,32 @@ public struct HardwareMessage: Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [HardwareMessage.TypeEnum] = [ - .unset, - .writeGpios, - .watchGpios, - .gpiosChanged, - .readGpios, - .readGpiosReply, - ] - } public init() {} } +#if swift(>=4.2) + +extension HardwareMessage.TypeEnum: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [HardwareMessage.TypeEnum] = [ + .unset, + .writeGpios, + .watchGpios, + .gpiosChanged, + .readGpios, + .readGpiosReply, + ] +} + +#endif // swift(>=4.2) + +#if swift(>=5.5) && canImport(_Concurrency) +extension HardwareMessage: @unchecked Sendable {} +extension HardwareMessage.TypeEnum: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/MeshtasticProtobufs/Sources/meshtastic/rtttl.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/rtttl.pb.swift index 38d0c880..6fdf3208 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/rtttl.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/rtttl.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/rtttl.proto @@ -8,6 +7,7 @@ // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ +import Foundation import SwiftProtobuf // If the compiler emits an error on this type, it is because this file @@ -22,7 +22,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// /// Canned message module configuration. -public struct RTTTLConfig: Sendable { +public struct RTTTLConfig { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -36,6 +36,10 @@ public struct RTTTLConfig: Sendable { public init() {} } +#if swift(>=5.5) && canImport(_Concurrency) +extension RTTTLConfig: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/MeshtasticProtobufs/Sources/meshtastic/storeforward.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/storeforward.pb.swift index deb96569..54efa77b 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/storeforward.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/storeforward.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/storeforward.proto @@ -23,7 +22,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// /// TODO: REPLACE -public struct StoreAndForward: @unchecked Sendable { +public struct StoreAndForward { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -80,7 +79,7 @@ public struct StoreAndForward: @unchecked Sendable { /// /// TODO: REPLACE - public enum OneOf_Variant: Equatable, @unchecked Sendable { + public enum OneOf_Variant: Equatable { /// /// TODO: REPLACE case stats(StoreAndForward.Statistics) @@ -94,12 +93,38 @@ public struct StoreAndForward: @unchecked Sendable { /// Text from history message. case text(Data) + #if !swift(>=4.1) + public static func ==(lhs: StoreAndForward.OneOf_Variant, rhs: StoreAndForward.OneOf_Variant) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.stats, .stats): return { + guard case .stats(let l) = lhs, case .stats(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.history, .history): return { + guard case .history(let l) = lhs, case .history(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.heartbeat, .heartbeat): return { + guard case .heartbeat(let l) = lhs, case .heartbeat(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.text, .text): return { + guard case .text(let l) = lhs, case .text(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif } /// /// 001 - 063 = From Router /// 064 - 127 = From Client - public enum RequestResponse: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum RequestResponse: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -217,31 +242,11 @@ public struct StoreAndForward: @unchecked Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [StoreAndForward.RequestResponse] = [ - .unset, - .routerError, - .routerHeartbeat, - .routerPing, - .routerPong, - .routerBusy, - .routerHistory, - .routerStats, - .routerTextDirect, - .routerTextBroadcast, - .clientError, - .clientHistory, - .clientStats, - .clientPing, - .clientPong, - .clientAbort, - ] - } /// /// TODO: REPLACE - public struct Statistics: Sendable { + public struct Statistics { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -289,7 +294,7 @@ public struct StoreAndForward: @unchecked Sendable { /// /// TODO: REPLACE - public struct History: Sendable { + public struct History { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -314,7 +319,7 @@ public struct StoreAndForward: @unchecked Sendable { /// /// TODO: REPLACE - public struct Heartbeat: Sendable { + public struct Heartbeat { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -335,6 +340,41 @@ public struct StoreAndForward: @unchecked Sendable { public init() {} } +#if swift(>=4.2) + +extension StoreAndForward.RequestResponse: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [StoreAndForward.RequestResponse] = [ + .unset, + .routerError, + .routerHeartbeat, + .routerPing, + .routerPong, + .routerBusy, + .routerHistory, + .routerStats, + .routerTextDirect, + .routerTextBroadcast, + .clientError, + .clientHistory, + .clientStats, + .clientPing, + .clientPong, + .clientAbort, + ] +} + +#endif // swift(>=4.2) + +#if swift(>=5.5) && canImport(_Concurrency) +extension StoreAndForward: @unchecked Sendable {} +extension StoreAndForward.OneOf_Variant: @unchecked Sendable {} +extension StoreAndForward.RequestResponse: @unchecked Sendable {} +extension StoreAndForward.Statistics: @unchecked Sendable {} +extension StoreAndForward.History: @unchecked Sendable {} +extension StoreAndForward.Heartbeat: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/MeshtasticProtobufs/Sources/meshtastic/telemetry.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/telemetry.pb.swift index 4cd8e939..da282fe2 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/telemetry.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/telemetry.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/telemetry.proto @@ -8,6 +7,7 @@ // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ +import Foundation import SwiftProtobuf // If the compiler emits an error on this type, it is because this file @@ -22,7 +22,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP /// /// Supported I2C Sensors for telemetry in Meshtastic -public enum TelemetrySensorType: SwiftProtobuf.Enum, Swift.CaseIterable { +public enum TelemetrySensorType: SwiftProtobuf.Enum { public typealias RawValue = Int /// @@ -270,6 +270,11 @@ public enum TelemetrySensorType: SwiftProtobuf.Enum, Swift.CaseIterable { } } +} + +#if swift(>=4.2) + +extension TelemetrySensorType: CaseIterable { // The compiler won't synthesize support with the UNRECOGNIZED case. public static let allCases: [TelemetrySensorType] = [ .sensorUnset, @@ -311,12 +316,13 @@ public enum TelemetrySensorType: SwiftProtobuf.Enum, Swift.CaseIterable { .dps310, .rak12035, ] - } +#endif // swift(>=4.2) + /// /// Key native device metrics such as battery level -public struct DeviceMetrics: Sendable { +public struct DeviceMetrics { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -389,7 +395,7 @@ public struct DeviceMetrics: Sendable { /// /// Weather station or other environmental metrics -public struct EnvironmentMetrics: @unchecked Sendable { +public struct EnvironmentMetrics { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -647,7 +653,7 @@ public struct EnvironmentMetrics: @unchecked Sendable { /// /// Power Metrics (voltage / current / etc) -public struct PowerMetrics: Sendable { +public struct PowerMetrics { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -732,7 +738,7 @@ public struct PowerMetrics: Sendable { /// /// Air quality metrics -public struct AirQualityMetrics: Sendable { +public struct AirQualityMetrics { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -870,7 +876,7 @@ public struct AirQualityMetrics: Sendable { public mutating func clearParticles100Um() {self._particles100Um = nil} /// - /// 10.0um Particle Count + /// CO2 concentration in ppm public var co2: UInt32 { get {return _co2 ?? 0} set {_co2 = newValue} @@ -901,7 +907,7 @@ public struct AirQualityMetrics: Sendable { /// /// Local device mesh statistics -public struct LocalStats: Sendable { +public struct LocalStats { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -959,7 +965,7 @@ public struct LocalStats: Sendable { /// /// Health telemetry metrics -public struct HealthMetrics: Sendable { +public struct HealthMetrics { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1008,7 +1014,7 @@ public struct HealthMetrics: Sendable { /// /// Types of Measurements the telemetry module is equipped to handle -public struct Telemetry: Sendable { +public struct Telemetry { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1081,7 +1087,7 @@ public struct Telemetry: Sendable { public var unknownFields = SwiftProtobuf.UnknownStorage() - public enum OneOf_Variant: Equatable, Sendable { + public enum OneOf_Variant: Equatable { /// /// Key native device metrics such as battery level case deviceMetrics(DeviceMetrics) @@ -1101,6 +1107,40 @@ public struct Telemetry: Sendable { /// Health telemetry metrics case healthMetrics(HealthMetrics) + #if !swift(>=4.1) + public static func ==(lhs: Telemetry.OneOf_Variant, rhs: Telemetry.OneOf_Variant) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.deviceMetrics, .deviceMetrics): return { + guard case .deviceMetrics(let l) = lhs, case .deviceMetrics(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.environmentMetrics, .environmentMetrics): return { + guard case .environmentMetrics(let l) = lhs, case .environmentMetrics(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.airQualityMetrics, .airQualityMetrics): return { + guard case .airQualityMetrics(let l) = lhs, case .airQualityMetrics(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.powerMetrics, .powerMetrics): return { + guard case .powerMetrics(let l) = lhs, case .powerMetrics(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.localStats, .localStats): return { + guard case .localStats(let l) = lhs, case .localStats(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.healthMetrics, .healthMetrics): return { + guard case .healthMetrics(let l) = lhs, case .healthMetrics(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif } public init() {} @@ -1108,7 +1148,7 @@ public struct Telemetry: Sendable { /// /// NAU7802 Telemetry configuration, for saving to flash -public struct Nau7802Config: Sendable { +public struct Nau7802Config { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -1126,6 +1166,19 @@ public struct Nau7802Config: Sendable { public init() {} } +#if swift(>=5.5) && canImport(_Concurrency) +extension TelemetrySensorType: @unchecked Sendable {} +extension DeviceMetrics: @unchecked Sendable {} +extension EnvironmentMetrics: @unchecked Sendable {} +extension PowerMetrics: @unchecked Sendable {} +extension AirQualityMetrics: @unchecked Sendable {} +extension LocalStats: @unchecked Sendable {} +extension HealthMetrics: @unchecked Sendable {} +extension Telemetry: @unchecked Sendable {} +extension Telemetry.OneOf_Variant: @unchecked Sendable {} +extension Nau7802Config: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" @@ -1693,10 +1746,10 @@ extension LocalStats: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementatio if self.uptimeSeconds != 0 { try visitor.visitSingularUInt32Field(value: self.uptimeSeconds, fieldNumber: 1) } - if self.channelUtilization.bitPattern != 0 { + if self.channelUtilization != 0 { try visitor.visitSingularFloatField(value: self.channelUtilization, fieldNumber: 2) } - if self.airUtilTx.bitPattern != 0 { + if self.airUtilTx != 0 { try visitor.visitSingularFloatField(value: self.airUtilTx, fieldNumber: 3) } if self.numPacketsTx != 0 { @@ -1963,7 +2016,7 @@ extension Nau7802Config: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa if self.zeroOffset != 0 { try visitor.visitSingularInt32Field(value: self.zeroOffset, fieldNumber: 1) } - if self.calibrationFactor.bitPattern != 0 { + if self.calibrationFactor != 0 { try visitor.visitSingularFloatField(value: self.calibrationFactor, fieldNumber: 2) } try unknownFields.traverse(visitor: &visitor) diff --git a/MeshtasticProtobufs/Sources/meshtastic/xmodem.pb.swift b/MeshtasticProtobufs/Sources/meshtastic/xmodem.pb.swift index 46907a58..1f41fe0b 100644 --- a/MeshtasticProtobufs/Sources/meshtastic/xmodem.pb.swift +++ b/MeshtasticProtobufs/Sources/meshtastic/xmodem.pb.swift @@ -1,6 +1,5 @@ // DO NOT EDIT. // swift-format-ignore-file -// swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. // Source: meshtastic/xmodem.proto @@ -21,7 +20,7 @@ fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAP typealias Version = _2 } -public struct XModem: @unchecked Sendable { +public struct XModem { // SwiftProtobuf.Message conformance is added in an extension below. See the // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. @@ -36,7 +35,7 @@ public struct XModem: @unchecked Sendable { public var unknownFields = SwiftProtobuf.UnknownStorage() - public enum Control: SwiftProtobuf.Enum, Swift.CaseIterable { + public enum Control: SwiftProtobuf.Enum { public typealias RawValue = Int case nul // = 0 case soh // = 1 @@ -80,23 +79,34 @@ public struct XModem: @unchecked Sendable { } } - // The compiler won't synthesize support with the UNRECOGNIZED case. - public static let allCases: [XModem.Control] = [ - .nul, - .soh, - .stx, - .eot, - .ack, - .nak, - .can, - .ctrlz, - ] - } public init() {} } +#if swift(>=4.2) + +extension XModem.Control: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + public static let allCases: [XModem.Control] = [ + .nul, + .soh, + .stx, + .eot, + .ack, + .nak, + .can, + .ctrlz, + ] +} + +#endif // swift(>=4.2) + +#if swift(>=5.5) && canImport(_Concurrency) +extension XModem: @unchecked Sendable {} +extension XModem.Control: @unchecked Sendable {} +#endif // swift(>=5.5) && canImport(_Concurrency) + // MARK: - Code below here is support for the SwiftProtobuf runtime. fileprivate let _protobuf_package = "meshtastic" diff --git a/protobufs b/protobufs index 06864665..27fac391 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 068646653e8375fc145988026ad242a3cf70f7ab +Subproject commit 27fac39141d99fe727a0a1824c5397409b1aea75 From 0f7ac9bc59bc3346091e569df7975bc71dcec7b3 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sat, 3 May 2025 08:58:33 -0700 Subject: [PATCH 62/93] Translation key updates --- Localizable.xcstrings | 785 +++++++----------- Meshtastic/Enums/LoraConfigEnums.swift | 4 +- Meshtastic/Export/WriteCsvFile.swift | 10 +- Meshtastic/Extensions/Date.swift | 4 +- Meshtastic/Views/ContentView.swift | 2 +- Meshtastic/Views/Helpers/DateTimeText.swift | 2 +- .../TextMessageField/TextMessageField.swift | 2 +- Meshtastic/Views/Nodes/DeviceMetricsLog.swift | 4 +- .../EnvironmentDefaultColumns.swift | 2 +- .../Views/Nodes/Helpers/NodeDetail.swift | 2 +- .../Views/Nodes/Helpers/NodeListItem.swift | 2 +- Meshtastic/Views/Nodes/PaxCounterLog.swift | 4 +- Meshtastic/Views/Nodes/PositionLog.swift | 4 +- Meshtastic/Views/Nodes/PowerMetricsLog.swift | 4 +- Meshtastic/Views/Settings/AppLog.swift | 4 +- .../Views/Settings/Config/DisplayConfig.swift | 2 +- .../Config/Module/PaxCounterConfig.swift | 2 +- .../Views/Settings/Config/PowerConfig.swift | 2 +- .../Views/Settings/Logs/LogDetail.swift | 2 +- Meshtastic/Views/Settings/Settings.swift | 8 +- 20 files changed, 321 insertions(+), 530 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index e233c048..7c5569dd 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -2226,6 +2226,52 @@ } } }, + "After" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Nach" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "After" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Dopo" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "After" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Efter" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Након" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "之後" + } + } + } + }, "Airtime" : { "localizations" : { "de" : { @@ -5674,122 +5720,6 @@ } } }, - "config.module.paxcounter.enabled.description" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quando è abilitato, il modulo PAX Counter conta il numero di persone che passano utilizzando il WiFi e il Bluetooth. Per il funzionamento del contatore PAX, sia il WiFI che il Bluetooth devono essere disattivati." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "När aktiverad räknar PAX-räknarmodulen antalet personer som passerar med WiFi och Bluetooth. Både WiFi och Bluetooth måste vara aktiverade för att PAX-räknaren ska fungera." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Када је омогућен, модул бројача пролазника броји број људи који пролазе користећи ВајФај и Блутут. И ВајФај и Блутут морају бити онемогућени да би бројач пролазника радио." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "启用 PAX 计数器模块时,通过使用 WiFi 和蓝牙来计算经过的人数。为了使 PAX 计数器正常工作,必须将 WiFi 和蓝牙都禁用。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "啟用後,人流計數器模組將透過 WiFi 和藍牙計算經過的人數。必須停用 WiFi 和藍牙才能讓 PAX 計數器正常工作。" - } - } - } - }, - "config.module.paxcounter.settings" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contatore PAX" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Räknare" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Бројач пролазника" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX 计数器" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX 計數器" - } - } - } - }, "config.module.paxcounter.title" : { "localizations" : { "de" : { @@ -6178,58 +6108,6 @@ } } }, - "config.power.shutdown.after.secs" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nach" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "After" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "After" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dopo" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "After" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Efter" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Након" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "之後" - } - } - } - }, "config.power.shutdown.on.power.loss" : { "localizations" : { "de" : { @@ -10588,6 +10466,58 @@ } } }, + "Display Config" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Configuration de l'écran" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הגדרות צג" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Configurazione del display" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Konfiguracja Wyświetlacza" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Skärmkonfiguration" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Подешавања приказа" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "屏幕配置" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "螢幕設定" + } + } + } + }, "Display Fahrenheit" : { "localizations" : { "it" : { @@ -10672,64 +10602,6 @@ } } }, - "display.config" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Display Config" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration de l'écran" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות צג" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione del display" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguracja Wyświetlacza" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Skärmkonfiguration" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подешавања приказа" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "屏幕配置" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "螢幕設定" - } - } - } - }, "Distance" : { "localizations" : { "de" : { @@ -11000,7 +10872,7 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "回声" } }, @@ -11760,21 +11632,15 @@ }, "European Union 433MHz" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "European Union 433MHz" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Unione Europea 433MHz" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Европска унија 433MHz" } }, @@ -11788,21 +11654,15 @@ }, "European Union 868MHz" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "European Union 868MHz" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Unione Europea 868MHz" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Европска унија 868MHz" } }, @@ -18420,70 +18280,6 @@ } } }, - "log.message" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nachricht" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messaggio" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Порука" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message" - } - } - } - }, "log.process" : { "localizations" : { "de" : { @@ -18796,6 +18592,28 @@ } } }, + "Lomg Range - Fast" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "A lungo raggio - Veloce" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Дугачки домет - Брзо" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Long Range - Fast" + } + } + } + }, "Long Name" : { "localizations" : { "de" : { @@ -18892,30 +18710,24 @@ } } }, - "long.range.fast" : { + "Long Range - Slow" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Long Range - Fast" - } - }, "it" : { "stringUnit" : { - "state" : "translated", - "value" : "A lungo raggio - Veloce" + "state" : "needs_review", + "value" : "Lungo raggio - Lento" } }, "sr" : { "stringUnit" : { - "state" : "translated", - "value" : "Дугачки домет - Брзо" + "state" : "needs_review", + "value" : "Дугачки домет - Споро" } }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Long Range - Fast" + "value" : "Long Range - Slow" } } } @@ -18948,34 +18760,6 @@ } } }, - "long.range.slow" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Long Range - Slow" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lungo raggio - Lento" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Дугачки домет - Споро" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Long Range - Slow" - } - } - } - }, "Longitude" : { "localizations" : { "de" : { @@ -22352,70 +22136,6 @@ } } }, - "message" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nachricht" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הודעה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messaggio" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wiadomość" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Meddelande" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Порука" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "消息" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "訊息" - } - } - } - }, "Message" : { "localizations" : { "de" : { @@ -22846,7 +22566,7 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "模式" } }, @@ -25258,13 +24978,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "密码" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "密碼" } } @@ -25334,6 +25054,58 @@ } } }, + "PAX Counter" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "PAX Counter" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "PAX Counter" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Contatore PAX" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "PAX Counter" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "PAX Räknare" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Бројач пролазника" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX 计数器" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX 計數器" + } + } + } + }, "paxcounter.ble" : { "localizations" : { "en" : { @@ -26326,13 +26098,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "电源" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "休眠" } } @@ -28297,52 +28069,49 @@ } }, "ringtone" : { + + }, + "Ringtone" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Klingelton" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringtone" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Sonnerie" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "רינגטון" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Suoneria" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Dzwonek" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Ringsignal" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Мелодија звона" } }, @@ -31462,53 +31231,47 @@ } } }, - "serial" : { + "Serial" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Serial" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Serial" } }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Série" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "סיריאלי" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Seriale" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Seryjny" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Serie" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Серијска веза" } }, @@ -32130,49 +31893,43 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Einstellungen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Settings" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Réglages" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "הגדרות" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Impostazioni" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Ustawienia" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Inställningar" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Подешавања" } }, @@ -36736,53 +36493,47 @@ } } }, - "unknown.age" : { + "Unknown Age" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Unbekanntes alter" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unknown Age" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Age inconnu" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "גיל לא ידוע" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Età sconosciuta" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nieznany wiek" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Okänd ålder" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Непозната старост" } }, @@ -37304,53 +37055,47 @@ } } }, - "user" : { + "User" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Benutzer" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "User" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Utilisateur" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "משתמש" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Utente" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Użytkownik" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Användare" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Корисник" } }, @@ -37886,49 +37631,43 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Warte..." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Waiting. . ." - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "En attente . . ." } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "ממתין. . ." } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "In attesa. . ." } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Czekam. . ." } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Väntar..." } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Чекам. . ." } }, @@ -38214,6 +37953,58 @@ } } }, + "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Quando è abilitato, il modulo PAX Counter conta il numero di persone che passano utilizzando il WiFi e il Bluetooth. Per il funzionamento del contatore PAX, sia il WiFI che il Bluetooth devono essere disattivati." + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "När aktiverad räknar PAX-räknarmodulen antalet personer som passerar med WiFi och Bluetooth. Både WiFi och Bluetooth måste vara aktiverade för att PAX-räknaren ska fungera." + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Када је омогућен, модул бројача пролазника броји број људи који пролазе користећи ВајФај и Блутут. И ВајФај и Блутут морају бити онемогућени да би бројач пролазника радио." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用 PAX 计数器模块时,通过使用 WiFi 和蓝牙来计算经过的人数。为了使 PAX 计数器正常工作,必须将 WiFi 和蓝牙都禁用。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用後,人流計數器模組將透過 WiFi 和藍牙計算經過的人數。必須停用 WiFi 和藍牙才能讓 PAX 計數器正常工作。" + } + } + } + }, "When using in GPIO mode, keep the output on for this long. " : { "localizations" : { "it" : { diff --git a/Meshtastic/Enums/LoraConfigEnums.swift b/Meshtastic/Enums/LoraConfigEnums.swift index e6cd4dae..55837dd3 100644 --- a/Meshtastic/Enums/LoraConfigEnums.swift +++ b/Meshtastic/Enums/LoraConfigEnums.swift @@ -291,9 +291,9 @@ enum ModemPresets: Int, CaseIterable, Identifiable { var description: String { switch self { case .longFast: - return "long.range.fast".localized + return "Lomg Range - Fast".localized case .longSlow: - return "long.range.slow".localized + return "Long Range - Slow".localized case .longModerate: return "long.range.moderate".localized case .vLongSlow: diff --git a/Meshtastic/Export/WriteCsvFile.swift b/Meshtastic/Export/WriteCsvFile.swift index af3472b2..badc6f9b 100644 --- a/Meshtastic/Export/WriteCsvFile.swift +++ b/Meshtastic/Export/WriteCsvFile.swift @@ -27,7 +27,7 @@ func telemetryToCsvFile(telemetry: [TelemetryEntity], metricsType: Int) -> Strin csvString += ", " csvString += dm.uptimeSeconds?.formatted(.number.grouping(.never)) ?? "" csvString += ", " - csvString += dm.time?.formattedDate(format: dateFormatString) ?? "unknown.age".localized + csvString += dm.time?.formattedDate(format: dateFormatString) ?? "Unknown Age".localized } } else if metricsType == 1 { // Create Environment Telemetry Header @@ -44,7 +44,7 @@ func telemetryToCsvFile(telemetry: [TelemetryEntity], metricsType: Int) -> Strin csvString += ", " csvString += dm.gasResistance?.formatted(.number.grouping(.never)) ?? "" csvString += ", " - csvString += dm.time?.formattedDate(format: dateFormatString) ?? "unknown.age".localized + csvString += dm.time?.formattedDate(format: dateFormatString) ?? "Unknown Age".localized } } else if metricsType == 2 { // Create Power Metrics Header @@ -63,7 +63,7 @@ func telemetryToCsvFile(telemetry: [TelemetryEntity], metricsType: Int) -> Strin csvString += ", " csvString += dm.powerCh3Current?.formatted(.number.grouping(.never)) ?? "" csvString += ", " - csvString += dm.time?.formattedDate(format: dateFormatString) ?? "unknown.age".localized + csvString += dm.time?.formattedDate(format: dateFormatString) ?? "Unknown Age".localized } } return csvString @@ -121,7 +121,7 @@ func paxToCsvFile(pax: [PaxCounterEntity]) -> String { csvString += ", " csvString += String(p.uptime) csvString += ", " - csvString += p.time?.formattedDate(format: dateFormatString) ?? "unknown.age".localized + csvString += p.time?.formattedDate(format: dateFormatString) ?? "Unknown Age".localized } return csvString } @@ -150,7 +150,7 @@ func positionToCsvFile(positions: [PositionEntity]) -> String { csvString += ", " csvString += String(pos.snr) csvString += ", " - csvString += pos.time?.formattedDate(format: dateFormatString) ?? "unknown.age".localized + csvString += pos.time?.formattedDate(format: dateFormatString) ?? "Unknown Age".localized } return csvString } diff --git a/Meshtastic/Extensions/Date.swift b/Meshtastic/Extensions/Date.swift index d8cdd30f..25bf034d 100644 --- a/Meshtastic/Extensions/Date.swift +++ b/Meshtastic/Extensions/Date.swift @@ -13,7 +13,7 @@ extension Date { if self.timeIntervalSince1970 > 0 && self < Calendar.current.date(byAdding: .year, value: 1, to: Date())! { formatted() } else { - "unknown.age".localized + "Unknown Age".localized } } @@ -23,7 +23,7 @@ extension Date { if self.timeIntervalSince1970 > 0 && self < Calendar.current.date(byAdding: .year, value: 1, to: Date())! { return dateformat.string(from: self) } else { - return "unknown.age".localized + return "Unknown Age".localized } } func relativeTimeOfDay() -> String { diff --git a/Meshtastic/Views/ContentView.swift b/Meshtastic/Views/ContentView.swift index 692b1749..1c8a395d 100644 --- a/Meshtastic/Views/ContentView.swift +++ b/Meshtastic/Views/ContentView.swift @@ -25,7 +25,7 @@ struct ContentView: View { unreadDirectMessages: $appState.unreadDirectMessages ) .tabItem { - Label("messages", systemImage: "message") + Label("Messages", systemImage: "message") } .tag(NavigationState.Tab.messages) .badge(appState.totalUnreadMessages) diff --git a/Meshtastic/Views/Helpers/DateTimeText.swift b/Meshtastic/Views/Helpers/DateTimeText.swift index 517772fe..38e386f3 100644 --- a/Meshtastic/Views/Helpers/DateTimeText.swift +++ b/Meshtastic/Views/Helpers/DateTimeText.swift @@ -24,7 +24,7 @@ struct DateTimeText: View { if dateTime != nil && dateTime! >= sixMonthsAgo! { Text(" \(dateTime!.formattedDate(format: dateFormatString))") } else { - Text("unknown.age") + Text("Unknown Age") } } } diff --git a/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift b/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift index c8def69b..180ec7cd 100644 --- a/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift +++ b/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift @@ -29,7 +29,7 @@ struct TextMessageField: View { HStack(alignment: .top) { ZStack { - TextField("message", text: $typingMessage, axis: .vertical) + TextField("Message", text: $typingMessage, axis: .vertical) .onChange(of: typingMessage) { _, value in totalBytes = value.utf8.count // Only mess with the value if it is too big diff --git a/Meshtastic/Views/Nodes/DeviceMetricsLog.swift b/Meshtastic/Views/Nodes/DeviceMetricsLog.swift index 6b2570d2..0d739c49 100644 --- a/Meshtastic/Views/Nodes/DeviceMetricsLog.swift +++ b/Meshtastic/Views/Nodes/DeviceMetricsLog.swift @@ -121,7 +121,7 @@ struct DeviceMetricsLog: View { Table(deviceMetrics, selection: $selection, sortOrder: $sortOrder) { TableColumn("Battery Level") { dm in HStack { - Text(dm.time?.formattedDate(format: dateFormatString) ?? "unknown.age".localized) + Text(dm.time?.formattedDate(format: dateFormatString) ?? "Unknown Age".localized) .font(.caption) .fontWeight(.semibold) Spacer() @@ -188,7 +188,7 @@ struct DeviceMetricsLog: View { } .width(min: 100) TableColumn("Timestamp") { dm in - Text(dm.time?.formattedDate(format: dateFormatString) ?? "unknown.age".localized) + Text(dm.time?.formattedDate(format: dateFormatString) ?? "Unknown Age".localized) } .width(min: 180) } diff --git a/Meshtastic/Views/Nodes/Helpers/Metrics Columns/EnvironmentDefaultColumns.swift b/Meshtastic/Views/Nodes/Helpers/Metrics Columns/EnvironmentDefaultColumns.swift index 42cf8663..0f14331d 100644 --- a/Meshtastic/Views/Nodes/Helpers/Metrics Columns/EnvironmentDefaultColumns.swift +++ b/Meshtastic/Views/Nodes/Helpers/Metrics Columns/EnvironmentDefaultColumns.swift @@ -333,7 +333,7 @@ extension MetricsColumnList { .replacingOccurrences(of: ",", with: "") Text( time?.formattedDate(format: dateFormatString) - ?? "unknown.age".localized + ?? "Unknown Age".localized ) }) ]) diff --git a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift index bd913d10..43cb0d5a 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift @@ -195,7 +195,7 @@ struct NodeDetail: View { Spacer() if dateFormatRelative, let text = Self.relativeFormatter.string(for: lastHeard) { - if lastHeard.formatted() != "unknown.age".localized { + if lastHeard.formatted() != "Unknown Age".localized { Text(text) .textSelection(.enabled) } diff --git a/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift b/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift index 9c7201e1..c01d86de 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift @@ -80,7 +80,7 @@ struct NodeListItem: View { if node.lastHeard?.timeIntervalSince1970 ?? 0 > 0 && node.lastHeard! < Calendar.current.date(byAdding: .year, value: 1, to: Date())! { IconAndText(systemName: node.isOnline ? "checkmark.circle.fill" : "moon.circle.fill", imageColor: node.isOnline ? .green : .orange, - text: node.lastHeard?.formatted() ?? "unknown.age".localized) + text: node.lastHeard?.formatted() ?? "Unknown Age".localized) } let role = DeviceRoles(rawValue: Int(node.user?.role ?? 0)) IconAndText(systemName: role?.systemName ?? "figure", diff --git a/Meshtastic/Views/Nodes/PaxCounterLog.swift b/Meshtastic/Views/Nodes/PaxCounterLog.swift index bcc0dd60..ff579eca 100644 --- a/Meshtastic/Views/Nodes/PaxCounterLog.swift +++ b/Meshtastic/Views/Nodes/PaxCounterLog.swift @@ -105,7 +105,7 @@ struct PaxCounterLog: View { Text(components) } TableColumn("Timestamp") { pc in - Text(pc.time?.formattedDate(format: dateFormatString) ?? "unknown.age".localized) + Text(pc.time?.formattedDate(format: dateFormatString) ?? "Unknown Age".localized) } .width(min: 180) } @@ -149,7 +149,7 @@ struct PaxCounterLog: View { let components = (now.. Date: Sat, 3 May 2025 09:51:51 -0700 Subject: [PATCH 63/93] Another key update --- Localizable.xcstrings | 228 ++++++++++++------------ Meshtastic/Enums/AppSettingsEnums.swift | 2 +- 2 files changed, 112 insertions(+), 118 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 7c5569dd..7defa649 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -2230,7 +2230,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nach" } }, @@ -2242,7 +2242,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Dopo" } }, @@ -2254,13 +2254,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Efter" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Након" } }, @@ -3530,7 +3530,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "רמת סוללה" } }, @@ -7644,7 +7644,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Standard" } }, @@ -7674,7 +7674,7 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Standard" } }, @@ -10470,37 +10470,37 @@ "localizations" : { "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Configuration de l'écran" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "הגדרות צג" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Configurazione del display" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Konfiguracja Wyświetlacza" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Skärmkonfiguration" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Подешавања приказа" } }, @@ -10836,19 +10836,19 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Écho" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "הד" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Eco" } }, @@ -10860,13 +10860,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Eko" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ехо" } }, @@ -11634,13 +11634,13 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Unione Europea 433MHz" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Европска унија 433MHz" } }, @@ -11656,13 +11656,13 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Unione Europea 868MHz" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Европска унија 868MHz" } }, @@ -18596,13 +18596,13 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "A lungo raggio - Veloce" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Дугачки домет - Брзо" } }, @@ -18714,13 +18714,13 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Lungo raggio - Lento" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Дугачки домет - Споро" } }, @@ -22524,7 +22524,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Modus" } }, @@ -22536,31 +22536,31 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "מצב" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Modalità" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Tryb" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Läge" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Мод" } }, @@ -24936,13 +24936,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Passwort" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Mot de passe" } }, @@ -24954,25 +24954,25 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Password" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Hasło" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Lösenord" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Лозинка" } }, @@ -25064,13 +25064,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "PAX Counter" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Contatore PAX" } }, @@ -25082,13 +25082,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "PAX Räknare" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Бројач пролазника" } }, @@ -26062,19 +26062,19 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Strom" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Power" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Potenza" } }, @@ -26086,13 +26086,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ström" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Снага" } }, @@ -26776,7 +26776,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "RAK Rotary Encoder Module" } }, @@ -26794,13 +26794,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "RAK Rotary Encoder-modul" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "RAK Rotary енкодер модул" } }, @@ -28075,43 +28075,43 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Klingelton" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Sonnerie" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "רינגטון" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Suoneria" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Dzwonek" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ringsignal" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Мелодија звона" } }, @@ -31241,37 +31241,37 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Série" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "סיריאלי" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Seriale" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Seryjny" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Serie" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Серијска веза" } }, @@ -31893,43 +31893,43 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Einstellungen" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Réglages" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "הגדרות" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Impostazioni" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ustawienia" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Inställningar" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Подешавања" } }, @@ -32849,7 +32849,7 @@ } } }, - "standard" : { + "Standard" : { "localizations" : { "de" : { "stringUnit" : { @@ -35313,7 +35313,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Timeout" } }, @@ -35371,7 +35371,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Timestamp" } }, @@ -36497,43 +36497,43 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Unbekanntes alter" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Age inconnu" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "גיל לא ידוע" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Età sconosciuta" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nieznany wiek" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Okänd ålder" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Непозната старост" } }, @@ -36555,43 +36555,43 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Unset" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Désactivé" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "לא נקבע" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Non impostato" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nieustawiony" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Återställ" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Уклони" } }, @@ -36891,37 +36891,31 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Uptime" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Uptime" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Tempo di attività" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Drifttid" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Време рада" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "已開機時間" } } @@ -37059,43 +37053,43 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Benutzer" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Utilisateur" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "משתמש" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Utente" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Użytkownik" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Användare" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Корисник" } }, @@ -37557,7 +37551,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Voltage" } }, @@ -37631,43 +37625,43 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Warte..." } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "En attente . . ." } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "ממתין. . ." } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "In attesa. . ." } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Czekam. . ." } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Väntar..." } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Чекам. . ." } }, @@ -37963,13 +37957,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Quando è abilitato, il modulo PAX Counter conta il numero di persone che passano utilizzando il WiFi e il Bluetooth. Per il funzionamento del contatore PAX, sia il WiFI che il Bluetooth devono essere disattivati." } }, @@ -37981,13 +37975,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "När aktiverad räknar PAX-räknarmodulen antalet personer som passerar med WiFi och Bluetooth. Både WiFi och Bluetooth måste vara aktiverade för att PAX-räknaren ska fungera." } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Када је омогућен, модул бројача пролазника броји број људи који пролазе користећи ВајФај и Блутут. И ВајФај и Блутут морају бити онемогућени да би бројач пролазника радио." } }, diff --git a/Meshtastic/Enums/AppSettingsEnums.swift b/Meshtastic/Enums/AppSettingsEnums.swift index b12a10a6..0d84269a 100644 --- a/Meshtastic/Enums/AppSettingsEnums.swift +++ b/Meshtastic/Enums/AppSettingsEnums.swift @@ -19,7 +19,7 @@ enum MeshMapTypes: Int, CaseIterable, Identifiable { var description: String { switch self { case .standard: - return "standard".localized + return "Standard".localized case .mutedStandard: return "standard.muted".localized case .hybrid: From 8e8123354a3fc82b63daebb4e79efde4807aab22 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sat, 3 May 2025 09:58:38 -0700 Subject: [PATCH 64/93] change sensor metrics label to environement metrics --- Localizable.xcstrings | 4 ++-- Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 7defa649..843bfbe1 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -14398,7 +14398,7 @@ } } }, - "How often sensor metrics are sent out over the mesh. Default is 30 minutes." : { + "How often environment metrics are sent out over the mesh. Default is 30 minutes." : { "localizations" : { "it" : { "stringUnit" : { @@ -31075,7 +31075,7 @@ } } }, - "Sensor Metrics" : { + "Environment Metrics" : { "localizations" : { "it" : { "stringUnit" : { diff --git a/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift b/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift index 6d78316c..3f7f0dcf 100644 --- a/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift @@ -46,7 +46,7 @@ struct TelemetryConfig: View { .foregroundColor(.gray) .font(.callout) .listRowSeparator(.visible) - Picker("Sensor Metrics", selection: $environmentUpdateInterval ) { + Picker("Environment Metrics", selection: $environmentUpdateInterval ) { ForEach(UpdateIntervals.allCases) { ui in if ui.rawValue >= 900 { Text(ui.description) @@ -55,7 +55,7 @@ struct TelemetryConfig: View { } .pickerStyle(DefaultPickerStyle()) .listRowSeparator(.hidden) - Text("How often sensor metrics are sent out over the mesh. Default is 30 minutes.") + Text("How often environment metrics are sent out over the mesh. Default is 30 minutes.") .foregroundColor(.gray) .font(.callout) } From 470abdb82838b8b818bf9d7a3749c78ea4c950e3 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sat, 3 May 2025 10:01:02 -0700 Subject: [PATCH 65/93] Fix typo --- Localizable.xcstrings | 2 +- Meshtastic/Enums/LoraConfigEnums.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 843bfbe1..95f524d2 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -18592,7 +18592,7 @@ } } }, - "Lomg Range - Fast" : { + "Long Range - Fast" : { "localizations" : { "it" : { "stringUnit" : { diff --git a/Meshtastic/Enums/LoraConfigEnums.swift b/Meshtastic/Enums/LoraConfigEnums.swift index 55837dd3..479d1fe7 100644 --- a/Meshtastic/Enums/LoraConfigEnums.swift +++ b/Meshtastic/Enums/LoraConfigEnums.swift @@ -291,7 +291,7 @@ enum ModemPresets: Int, CaseIterable, Identifiable { var description: String { switch self { case .longFast: - return "Lomg Range - Fast".localized + return "Long Range - Fast".localized case .longSlow: return "Long Range - Slow".localized case .longModerate: From 2201bad31475a08ec248a3a5a64b7e7a5b55e9b2 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sat, 3 May 2025 11:42:19 -0700 Subject: [PATCH 66/93] Bump Version --- Meshtastic.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 39426e2f..bbdd3417 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -1785,7 +1785,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.6.0; + MARKETING_VERSION = 2.6.1; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; @@ -1818,7 +1818,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.6.0; + MARKETING_VERSION = 2.6.1; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; @@ -1849,7 +1849,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.6.0; + MARKETING_VERSION = 2.6.1; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient.Widgets; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1881,7 +1881,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.6.0; + MARKETING_VERSION = 2.6.1; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient.Widgets; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; From 5b64694b4f82c46f1dee5cd8027e7d2cff436e6a Mon Sep 17 00:00:00 2001 From: unojazz Date: Sat, 3 May 2025 22:54:48 -0400 Subject: [PATCH 67/93] adding missing strings for translation --- Localizable.xcstrings | 60 ++++++++++++++++++++++++++++++ Meshtastic/Enums/DeviceEnums.swift | 12 +++--- 2 files changed, 66 insertions(+), 6 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 95f524d2..3377b252 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -15040,6 +15040,26 @@ } } }, + "Ignores observed messages from foreign meshes like Local Only, but takes it step further by also ignoring messages from nodes not already in the node's known list." : { + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "忽略來自其他 Mesh 的訊息(像 Local Only 那樣),並更進一步連來自不在該節點已知清單中的節點所發出的訊息也一併忽略。" + } + } + } + }, + "Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. Only rebroadcasts message on the nodes local primary / secondary channels." : { + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "忽略來自其他 Mesh 的訊息(例如開放的或無法解密的),只會在該節點的本地主要/次要頻道上重新轉發訊息。" + } + } + } + }, "Import Route" : { "localizations" : { "it" : { @@ -24476,6 +24496,26 @@ } } }, + "Only permitted for SENSOR, TRACKER and TAK_TRACKER roles, this will inhibit all rebroadcasts, not unlike CLIENT_MUTE role." : { + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "僅允許用於 SENSOR、TRACKER 和 TAK_TRACKER 角色,啟用後會禁止所有訊息的重新廣播,效果類似於 CLIENT_MUTE 角色。" + } + } + } + }, + "Only rebroadcasts packets from the core portnums: NodeInfo, Text, Position, Telemetry, and Routing." : { + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "僅會重傳來自核心 portnum 的封包:NodeInfo、Text、Position、Telemetry 和 Routing" + } + } + } + }, "Open Settings" : { "localizations" : { "de" : { @@ -27102,6 +27142,16 @@ } } }, + "Rebroadcast any observed message, if it was on our private channel or from another mesh with the same lora params." : { + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "只要是在私人頻道上,或是來自使用相同 LoRa 參數的其他 Mesh 的訊息,都會進行重新廣播。" + } + } + } + }, "Rebroadcast Mode" : { "localizations" : { "it" : { @@ -29781,6 +29831,16 @@ } } }, + "Same as behavior as ALL but skips packet decoding and simply rebroadcasts them. Only available in Repeater role. Setting this on any other roles will result in ALL behavior." : { + "localizations" : { + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "行為與 ALL 相同,但會略過封包解碼,直接重新廣播。僅在 Repeater 角色中可用;若設定於其他角色,則會自動採用 ALL 的行為。" + } + } + } + }, "satellite" : { "localizations" : { "de" : { diff --git a/Meshtastic/Enums/DeviceEnums.swift b/Meshtastic/Enums/DeviceEnums.swift index 5eb48564..0f132b9d 100644 --- a/Meshtastic/Enums/DeviceEnums.swift +++ b/Meshtastic/Enums/DeviceEnums.swift @@ -168,17 +168,17 @@ enum RebroadcastModes: Int, CaseIterable, Identifiable { var description: String { switch self { case .all: - return "Rebroadcast any observed message, if it was on our private channel or from another mesh with the same lora params." + return "Rebroadcast any observed message, if it was on our private channel or from another mesh with the same lora params.".localized case .allSkipDecoding: - return "Same as behavior as ALL but skips packet decoding and simply rebroadcasts them. Only available in Repeater role. Setting this on any other roles will result in ALL behavior." + return "Same as behavior as ALL but skips packet decoding and simply rebroadcasts them. Only available in Repeater role. Setting this on any other roles will result in ALL behavior.".localized case .localOnly: - return "Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. Only rebroadcasts message on the nodes local primary / secondary channels." + return "Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. Only rebroadcasts message on the nodes local primary / secondary channels.".localized case .knownOnly: - return "Ignores observed messages from foreign meshes like Local Only, but takes it step further by also ignoring messages from nodes not already in the node's known list." + return "Ignores observed messages from foreign meshes like Local Only, but takes it step further by also ignoring messages from nodes not already in the node's known list.".localized case .none: - return "Only permitted for SENSOR, TRACKER and TAK_TRACKER roles, this will inhibit all rebroadcasts, not unlike CLIENT_MUTE role." + return "Only permitted for SENSOR, TRACKER and TAK_TRACKER roles, this will inhibit all rebroadcasts, not unlike CLIENT_MUTE role.".localized case .corePortnums: - return "Only rebroadcasts packets from the core portnums: NodeInfo, Text, Position, Telemetry, and Routing." + return "Only rebroadcasts packets from the core portnums: NodeInfo, Text, Position, Telemetry, and Routing.".localized } } func protoEnumValue() -> Config.DeviceConfig.RebroadcastMode { From 4b7f5d2ea679793eb38e9a59c6c15cf3f68bb352 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sat, 3 May 2025 20:46:53 -0700 Subject: [PATCH 68/93] Move MyNodeInfo assignment before save for new nodes --- Meshtastic/Persistence/UpdateCoreData.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index b2673477..d06c0219 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -227,6 +227,7 @@ func upsertNodeInfoPacket (packet: MeshPacket, context: NSManagedObjectContext) let myInfoEntity = MyInfoEntity(context: context) myInfoEntity.myNodeNum = Int64(packet.from) myInfoEntity.rebootCount = 0 + newNode.myInfo = myInfoEntity do { try context.save() Logger.data.info("💾 [NodeInfo] Saved a NodeInfo for node number: \(packet.from.toHex(), privacy: .public)") @@ -236,7 +237,6 @@ func upsertNodeInfoPacket (packet: MeshPacket, context: NSManagedObjectContext) let nsError = error as NSError Logger.data.error("💥 [MyInfoEntity] Error Inserting New Core Data: \(nsError, privacy: .public)") } - newNode.myInfo = myInfoEntity } else { // Update an existing node From 3290b35317928d6b2df66698f3419a288f2a9d8c Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Sat, 3 May 2025 23:50:10 -0700 Subject: [PATCH 69/93] Fixed conflict --- .../TextMessageField/TextMessageField.swift | 60 +++++++------------ 1 file changed, 22 insertions(+), 38 deletions(-) diff --git a/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift b/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift index a9e9c993..c642a9b7 100644 --- a/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift +++ b/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift @@ -15,54 +15,38 @@ struct TextMessageField: View { @State private var sendPositionWithMessage = false var body: some View { - #if targetEnvironment(macCatalyst) - HStack { - if destination.showAlertButton { + VStack { + #if targetEnvironment(macCatalyst) + HStack { + if destination.showAlertButton { + Spacer() + AlertButton { typingMessage += "🔔 Alert Bell! \u{7}" } + } Spacer() - AlertButton { typingMessage += "🔔 Alert Bell! \u{7}" } + RequestPositionButton(action: requestPosition) + TextMessageSize(maxbytes: Self.maxbytes, totalBytes: totalBytes).padding(.trailing) } - Spacer() - RequestPositionButton(action: requestPosition) - TextMessageSize(maxbytes: Self.maxbytes, totalBytes: totalBytes).padding(.trailing) - } - #endif + #endif - HStack(alignment: .top) { + HStack(alignment: .top) { if replyMessageId != 0 { - HStack { Button { withAnimation(.easeInOut(duration: 0.2)) { replyMessageId = 0 } isFocused = false - } label : { + } label: { Image(systemName: "x.circle.fill") } Text("Replying to a message") - } - } + } + ZStack { TextField("message", text: $typingMessage, axis: .vertical) .onChange(of: typingMessage) { _, value in totalBytes = value.utf8.count - // Only mess with the value if it is too big - while totalBytes > Self.maxbytes { - typingMessage = String(typingMessage.dropLast()) - totalBytes = typingMessage.utf8.count - } - } - } - Text("Replying to a message") - - } - } - ZStack { - TextField("message", text: $typingMessage, axis: .vertical) - .onChange(of: typingMessage) { _, value in - totalBytes = value.utf8.count - // Only mess with the value if it is too big while totalBytes > Self.maxbytes { typingMessage = String(typingMessage.dropLast()) totalBytes = typingMessage.utf8.count @@ -75,12 +59,12 @@ struct TextMessageField: View { isFocused = false } .font(.subheadline) - + if destination.showAlertButton { Spacer() AlertButton { typingMessage += "🔔 Alert Bell Character! \u{7}" } } - + Spacer() RequestPositionButton(action: requestPosition) TextMessageSize(maxbytes: Self.maxbytes, totalBytes: totalBytes) @@ -92,18 +76,18 @@ struct TextMessageField: View { .frame(minHeight: 50) .keyboardShortcut(.defaultAction) .onSubmit { -#if targetEnvironment(macCatalyst) + #if targetEnvironment(macCatalyst) sendMessage() -#endif + #endif } - + Text(typingMessage) .opacity(0) .padding(.all, 0) } .overlay(RoundedRectangle(cornerRadius: 20).stroke(.tertiary, lineWidth: 1)) .padding(.bottom, 15) - + Button(action: sendMessage) { Image(systemName: "arrow.up.circle.fill") .font(.largeTitle) @@ -111,13 +95,13 @@ struct TextMessageField: View { } } .padding(.all, 15) - + } } private func requestPosition() { let userLongName = bleManager.connectedPeripheral != nil ? bleManager.connectedPeripheral.longName : "Unknown" sendPositionWithMessage = true - typingMessage = "📍 " + userLongName + " \(destination.positionShareMessage)." + typingMessage = "📍 " + userLongName + " \(destination.positionShareMessage)." } private func sendMessage() { From 7bc0db35b440a7016ae5e5ab4a6530932e3144e1 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Mon, 5 May 2025 08:23:15 -0700 Subject: [PATCH 70/93] Update translation strings --- Localizable.xcstrings | 339 +++++++++--------- Meshtastic/Persistence/UpdateCoreData.swift | 2 +- .../Config/Module/PaxCounterConfig.swift | 2 +- 3 files changed, 173 insertions(+), 170 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 95f524d2..98623381 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -5721,62 +5721,7 @@ } }, "config.module.paxcounter.title" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter Config" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter Config" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter Config" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione del contatore PAX" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter Config" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Räknare Konfiguration" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подешавања бројача пролазника" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX 计数器配置" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX 計數器設定" - } - } - } + }, "config.module.paxcounter.updateinterval.description" : { "localizations" : { @@ -11428,6 +11373,34 @@ } } }, + "Environment Metrics" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metriche dei sensori" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Метрике сензора" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "传感器指标" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "傳感器數據" + } + } + } + }, "Environment Metrics Log" : { "localizations" : { "it" : { @@ -14370,34 +14343,6 @@ } } }, - "How often power metrics are sent out over the mesh. Default is 30 minutes." : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Con quale frequenza vengono inviate le metriche di potenza attraverso la rete. L'impostazione predefinita è 30 minuti." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Колико често се метрике снаге шаљу преко мреже. Подразумевано је 30 минута." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "通过网格发送功率指标的频率。默认为 30 分钟。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電力指標透過網狀網路發送的頻率。預設為每 30 分鐘一次。" - } - } - } - }, "How often environment metrics are sent out over the mesh. Default is 30 minutes." : { "localizations" : { "it" : { @@ -14426,6 +14371,34 @@ } } }, + "How often power metrics are sent out over the mesh. Default is 30 minutes." : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con quale frequenza vengono inviate le metriche di potenza attraverso la rete. L'impostazione predefinita è 30 minuti." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Колико често се метрике снаге шаљу преко мреже. Подразумевано је 30 минута." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通过网格发送功率指标的频率。默认为 30 分钟。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電力指標透過網狀網路發送的頻率。預設為每 30 分鐘一次。" + } + } + } + }, "How often should we try to get a GPS position." : { "localizations" : { "it" : { @@ -18592,28 +18565,6 @@ } } }, - "Long Range - Fast" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "A lungo raggio - Veloce" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Дугачки домет - Брзо" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Long Range - Fast" - } - } - } - }, "Long Name" : { "localizations" : { "de" : { @@ -18710,6 +18661,28 @@ } } }, + "Long Range - Fast" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "A lungo raggio - Veloce" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дугачки домет - Брзо" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Long Range - Fast" + } + } + } + }, "Long Range - Slow" : { "localizations" : { "it" : { @@ -20878,40 +20851,6 @@ } } }, - "mesh.log.paxcounter.config %@" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter config received: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione del contatore PAX ricevuta: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX-räknarkonfiguration mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација PAX бројача примљена: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter config received: %@" - } - } - } - }, "mesh.log.position.config %@" : { "localizations" : { "de" : { @@ -25106,6 +25045,98 @@ } } }, + "PAX Counter Config" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX Counter Config" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX Counter Config" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX Counter Config" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del contatore PAX" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX Counter Config" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX Räknare Konfiguration" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подешавања бројача пролазника" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX 计数器配置" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX 計數器設定" + } + } + } + }, + "PAX Counter config received: %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX Counter config received: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del contatore PAX ricevuta: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX-räknarkonfiguration mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација PAX бројача примљена: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX Counter config received: %@" + } + } + } + }, "paxcounter.ble" : { "localizations" : { "en" : { @@ -31075,34 +31106,6 @@ } } }, - "Environment Metrics" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Metriche dei sensori" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Метрике сензора" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "传感器指标" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "傳感器數據" - } - } - } - }, "Sensor options" : { "localizations" : { "it" : { diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index d06c0219..d8477ee2 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -1101,7 +1101,7 @@ func upsertExternalNotificationModuleConfigPacket(config: ModuleConfig.ExternalN func upsertPaxCounterModuleConfigPacket(config: ModuleConfig.PaxcounterConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.paxcounter.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("PAX Counter config received: %@".localized, String(nodeNum)) Logger.data.info("🧑‍🤝‍🧑 \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() diff --git a/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift b/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift index 5ef89a17..480f4b94 100644 --- a/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift @@ -22,7 +22,7 @@ struct PaxCounterConfig: View { var body: some View { Form { - ConfigHeader(title: "config.module.paxcounter.title", config: \.powerConfig, node: node, onAppear: setPaxValues) + ConfigHeader(title: "PAX Counter Config", config: \.powerConfig, node: node, onAppear: setPaxValues) Section { Toggle(isOn: $enabled) { From 0b47abb127e91ed41cf3660a2148d3b13cd6b33e Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Mon, 5 May 2025 08:57:38 -0700 Subject: [PATCH 71/93] More translastion key updates --- Localizable.xcstrings | 322 ++++++++---------- Meshtastic/Views/Messages/ChannelList.swift | 2 +- .../Messages/MessageContextMenuItems.swift | 2 +- Meshtastic/Views/Messages/UserList.swift | 2 +- .../Nodes/Helpers/Map/PositionPopover.swift | 2 +- .../Nodes/Helpers/Map/WaypointForm.swift | 2 +- Meshtastic/Views/Nodes/TraceRouteLog.swift | 2 +- Meshtastic/Views/Settings/AppData.swift | 4 +- Meshtastic/Views/Settings/AppLog.swift | 2 +- .../Views/Settings/Logs/LogDetail.swift | 2 +- Meshtastic/Views/Settings/Routes.swift | 4 +- Meshtastic/Views/Settings/Settings.swift | 2 +- 12 files changed, 150 insertions(+), 198 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 98623381..74161211 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -685,7 +685,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "%@ האפליקציה תנסה אוטומטית להתחבר מחדש למכשיר המועדף אם ייראה." } }, @@ -743,7 +743,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "%@ שגיאה זו בדרך כלל אינה ניתנת לתיקון ללא שכחחת המכשיר בהגדרות מכשיר > בלוטוס ואז להתחבר מחדש למכשיר." } }, @@ -4440,6 +4440,70 @@ } } }, + "Category" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kategorie" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Category" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Category" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Category" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Categoria" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Category" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Category" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Категорија" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Category" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Category" + } + } + } + }, "Ch1 Current" : { "localizations" : { "it" : { @@ -7677,7 +7741,7 @@ } } }, - "delete" : { + "Delete" : { "localizations" : { "de" : { "stringUnit" : { @@ -7685,12 +7749,6 @@ "value" : "Löschen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -8317,6 +8375,58 @@ } } }, + "Device Configuration" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gerätekonfiguration" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Device Configuration" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del dispositivo" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Device Configuration" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enhetsinställningar" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подешавања уређаја" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设备配置" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "設備設定" + } + } + } + }, "Device GPS" : { "localizations" : { "de" : { @@ -8589,64 +8699,6 @@ } } }, - "device.configuration" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerätekonfiguration" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device Configuration" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device Configuration" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione del dispositivo" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device Configuration" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enhetsinställningar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подешавања уређаја" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "设备配置" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "設備設定" - } - } - } - }, "device.metrics.delete" : { "localizations" : { "en" : { @@ -9637,13 +9689,13 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Combinaison des modes ROUTER et CLIENT. Pas pour les appareils mobiles." } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "קומבינציה של ROUTER וCLIENT. לא למכשירים ניידים." } }, @@ -11735,7 +11787,7 @@ } } }, - "export" : { + "Export" : { "localizations" : { "de" : { "stringUnit" : { @@ -13905,7 +13957,7 @@ } } }, - "heard" : { + "Heard" : { "localizations" : { "de" : { "stringUnit" : { @@ -13913,12 +13965,6 @@ "value" : "Gehört" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Heard" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -18125,70 +18171,6 @@ } } }, - "log.category" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kategorie" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Category" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Category" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Category" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Categoria" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Category" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Category" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Категорија" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Category" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Category" - } - } - } - }, "log.level" : { "localizations" : { "de" : { @@ -22469,7 +22451,7 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Mode" } }, @@ -24535,12 +24517,6 @@ "value" : "Optionen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Options" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -24815,12 +24791,6 @@ "value" : "Pairing Modus" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pairing Mode" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -24853,7 +24823,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Мод упаривања" } }, @@ -24887,7 +24857,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "סיסמא" } }, @@ -25015,7 +24985,7 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "PAX Counter" } }, @@ -25049,13 +25019,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter Config" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "PAX Counter Config" } }, @@ -25073,7 +25037,7 @@ }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "PAX Counter Config" } }, @@ -25105,12 +25069,6 @@ }, "PAX Counter config received: %@" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter config received: %@" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -25131,7 +25089,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "PAX Counter config received: %@" } } @@ -25709,19 +25667,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Position" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Position" } }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Position" } }, @@ -25745,7 +25697,7 @@ }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Position" } }, @@ -36900,25 +36852,25 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Tempo di attività" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Drifttid" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Време рада" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "已開機時間" } } diff --git a/Meshtastic/Views/Messages/ChannelList.swift b/Meshtastic/Views/Messages/ChannelList.swift index f4194dc3..1123c4ab 100644 --- a/Meshtastic/Views/Messages/ChannelList.swift +++ b/Meshtastic/Views/Messages/ChannelList.swift @@ -144,7 +144,7 @@ struct ChannelList: View { context.refresh(myInfo, mergeChanges: true) channelSelection = nil } label: { - Text("delete") + Text("Delete") } } } diff --git a/Meshtastic/Views/Messages/MessageContextMenuItems.swift b/Meshtastic/Views/Messages/MessageContextMenuItems.swift index 1d8642a0..dc55a8ce 100644 --- a/Meshtastic/Views/Messages/MessageContextMenuItems.swift +++ b/Meshtastic/Views/Messages/MessageContextMenuItems.swift @@ -104,7 +104,7 @@ struct MessageContextMenuItems: View { Button(role: .destructive) { isShowingDeleteConfirmation = true } label: { - Text("delete") + Text("Delete") Image(systemName: "trash") } } diff --git a/Meshtastic/Views/Messages/UserList.swift b/Meshtastic/Views/Messages/UserList.swift index 2888a54e..7a7193f2 100644 --- a/Meshtastic/Views/Messages/UserList.swift +++ b/Meshtastic/Views/Messages/UserList.swift @@ -187,7 +187,7 @@ struct UserList: View { deleteUserMessages(user: userSelection!, context: context) context.refresh(node!.user!, mergeChanges: true) } label: { - Text("delete") + Text("Delete") } } } diff --git a/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift b/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift index 97df2327..d3ef18a3 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/PositionPopover.swift @@ -52,7 +52,7 @@ struct PositionPopover: View { /// Time Label { if idiom != .phone { - Text("heard".localized + ":") + Text("Heard".localized + ":") } Text(position.time?.lastHeard ?? "unknown") .foregroundColor(.primary) diff --git a/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift b/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift index 736c2114..fbfeb764 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift @@ -235,7 +235,7 @@ struct WaypointForm: View { }) } label: { - Label("delete", systemImage: "trash") + Label("Delete", systemImage: "trash") .foregroundColor(.red) } .buttonStyle(.bordered) diff --git a/Meshtastic/Views/Nodes/TraceRouteLog.swift b/Meshtastic/Views/Nodes/TraceRouteLog.swift index bd50f3ac..3d2df721 100644 --- a/Meshtastic/Views/Nodes/TraceRouteLog.swift +++ b/Meshtastic/Views/Nodes/TraceRouteLog.swift @@ -67,7 +67,7 @@ struct TraceRouteLog: View { Logger.data.error("\(error.localizedDescription, privacy: .public)") } } label: { - Label("delete", systemImage: "trash") + Label("Delete", systemImage: "trash") } } } diff --git a/Meshtastic/Views/Settings/AppData.swift b/Meshtastic/Views/Settings/AppData.swift index f1777989..e5535c2c 100644 --- a/Meshtastic/Views/Settings/AppData.swift +++ b/Meshtastic/Views/Settings/AppData.swift @@ -41,7 +41,7 @@ struct AppData: View { Logger.services.error("🗑️ Delete file error: \(error, privacy: .public)") } } label: { - Label("delete", systemImage: "trash") + Label("Delete", systemImage: "trash") } } } icon: { @@ -61,7 +61,7 @@ struct AppData: View { Logger.services.error("🗑️ Delete file error: \(error, privacy: .public)") } } label: { - Label("delete", systemImage: "trash") + Label("Delete", systemImage: "trash") } } } icon: { diff --git a/Meshtastic/Views/Settings/AppLog.swift b/Meshtastic/Views/Settings/AppLog.swift index 5c49f7c4..76f87388 100644 --- a/Meshtastic/Views/Settings/AppLog.swift +++ b/Meshtastic/Views/Settings/AppLog.swift @@ -84,7 +84,7 @@ struct AppLog: View { .foregroundStyle(value.level.color) } .width(min: 85, max: 110) - TableColumn("log.category", value: \.category) + TableColumn("Category", value: \.category) .width(min: 80, max: 130) TableColumn("Message", value: \.composedMessage) { value in Text(value.composedMessage) diff --git a/Meshtastic/Views/Settings/Logs/LogDetail.swift b/Meshtastic/Views/Settings/Logs/LogDetail.swift index 864e3c62..31da29d4 100644 --- a/Meshtastic/Views/Settings/Logs/LogDetail.swift +++ b/Meshtastic/Views/Settings/Logs/LogDetail.swift @@ -107,7 +107,7 @@ struct LogDetail: View { /// Category Label { HStack { - Text("log.category".localized + ":") + Text("Category".localized + ":") .font(idiom == .phone ? .caption : .title) .frame(width: idiom == .phone ? 115 : 190, alignment: .trailing) Text(log.category) diff --git a/Meshtastic/Views/Settings/Routes.swift b/Meshtastic/Views/Settings/Routes.swift index 138fab99..b7a80b31 100644 --- a/Meshtastic/Views/Settings/Routes.swift +++ b/Meshtastic/Views/Settings/Routes.swift @@ -154,7 +154,7 @@ struct Routes: View { Logger.data.error("\(error.localizedDescription, privacy: .public)") } } label: { - Label("delete", systemImage: "trash") + Label("Delete", systemImage: "trash") } } @@ -279,7 +279,7 @@ struct Routes: View { exportString = routeToCsvFile(locations: selectedRoute!.locations!.array as? [LocationEntity] ?? []) isExporting = true } label: { - Label("export", systemImage: "square.and.arrow.down") + Label("Export", systemImage: "square.and.arrow.down") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Settings/Settings.swift b/Meshtastic/Views/Settings/Settings.swift index 45c9f54a..1e9ab8a7 100644 --- a/Meshtastic/Views/Settings/Settings.swift +++ b/Meshtastic/Views/Settings/Settings.swift @@ -105,7 +105,7 @@ struct Settings: View { } var deviceConfigurationSection: some View { - Section("device.configuration") { + Section("Device Configuration") { NavigationLink(value: SettingsNavigationState.user) { Label { Text("User") From c3f23370c8047c6382a5867b956d5118fd9b295b Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Mon, 5 May 2025 09:35:30 -0700 Subject: [PATCH 72/93] Update routing error translation strings --- Localizable.xcstrings | 1592 ++++++++--------- Meshtastic/Enums/RoutingError.swift | 26 +- .../Views/Nodes/DetectionSensorLog.swift | 2 +- Meshtastic/Views/Nodes/DeviceMetricsLog.swift | 2 +- .../Views/Nodes/EnvironmentMetricsLog.swift | 2 +- Meshtastic/Views/Nodes/PaxCounterLog.swift | 2 +- Meshtastic/Views/Settings/Channels.swift | 2 +- .../Config/Module/RangeTestConfig.swift | 2 +- .../Settings/Config/SaveConfigButton.swift | 2 +- Meshtastic/Views/Settings/Routes.swift | 2 +- .../Views/Settings/SaveChannelQRCode.swift | 2 +- Meshtastic/Views/Settings/UserConfig.swift | 2 +- 12 files changed, 770 insertions(+), 868 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 74161211..d0125bad 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -1812,6 +1812,70 @@ } } }, + "Acknowledged" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bestätigt" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Acknowledged" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confirmé" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מאשר" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riconosciuto" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Potwierdzono" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bekräftad" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Потврђено" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "确认" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已確認" + } + } + } + }, "Acknowledged by another node" : { "localizations" : { "it" : { @@ -3396,6 +3460,70 @@ } } }, + "Bad Request" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bad Request" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bad Request" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Requête incorrecte" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בקשה לא תקינה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Richiesta negativa" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Złe żądanie" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Felaktig begäran" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Лош захтев" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "错误请求" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "錯誤請求" + } + } + } + }, "Bandwidth" : { "localizations" : { "de" : { @@ -11301,6 +11429,40 @@ } } }, + "Encrypted Send Failed" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verschlüsseltes Senden fehlgeschlagen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Encrypted Send Failed" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invio crittografato fallito" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Шифровано слање није успело" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "加密傳送失敗" + } + } + } + }, "Encryption Enabled" : { "localizations" : { "it" : { @@ -19587,6 +19749,70 @@ } } }, + "Max Retransmission Reached" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Maximale Wiederholungen erreicht" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Max Retransmission Reached" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nombre maximum de retransmissions atteint" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגיע למקסימום השליחות מדש" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Raggiunta la massima ritrasmissione" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Osiągnięto limit retransmisji" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Max antal omsändningar nått" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Достигнут максималан број поновних слања" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已达到最大重试次数" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已達到最大重試次數" + } + } + } + }, "medium.range.fast" : { "localizations" : { "en" : { @@ -23221,6 +23447,70 @@ } } }, + "No Channel" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kein Kanal" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No Channel" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pas de canal" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אין ערוץ" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun canale" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Brak kanału" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingen kanal" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Нема канала" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有频道" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "没有頻道" + } + } + } + }, "No Connected Node" : { "localizations" : { "de" : { @@ -23299,6 +23589,70 @@ } } }, + "No Interface" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Keine Schnittstelle" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No Interface" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pas d'interface" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אין ממשק" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuna interfaccia" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Brak interfejsu" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inget gränssnitt" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Нема интерфејса" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无连接" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "無連接" + } + } + } + }, "No PIN (Just Works)" : { "localizations" : { "de" : { @@ -23413,6 +23767,134 @@ } } }, + "No Response" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Keine Antwort" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No Response" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pas de réponse" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אין תגובה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuna risposta" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Brak odpowiedzi" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inget svar" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Нема одговора" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无响应" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "無回應" + } + } + } + }, + "No Route" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Keine Route" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No Route" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pas de route" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אין מסלול" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun percorso" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Brak trasy" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingen rutt" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Нема руте" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "找不到目标" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "找不到目標" + } + } + } + }, "Node" : { "localizations" : { "de" : { @@ -23817,6 +24299,70 @@ } } }, + "Not Authorized" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nicht authorisiert" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Not Authorized" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non autorisé" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "לא מאושר" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non autorizzato" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nieautoryzowany" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inte auktoriserad" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Није ауторизовано" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "未授权" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "未授權" + } + } + } + }, "Not Present" : { "localizations" : { "fr" : { @@ -27135,6 +27681,70 @@ } } }, + "Received a negative acknowledgment" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Negative Empfangsbestätigung empfangen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Received a negative acknowledgment" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Accusé de réception négatif reçu" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "התקבל אישור מסירה שלילי" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ricevuto un riscontro negativo" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otrzymano negatywne potwierdzenie" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mottog ett negativt kvitto" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Примљено негативно признање" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "收到否认" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "收到 NACK(否定確認)" + } + } + } + }, "received.ack" : { "localizations" : { "de" : { @@ -27347,6 +27957,70 @@ } } }, + "Regional Duty Cycle Limit Reached" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Regionale Einschaltdauergrenze erreicht" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Regional Duty Cycle Limit Reached" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Limite du cycle de service régional atteinte" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגיע למקסימום שימוש אזורי לשעה זו" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Raggiunto il limite del ciclo di lavoro regionale" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Osiągnięto regionalny limit cyklu pracy" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Regionala sändningsgränsen nådd" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Достигнут регионални лимит радног циклуса" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已达到当前区域循环周期发射上限" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已達到頻道占用循環週期發射上限" + } + } + } + }, "relativetimeofday.afternoon" : { "localizations" : { "de" : { @@ -28852,808 +29526,6 @@ } } }, - "routing.acknowledged" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bestätigt" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Acknowledged" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confirmé" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מאשר" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Riconosciuto" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Potwierdzono" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bekräftad" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Потврђено" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "确认" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "已確認" - } - } - } - }, - "routing.badRequest" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bad Request" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bad Request" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requête incorrecte" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "בקשה לא תקינה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Richiesta negativa" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Złe żądanie" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Felaktig begäran" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Лош захтев" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "错误请求" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "錯誤請求" - } - } - } - }, - "routing.dutycyclelimit" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Regionale Einschaltdauergrenze erreicht" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Regional Duty Cycle Limit Reached" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Limite du cycle de service régional atteinte" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגיע למקסימום שימוש אזורי לשעה זו" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Raggiunto il limite del ciclo di lavoro regionale" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Osiągnięto regionalny limit cyklu pracy" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Regionala sändningsgränsen nådd" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Достигнут регионални лимит радног циклуса" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "已达到当前区域循环周期发射上限" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "已達到頻道占用循環週期發射上限" - } - } - } - }, - "routing.gotnak" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Negative Empfangsbestätigung empfangen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Received a negative acknowledgment" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Accusé de réception négatif reçu" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "התקבל אישור מסירה שלילי" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ricevuto un riscontro negativo" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otrzymano negatywne potwierdzenie" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mottog ett negativt kvitto" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Примљено негативно признање" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到否认" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到 NACK(否定確認)" - } - } - } - }, - "routing.maxretransmit" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Maximale Wiederholungen erreicht" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Max Retransmission Reached" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nombre maximum de retransmissions atteint" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגיע למקסימום השליחות מדש" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Raggiunta la massima ritrasmissione" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Osiągnięto limit retransmisji" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Max antal omsändningar nått" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Достигнут максималан број поновних слања" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "已达到最大重试次数" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "已達到最大重試次數" - } - } - } - }, - "routing.nochannel" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kein Kanal" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No Channel" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pas de canal" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אין ערוץ" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessun canale" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Brak kanału" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ingen kanal" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Нема канала" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "没有频道" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "没有頻道" - } - } - } - }, - "routing.nointerface" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Schnittstelle" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No Interface" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pas d'interface" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אין ממשק" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessuna interfaccia" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Brak interfejsu" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inget gränssnitt" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Нема интерфејса" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "无连接" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "無連接" - } - } - } - }, - "routing.noresponse" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Antwort" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No Response" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pas de réponse" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אין תגובה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessuna risposta" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Brak odpowiedzi" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inget svar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Нема одговора" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "无响应" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "無回應" - } - } - } - }, - "routing.noroute" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Route" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No Route" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pas de route" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אין מסלול" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessun percorso" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Brak trasy" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ingen rutt" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Нема руте" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "找不到目标" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "找不到目標" - } - } - } - }, - "routing.notauthorized" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nicht authorisiert" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Not Authorized" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Non autorisé" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "לא מאושר" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Non autorizzato" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nieautoryzowany" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inte auktoriserad" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Није ауторизовано" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "未授权" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "未授權" - } - } - } - }, - "routing.pkifailed" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verschlüsseltes Senden fehlgeschlagen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Encrypted Send Failed" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Invio crittografato fallito" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Шифровано слање није успело" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "加密傳送失敗" - } - } - } - }, - "routing.timeout" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zeitlimit erreicht" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Timeout" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Délai d'expiration" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "נגמר הזמן" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Timeout" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Limit czasu" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tidsgräns överskriden" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Време истекло" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "超时" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "逾時" - } - } - } - }, - "routing.toolarge" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Das Paket ist zu groß" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "The packet is too large" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le paquet est trop grand" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "ההודעה ארוכה/גדולה מידי" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Il pacchetto è troppo grande" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pakiet jest zbyt duży" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Paketet är för stort" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пакет је превелики" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "数据包过大" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "數據包過大" - } - } - } - }, "RSSI %@ dBm" : { "localizations" : { "it" : { @@ -29976,53 +29848,47 @@ } } }, - "save" : { + "Save" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Speichern" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Save" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Sauvegarder" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "שמור" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Risparmiare" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Zapisz" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Spara" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Сачувај" } }, @@ -30034,35 +29900,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", - "value" : "儲存" - } - } - } - }, - "Save" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Speichern" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Risparmiare" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Сачувај" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "儲存" } } @@ -34606,6 +34444,70 @@ } } }, + "The packet is too large" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Das Paket ist zu groß" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The packet is too large" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le paquet est trop grand" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ההודעה ארוכה/גדולה מידי" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il pacchetto è troppo grande" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pakiet jest zbyt duży" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paketet är för stort" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пакет је превелики" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "数据包过大" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "數據包過大" + } + } + } + }, "The primary public key authorized to send admin messages to this node." : { "localizations" : { "de" : { diff --git a/Meshtastic/Enums/RoutingError.swift b/Meshtastic/Enums/RoutingError.swift index 628e1b3f..985794b3 100644 --- a/Meshtastic/Enums/RoutingError.swift +++ b/Meshtastic/Enums/RoutingError.swift @@ -32,31 +32,31 @@ enum RoutingError: Int, CaseIterable, Identifiable { switch self { case .none: - return "routing.acknowledged".localized + return "Acknowledged".localized case .noRoute: - return "routing.noroute".localized + return "No Route".localized case .gotNak: - return "routing.gotnak".localized + return "Received a negative acknowledgment".localized case .timeout: - return "routing.timeout".localized + return "Timeout".localized case .noInterface: - return "routing.nointerface".localized + return "No Interface".localized case .maxRetransmit: - return "routing.maxretransmit".localized + return "Max Retransmission Reached".localized case .noChannel: - return "routing.nochannel".localized + return "No Channel".localized case .tooLarge: - return "routing.toolarge".localized + return "The packet is too large".localized case .noResponse: - return "routing.noresponse".localized + return "No Response".localized case .dutyCycleLimit: - return "routing.dutycyclelimit".localized + return "Regional Duty Cycle Limit Reached".localized case .badRequest: - return "routing.badRequest".localized + return "Bad Request".localized case .notAuthorized: - return "routing.notauthorized".localized + return "Not Authorized".localized case .pkiFailed: - return "routing.pkifailed".localized + return "Encrypted Send Failed".localized case .pkiUnknownPubkey: return "Unknown public key".localized case .adminBadSessionKey: diff --git a/Meshtastic/Views/Nodes/DetectionSensorLog.swift b/Meshtastic/Views/Nodes/DetectionSensorLog.swift index 89c62be3..af07b9e7 100644 --- a/Meshtastic/Views/Nodes/DetectionSensorLog.swift +++ b/Meshtastic/Views/Nodes/DetectionSensorLog.swift @@ -110,7 +110,7 @@ struct DetectionSensorLog: View { exportString = detectionsToCsv(detections: chartData) isExporting = true } label: { - Label("save", systemImage: "square.and.arrow.down") + Label("Save", systemImage: "square.and.arrow.down") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Nodes/DeviceMetricsLog.swift b/Meshtastic/Views/Nodes/DeviceMetricsLog.swift index 0d739c49..c958d1ae 100644 --- a/Meshtastic/Views/Nodes/DeviceMetricsLog.swift +++ b/Meshtastic/Views/Nodes/DeviceMetricsLog.swift @@ -222,7 +222,7 @@ struct DeviceMetricsLog: View { exportString = telemetryToCsvFile(telemetry: deviceMetrics, metricsType: 0) isExporting = true } label: { - Label("save", systemImage: "square.and.arrow.down") + Label("Save", systemImage: "square.and.arrow.down") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Nodes/EnvironmentMetricsLog.swift b/Meshtastic/Views/Nodes/EnvironmentMetricsLog.swift index 7ae9bc50..160f3ef7 100644 --- a/Meshtastic/Views/Nodes/EnvironmentMetricsLog.swift +++ b/Meshtastic/Views/Nodes/EnvironmentMetricsLog.swift @@ -145,7 +145,7 @@ struct EnvironmentMetricsLog: View { exportString = telemetryToCsvFile(telemetry: environmentMetrics, metricsType: 1) isExporting = true } label: { - Label("save", systemImage: "square.and.arrow.down") + Label("Save", systemImage: "square.and.arrow.down") .imageScale(imageScale) } .buttonStyle(.bordered) diff --git a/Meshtastic/Views/Nodes/PaxCounterLog.swift b/Meshtastic/Views/Nodes/PaxCounterLog.swift index ff579eca..58d68bb1 100644 --- a/Meshtastic/Views/Nodes/PaxCounterLog.swift +++ b/Meshtastic/Views/Nodes/PaxCounterLog.swift @@ -187,7 +187,7 @@ struct PaxCounterLog: View { exportString = paxToCsvFile(pax: pax) isExporting = true } label: { - Label("save", systemImage: "square.and.arrow.down") + Label("Save", systemImage: "square.and.arrow.down") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Settings/Channels.swift b/Meshtastic/Views/Settings/Channels.swift index 861f0cb3..bff2dbb7 100644 --- a/Meshtastic/Views/Settings/Channels.swift +++ b/Meshtastic/Views/Settings/Channels.swift @@ -219,7 +219,7 @@ struct Channels: View { hasChanges = false } } label: { - Label("save", systemImage: "square.and.arrow.down") + Label("Save", systemImage: "square.and.arrow.down") } .disabled(bleManager.connectedPeripheral == nil)// || !hasChanges)// !hasValidKey) .buttonStyle(.bordered) diff --git a/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift b/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift index 7ac35423..f1f56e1a 100644 --- a/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift @@ -45,7 +45,7 @@ struct RangeTestConfig: View { .font(.callout) Toggle(isOn: $save) { - Label("save", systemImage: "square.and.arrow.down.fill") + Label("Save", systemImage: "square.and.arrow.down.fill") Text("Saves a CSV with the range test message details, currently only available on ESP32 devices with a web server.") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) diff --git a/Meshtastic/Views/Settings/Config/SaveConfigButton.swift b/Meshtastic/Views/Settings/Config/SaveConfigButton.swift index 0c948a28..36b92443 100644 --- a/Meshtastic/Views/Settings/Config/SaveConfigButton.swift +++ b/Meshtastic/Views/Settings/Config/SaveConfigButton.swift @@ -12,7 +12,7 @@ struct SaveConfigButton: View { Button { isPresentingSaveConfirm = true } label: { - Label("save", systemImage: "square.and.arrow.down") + Label("Save", systemImage: "square.and.arrow.down") } .disabled(bleManager.connectedPeripheral == nil || !hasChanges) .buttonStyle(.bordered) diff --git a/Meshtastic/Views/Settings/Routes.swift b/Meshtastic/Views/Settings/Routes.swift index b7a80b31..23c4fa18 100644 --- a/Meshtastic/Views/Settings/Routes.swift +++ b/Meshtastic/Views/Settings/Routes.swift @@ -215,7 +215,7 @@ struct Routes: View { .buttonBorderShape(.capsule) .controlSize(.large) - Button("save") { + Button("Save") { selectedRoute?.name = name selectedRoute?.notes = notes selectedRoute?.enabled = enabled diff --git a/Meshtastic/Views/Settings/SaveChannelQRCode.swift b/Meshtastic/Views/Settings/SaveChannelQRCode.swift index 0e8e13f1..892df6eb 100644 --- a/Meshtastic/Views/Settings/SaveChannelQRCode.swift +++ b/Meshtastic/Views/Settings/SaveChannelQRCode.swift @@ -43,7 +43,7 @@ struct SaveChannelQRCode: View { showError = true } } label: { - Label("save", systemImage: "square.and.arrow.down") + Label("Save", systemImage: "square.and.arrow.down") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Settings/UserConfig.swift b/Meshtastic/Views/Settings/UserConfig.swift index 644c0077..51f55dbe 100644 --- a/Meshtastic/Views/Settings/UserConfig.swift +++ b/Meshtastic/Views/Settings/UserConfig.swift @@ -141,7 +141,7 @@ struct UserConfig: View { Button { isPresentingSaveConfirm = true } label: { - Label("save", systemImage: "square.and.arrow.down") + Label("Save", systemImage: "square.and.arrow.down") } .disabled(bleManager.connectedPeripheral == nil || !hasChanges) .buttonStyle(.bordered) From bb4cd7b0b208072f2106ef70ec62411fe20b7829 Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Mon, 5 May 2025 17:21:08 -0700 Subject: [PATCH 73/93] Fixed waypoints --- Meshtastic/Extensions/UserDefaults.swift | 2 +- .../Map/MapContent/MeshMapContent.swift | 2 +- .../Map/MapContent/NodeMapContent.swift | 2 +- .../Nodes/Helpers/Map/WaypointForm.swift | 88 ++++++++++++------- 4 files changed, 60 insertions(+), 34 deletions(-) diff --git a/Meshtastic/Extensions/UserDefaults.swift b/Meshtastic/Extensions/UserDefaults.swift index e1ca67f9..87bfe3f2 100644 --- a/Meshtastic/Extensions/UserDefaults.swift +++ b/Meshtastic/Extensions/UserDefaults.swift @@ -98,7 +98,7 @@ extension UserDefaults { @UserDefault(.meshMapDistance, defaultValue: 800000) static var meshMapDistance: Double - @UserDefault(.enableMapWaypoints, defaultValue: false) + @UserDefault(.enableMapWaypoints, defaultValue: true) static var enableMapWaypoints: Bool @UserDefault(.enableMapRecentering, defaultValue: false) diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift index 6a0374f2..2ca86652 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift @@ -20,7 +20,7 @@ struct MeshMapContent: MapContent { @Binding var selectedMapLayer: MapLayer // Map Configuration @Binding var selectedPosition: PositionEntity? - @AppStorage("enableMapWaypoints") private var showWaypoints = false + @AppStorage("enableMapWaypoints") private var showWaypoints = true @Binding var selectedWaypoint: WaypointEntity? @FetchRequest(fetchRequest: PositionEntity.allPositionsFetchRequest(), animation: .easeIn) diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/NodeMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/NodeMapContent.swift index c9fbf95a..2d157979 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/NodeMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/NodeMapContent.swift @@ -16,7 +16,7 @@ struct NodeMapContent: MapContent { /// Map State User Defaults @AppStorage("meshMapShowNodeHistory") private var showNodeHistory = false @AppStorage("meshMapShowRouteLines") private var showRouteLines = false - @AppStorage("enableMapWaypoints") private var showWaypoints = false + @AppStorage("enableMapWaypoints") private var showWaypoints = true @AppStorage("enableMapConvexHull") private var showConvexHull = false @AppStorage("enableMapTraffic") private var showTraffic: Bool = false @AppStorage("enableMapPointsOfInterest") private var showPointsOfInterest: Bool = false diff --git a/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift b/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift index 736c2114..9eb42c23 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift @@ -134,40 +134,44 @@ struct WaypointForm: View { .scrollDismissesKeyboard(.immediately) HStack { Button { - /// Send a new or exiting waypoint - var newWaypoint = Waypoint() - if waypoint.id == 0 { - newWaypoint.id = UInt32.random(in: UInt32(UInt8.max).. 0 ? name : "Dropped Pin" - newWaypoint.description_p = description - // Unicode scalar value for the icon emoji string - let unicodeScalers = icon.unicodeScalars - // First element as an UInt32 - let unicode = unicodeScalers[unicodeScalers.startIndex].value - newWaypoint.icon = unicode - if locked { - if lockedTo == 0 { - newWaypoint.lockedTo = UInt32(bleManager.connectedPeripheral!.num) + if bleManager.isConnected { + /// Send a new or exiting waypoint + var newWaypoint = Waypoint() + if waypoint.id == 0 { + newWaypoint.id = UInt32.random(in: UInt32(UInt8.max).. 0 ? name : "Dropped Pin" + newWaypoint.description_p = description + // Unicode scalar value for the icon emoji string + let unicodeScalers = icon.unicodeScalars + // First element as an UInt32 + let unicode = unicodeScalers[unicodeScalers.startIndex].value + newWaypoint.icon = unicode + if locked { + if lockedTo == 0 { + newWaypoint.lockedTo = UInt32(bleManager.connectedPeripheral!.num) + } else { + newWaypoint.lockedTo = UInt32(lockedTo) + } + } + if expires { + newWaypoint.expire = UInt32(expire.timeIntervalSince1970) + } else { + newWaypoint.expire = 0 + } + if bleManager.sendWaypoint(waypoint: newWaypoint) { + dismiss() + } else { + dismiss() + Logger.mesh.warning("Send waypoint failed") } - } - if expires { - newWaypoint.expire = UInt32(expire.timeIntervalSince1970) } else { - newWaypoint.expire = 0 - } - if bleManager.sendWaypoint(waypoint: newWaypoint) { - dismiss() - } else { - dismiss() - Logger.mesh.warning("Send waypoint failed") + Logger.mesh.warning("Send waypoint failed, node not connected") } } label: { Label("Send", systemImage: "arrow.up") @@ -179,6 +183,16 @@ struct WaypointForm: View { .padding(.bottom) Button(role: .cancel) { + if waypoint.id == 0 { + // New, unsent waypoint created by the user: delete it + bleManager.context.delete(waypoint) + do { + try bleManager.context.save() + } catch { + bleManager.context.rollback() + Logger.mesh.error("Failed to save context on waypoint deletion: \(error)") + } + } dismiss() } label: { Label("Cancel", systemImage: "x.circle") @@ -364,6 +378,18 @@ struct WaypointForm: View { } } } + .onDisappear { + if waypoint.id == 0 { + // New, unsent waypoint created by the user: delete it + bleManager.context.delete(waypoint) + do { + try bleManager.context.save() + } catch { + bleManager.context.rollback() + Logger.mesh.error("Failed to save context on waypoint deletion: \(error)") + } + } + } .onAppear { if waypoint.id > 0 { let waypoint = getWaypoint(id: Int64(waypoint.id), context: bleManager.context) From afa5789fdfcc4ba6f7226c63d6e7783718c42688 Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Mon, 5 May 2025 22:06:08 -0700 Subject: [PATCH 74/93] Fix taping node circles and waypoints --- .../Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift index 2ca86652..4bce572c 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift @@ -74,9 +74,9 @@ struct MeshMapContent: MapContent { } } } - .onTapGesture { _ in + .highPriorityGesture(TapGesture().onEnded { _ in selectedPosition = (selectedPosition == position ? nil : position) - } + }) } /// Node History and Route Lines for favorites if let nodePosition = position.nodePosition, @@ -186,7 +186,7 @@ struct MeshMapContent: MapContent { LazyVStack { ZStack { CircleText(text: String(UnicodeScalar(Int(waypoint.icon)) ?? "📍"), color: Color.orange, circleSize: 40) - .onTapGesture(perform: { _ in + .highPriorityGesture(TapGesture().onEnded { _ in selectedWaypoint = (selectedWaypoint == waypoint ? nil : waypoint) }) } From 46e0757f0368a6b0efaaff68b935bec6a040460f Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Mon, 5 May 2025 22:40:14 -0700 Subject: [PATCH 75/93] Only put delete if not sent logic in one place --- Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift b/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift index 9eb42c23..4f39a448 100644 --- a/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift +++ b/Meshtastic/Views/Nodes/Helpers/Map/WaypointForm.swift @@ -183,16 +183,6 @@ struct WaypointForm: View { .padding(.bottom) Button(role: .cancel) { - if waypoint.id == 0 { - // New, unsent waypoint created by the user: delete it - bleManager.context.delete(waypoint) - do { - try bleManager.context.save() - } catch { - bleManager.context.rollback() - Logger.mesh.error("Failed to save context on waypoint deletion: \(error)") - } - } dismiss() } label: { Label("Cancel", systemImage: "x.circle") From cf59865fce54ccb1db467aa50e8d6b3e45491a3d Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Tue, 6 May 2025 10:11:32 -0700 Subject: [PATCH 76/93] Additional translation key updates --- Localizable.xcstrings | 222 ++++++++--------------- Meshtastic/Enums/AppSettingsEnums.swift | 10 +- Meshtastic/Views/Messages/Messages.swift | 2 +- protobufs | 2 +- 4 files changed, 80 insertions(+), 156 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index d0125bad..9c32dc09 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -1816,61 +1816,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Bestätigt" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Acknowledged" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Confirmé" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "מאשר" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Riconosciuto" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Potwierdzono" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Bekräftad" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Потврђено" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "确认" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "已確認" } } @@ -3464,61 +3458,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Bad Request" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Bad Request" } }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Requête incorrecte" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "בקשה לא תקינה" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Richiesta negativa" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Złe żądanie" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Felaktig begäran" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Лош захтев" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "错误请求" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "錯誤請求" } } @@ -4572,61 +4560,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Kategorie" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Category" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Category" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Category" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Categoria" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Category" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Category" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Категорија" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Category" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Category" } } @@ -11433,31 +11415,25 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Verschlüsseltes Senden fehlgeschlagen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Encrypted Send Failed" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Invio crittografato fallito" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Шифровано слање није успело" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "加密傳送失敗" } } @@ -11953,61 +11929,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Export" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Export" } }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Export" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Export" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Esportazione" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Export" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Export" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Извоз" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Export" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "匯出" } } @@ -14747,7 +14717,7 @@ } } }, - "hybrid" : { + "Hybrid" : { "localizations" : { "de" : { "stringUnit" : { @@ -14811,7 +14781,7 @@ } } }, - "hybrid.flyover" : { + "Hybrid Flyover" : { "localizations" : { "de" : { "stringUnit" : { @@ -15311,61 +15281,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Unvollständig" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Incomplete" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Incomplete" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Incomplete" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Incompleto" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Incomplete" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Incomplete" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Недовршен" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Incomplete" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "尚未完成" } } @@ -19753,61 +19717,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Maximale Wiederholungen erreicht" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Max Retransmission Reached" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nombre maximum de retransmissions atteint" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "הגיע למקסימום השליחות מדש" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Raggiunta la massima ritrasmissione" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Osiągnięto limit retransmisji" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Max antal omsändningar nått" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Достигнут максималан број поновних слања" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "已达到最大重试次数" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "已達到最大重試次數" } } @@ -22425,93 +22383,59 @@ } } }, - "messages" : { + "Messages" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nachrichten" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messages" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Messages" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "הודעות" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Messaggi" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Wiadomości" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Meddelanden" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Поруке" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "消息" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", - "value" : "訊息" - } - } - } - }, - "Messages" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nachrichten" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messaggi" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Поруке" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "訊息" } } @@ -29636,7 +29560,7 @@ } } }, - "satellite" : { + "Satellite" : { "localizations" : { "de" : { "stringUnit" : { @@ -29700,7 +29624,7 @@ } } }, - "satellite.flyover" : { + "Satellite Flyover" : { "localizations" : { "de" : { "stringUnit" : { @@ -32706,7 +32630,7 @@ } } }, - "standard.muted" : { + "Standard Muted" : { "localizations" : { "de" : { "stringUnit" : { diff --git a/Meshtastic/Enums/AppSettingsEnums.swift b/Meshtastic/Enums/AppSettingsEnums.swift index 0d84269a..5ddcaad7 100644 --- a/Meshtastic/Enums/AppSettingsEnums.swift +++ b/Meshtastic/Enums/AppSettingsEnums.swift @@ -21,15 +21,15 @@ enum MeshMapTypes: Int, CaseIterable, Identifiable { case .standard: return "Standard".localized case .mutedStandard: - return "standard.muted".localized + return "Standard Muted".localized case .hybrid: - return "hybrid".localized + return "Hybrid".localized case .hybridFlyover: - return "hybrid.flyover".localized + return "Hybrid Flyover".localized case .satellite: - return "satellite".localized + return "Satellite".localized case .satelliteFlyover: - return "satellite.flyover".localized + return "Satellite Flyover".localized } } func MKMapTypeValue() -> MKMapType { diff --git a/Meshtastic/Views/Messages/Messages.swift b/Meshtastic/Views/Messages/Messages.swift index 6142617b..7580079b 100644 --- a/Meshtastic/Views/Messages/Messages.swift +++ b/Meshtastic/Views/Messages/Messages.swift @@ -65,7 +65,7 @@ struct Messages: View { TipView(MessagesTip(), arrowEdge: .top) } - .navigationTitle("messages") + .navigationTitle("Messages") .navigationBarTitleDisplayMode(.large) .navigationBarItems(leading: MeshtasticLogo()) } content: { diff --git a/protobufs b/protobufs index 27fac391..06864665 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 27fac39141d99fe727a0a1824c5397409b1aea75 +Subproject commit 068646653e8375fc145988026ad242a3cf70f7ab From 8b48c6783099417f19b28f2fc0b025f70a321e13 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Tue, 6 May 2025 10:18:20 -0700 Subject: [PATCH 77/93] Mark updated keys as reviewed --- Localizable.xcstrings | 108 +++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 9c32dc09..1d2cc028 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -1816,25 +1816,25 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Bestätigt" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Confirmé" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "מאשר" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Riconosciuto" } }, @@ -1846,13 +1846,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Bekräftad" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Потврђено" } }, @@ -1864,7 +1864,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "已確認" } } @@ -3464,49 +3464,49 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Requête incorrecte" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "בקשה לא תקינה" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Richiesta negativa" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Złe żądanie" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Felaktig begäran" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Лош захтев" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "错误请求" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "錯誤請求" } } @@ -4560,7 +4560,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Kategorie" } }, @@ -4578,7 +4578,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Categoria" } }, @@ -4596,7 +4596,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Категорија" } }, @@ -11415,19 +11415,19 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Verschlüsseltes Senden fehlgeschlagen" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Invio crittografato fallito" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Шифровано слање није успело" } }, @@ -11947,7 +11947,7 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Esportazione" } }, @@ -11965,7 +11965,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Извоз" } }, @@ -11977,7 +11977,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "匯出" } } @@ -15281,13 +15281,13 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Unvollständig" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Incomplete" } }, @@ -15317,7 +15317,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Недовршен" } }, @@ -15329,7 +15329,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "尚未完成" } } @@ -19717,55 +19717,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Maximale Wiederholungen erreicht" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nombre maximum de retransmissions atteint" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "הגיע למקסימום השליחות מדש" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Raggiunta la massima ritrasmissione" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Osiągnięto limit retransmisji" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Max antal omsändningar nått" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Достигнут максималан број поновних слања" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "已达到最大重试次数" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "已達到最大重試次數" } } @@ -22387,7 +22387,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nachrichten" } }, @@ -22399,43 +22399,43 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "הודעות" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Messaggi" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Wiadomości" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Meddelanden" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Поруке" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "消息" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "訊息" } } @@ -25293,7 +25293,7 @@ }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Мод упаривања" } }, @@ -29776,43 +29776,43 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Speichern" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Sauvegarder" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "שמור" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Risparmiare" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Zapisz" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Spara" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Сачувај" } }, @@ -29824,7 +29824,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "儲存" } } From bad7e7da914543a11cd9ea000a3bd6cca9105db9 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Tue, 6 May 2025 12:13:12 -0700 Subject: [PATCH 78/93] Fix message localization --- Localizable.xcstrings | 159 +++++++++--------- .../TextMessageField/TextMessageField.swift | 2 +- protobufs | 2 +- 3 files changed, 83 insertions(+), 80 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index de4df376..99d00c53 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -11428,6 +11428,34 @@ } } }, + "Environment Metrics" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metriche dei sensori" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Метрике сензора" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "传感器指标" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "傳感器數據" + } + } + } + }, "Environment Metrics Log" : { "localizations" : { "it" : { @@ -14370,34 +14398,6 @@ } } }, - "How often power metrics are sent out over the mesh. Default is 30 minutes." : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Con quale frequenza vengono inviate le metriche di potenza attraverso la rete. L'impostazione predefinita è 30 minuti." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Колико често се метрике снаге шаљу преко мреже. Подразумевано је 30 минута." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "通过网格发送功率指标的频率。默认为 30 分钟。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電力指標透過網狀網路發送的頻率。預設為每 30 分鐘一次。" - } - } - } - }, "How often environment metrics are sent out over the mesh. Default is 30 minutes." : { "localizations" : { "it" : { @@ -14426,6 +14426,34 @@ } } }, + "How often power metrics are sent out over the mesh. Default is 30 minutes." : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Con quale frequenza vengono inviate le metriche di potenza attraverso la rete. L'impostazione predefinita è 30 minuti." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Колико често се метрике снаге шаљу преко мреже. Подразумевано је 30 минута." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通过网格发送功率指标的频率。默认为 30 分钟。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電力指標透過網狀網路發送的頻率。預設為每 30 分鐘一次。" + } + } + } + }, "How often should we try to get a GPS position." : { "localizations" : { "it" : { @@ -18592,28 +18620,6 @@ } } }, - "Long Range - Fast" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "A lungo raggio - Veloce" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Дугачки домет - Брзо" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Long Range - Fast" - } - } - } - }, "Long Name" : { "localizations" : { "de" : { @@ -18710,6 +18716,28 @@ } } }, + "Long Range - Fast" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "A lungo raggio - Veloce" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дугачки домет - Брзо" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Long Range - Fast" + } + } + } + }, "Long Range - Slow" : { "localizations" : { "it" : { @@ -22135,6 +22163,9 @@ } } } + }, + "message" : { + }, "Message" : { "localizations" : { @@ -31078,34 +31109,6 @@ } } }, - "Environment Metrics" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Metriche dei sensori" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Метрике сензора" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "传感器指标" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "傳感器數據" - } - } - } - }, "Sensor options" : { "localizations" : { "it" : { diff --git a/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift b/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift index c642a9b7..d60a0381 100644 --- a/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift +++ b/Meshtastic/Views/Messages/TextMessageField/TextMessageField.swift @@ -44,7 +44,7 @@ struct TextMessageField: View { } ZStack { - TextField("message", text: $typingMessage, axis: .vertical) + TextField("Message", text: $typingMessage, axis: .vertical) .onChange(of: typingMessage) { _, value in totalBytes = value.utf8.count while totalBytes > Self.maxbytes { diff --git a/protobufs b/protobufs index 27fac391..06864665 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 27fac39141d99fe727a0a1824c5397409b1aea75 +Subproject commit 068646653e8375fc145988026ad242a3cf70f7ab From 60cb358d8773ea3c2c019b35cd7277a706c6e2e1 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Wed, 7 May 2025 19:59:58 -0700 Subject: [PATCH 79/93] Bump version --- Meshtastic.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index bbdd3417..403492d2 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -1785,7 +1785,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.6.1; + MARKETING_VERSION = 2.6.2; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; @@ -1818,7 +1818,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.6.1; + MARKETING_VERSION = 2.6.2; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; @@ -1849,7 +1849,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.6.1; + MARKETING_VERSION = 2.6.2; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient.Widgets; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1881,7 +1881,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 2.6.1; + MARKETING_VERSION = 2.6.2; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient.Widgets; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; From 57687be704d2e0fd86e53a641fab4d9afd0a0682 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Wed, 7 May 2025 20:17:19 -0700 Subject: [PATCH 80/93] Update localization keys --- Localizable.xcstrings | 136 ++++-------------- Meshtastic/AppIntents/RestartNodeIntent.swift | 2 +- Meshtastic/Enums/DeviceEnums.swift | 2 +- .../Views/Nodes/Helpers/NodeDetail.swift | 4 +- 4 files changed, 35 insertions(+), 109 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index ec54892d..a90a92fc 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -5570,28 +5570,34 @@ }, "Client" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Client" + } + }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Cliente" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Клијент" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "客户端" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", - "value" : "客戶端" + "state" : "needs_review", + "value" : "Client" } } } @@ -9187,46 +9193,6 @@ } } }, - "device.role.name.client" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Client" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Client" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cliente" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Клијент" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "客户端" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Client" - } - } - } - }, "device.role.name.clientHidden" : { "localizations" : { "de" : { @@ -27442,157 +27408,117 @@ } } }, - "reboot" : { + "Reboot" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Neustart" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reboot" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Redémarrer" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "התחל מחדש" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Riavvio" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Uruchom ponownie" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Starta om" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Поновно покретање" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "重启" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "重新啟動" } } } }, - "Reboot Node?" : { + "Reboot node?" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Knoten neustarten?" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Riavviare il nodo?" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Поново покрени чвор?" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "重啟節點?" - } - } - } - }, - "reboot.node" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Knoten neustarten?" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reboot node?" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Redémarrer le noeud ?" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "התחל מכשיר מחדש??" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Riavviare il nodo?" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Uruchomić ponownie węzeł?" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Starta om nod?" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Поново покрени чвор?" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "重启节点?" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "重啟節點" } } diff --git a/Meshtastic/AppIntents/RestartNodeIntent.swift b/Meshtastic/AppIntents/RestartNodeIntent.swift index 7ae8095a..5f317a28 100644 --- a/Meshtastic/AppIntents/RestartNodeIntent.swift +++ b/Meshtastic/AppIntents/RestartNodeIntent.swift @@ -15,7 +15,7 @@ struct RestartNodeIntent: AppIntent { func perform() async throws -> some IntentResult { - try await requestConfirmation(result: .result(dialog: "Reboot Node?")) + try await requestConfirmation(result: .result(dialog: "Reboot node?")) if !BLEManager.shared.isConnected { throw AppIntentErrors.AppIntentError.notConnected diff --git a/Meshtastic/Enums/DeviceEnums.swift b/Meshtastic/Enums/DeviceEnums.swift index 0f132b9d..be2295f2 100644 --- a/Meshtastic/Enums/DeviceEnums.swift +++ b/Meshtastic/Enums/DeviceEnums.swift @@ -28,7 +28,7 @@ enum DeviceRoles: Int, CaseIterable, Identifiable { var name: String { switch self { case .client: - return "device.role.name.client".localized + return "Client".localized case .clientMute: return "device.role.name.clientMute".localized case .router: diff --git a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift index 43cb0d5a..081e7adc 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift @@ -499,14 +499,14 @@ struct NodeDetail: View { showingRebootConfirm = true } label: { Label( - "reboot", + "Reboot", systemImage: "arrow.triangle.2.circlepath" ) }.confirmationDialog( "Are you sure?", isPresented: $showingRebootConfirm ) { - Button("reboot.node", role: .destructive) { + Button("Reboot node?", role: .destructive) { if !bleManager.sendReboot( fromUser: connectedNode.user!, toUser: node.user!, From de4fed6577cea5f920bc0d17322eb725f9cd548e Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Wed, 7 May 2025 21:14:10 -0700 Subject: [PATCH 81/93] Localization key updates --- Localizable.xcstrings | 1929 +++++++---------- Meshtastic/Enums/AppSettingsEnums.swift | 2 +- .../Enums/CannedMessagesConfigEnums.swift | 2 +- Meshtastic/Enums/DeviceEnums.swift | 12 +- Meshtastic/Enums/MessagingEnums.swift | 16 +- .../Helpers/LoRaSignalStrengthIndicator.swift | 2 +- Meshtastic/Views/Settings/AppLog.swift | 4 +- .../Views/Settings/Logs/LogDetail.swift | 8 +- 8 files changed, 802 insertions(+), 1173 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index a90a92fc..58ac1a43 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -817,7 +817,8 @@ "value" : "%1$@, %2$@" } } - } + }, + "shouldTranslate" : false }, "%@: %lld / %lld" : { "localizations" : { @@ -1840,7 +1841,7 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Potwierdzono" } }, @@ -1858,7 +1859,7 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "确认" } }, @@ -2304,12 +2305,6 @@ "value" : "Dopo" } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "After" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -2906,12 +2901,6 @@ "value" : "Illuminazione ambientale" } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Ambient Lighting" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -2964,12 +2953,6 @@ "value" : "Configurazione dell'illuminazione ambientale" } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Ambient Lighting Config" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -4582,12 +4565,6 @@ "value" : "Categoria" } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Category" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -4608,7 +4585,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Category" } } @@ -5590,13 +5567,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "客户端" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Client" } } @@ -8511,12 +8488,6 @@ "value" : "Configurazione del dispositivo" } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Device Configuration" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -9781,12 +9752,6 @@ "value" : "Ruolo deprecato utilizzare il client." } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Router Client - Hybryda ról klienta i routera. Podobnie jak w przypadku routera, z tym że Router Client może być używany zarówno jako router, jak i klient połączony z aplikacją. Radia BLE/Wi-Fi i ekran OLED nie zostaną uśpione." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10925,12 +10890,6 @@ "value" : "Eco" } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Echo" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -10951,7 +10910,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Echo" } } @@ -11399,7 +11358,7 @@ }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "加密傳送失敗" } } @@ -11825,6 +11784,64 @@ } } }, + "Exclamation" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ausrufezeichen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Point d'exclamation" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "סימן קריאה" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Punto esclamativo" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wykrzyknik" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Utropstecken" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Узвичник" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "感叹号" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "驚嘆號" + } + } + } + }, "Expire" : { "localizations" : { "it" : { @@ -11917,12 +11934,6 @@ "value" : "Esportazione" } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Export" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -13983,6 +13994,58 @@ } } }, + "HaHa" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "HaHa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "HaHa" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "חחח" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "HaHa" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "HaHa" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Хахаха" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "哈哈" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "哈哈" + } + } + } + }, "Hardware" : { "localizations" : { "it" : { @@ -14113,6 +14176,64 @@ } } }, + "Heart" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Herz" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Coeur" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "לב" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Cuore" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serce" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Hjärta" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Срце" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "心" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "心" + } + } + } + }, "Help with App Development" : { "localizations" : { "it" : { @@ -15289,12 +15410,6 @@ "value" : "Incompleto" } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Incomplete" - } - }, "se" : { "stringUnit" : { "state" : "needs_review", @@ -15655,70 +15770,6 @@ } } }, - "inputevent.none" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keins" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "None" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucun" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "ללא" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessuno" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Brak" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ingen" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ништа" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "无" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "無" - } - } - } - }, "inputevent.right" : { "localizations" : { "de" : { @@ -18047,6 +18098,64 @@ } } }, + "Level" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Level" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Level" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Level" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Livello" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Level" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Level" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ниво" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Level" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Level" + } + } + } + }, "Licensed Operator" : { "localizations" : { "it" : { @@ -18283,262 +18392,6 @@ } } }, - "log.level" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Level" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Level" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Level" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Level" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Livello" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Level" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Level" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ниво" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Level" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Level" - } - } - } - }, - "log.process" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prozess" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Process" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Process" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Process" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Processo" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Process" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Process" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Процес" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Process" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Process" - } - } - } - }, - "log.subsystem" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Subsystem" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Subsystem" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Subsystem" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Subsystem" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sottosistema" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Subsystem" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Subsystem" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подсистем" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Subsystem" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Subsystem" - } - } - } - }, - "log.time" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zeit" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Time" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Time" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Time" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tempo" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Time" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Time" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Време" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Time" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Time" - } - } - } - }, "logging" : { "localizations" : { "de" : { @@ -19091,40 +18944,6 @@ } } }, - "lora.signal.strength.none" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Verbindung" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "None" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessuno" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Без" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "未知" - } - } - } - }, "LOW" : { "localizations" : { "it" : { @@ -19635,70 +19454,6 @@ } } }, - "map.usertrackingmode.none" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keiner" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "None" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucun" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "ללא" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessuno" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Brak" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ingen" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ни један" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "无" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "無" - } - } - } - }, "Max Retransmission Reached" : { "localizations" : { "de" : { @@ -23364,16 +23119,10 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Kein Kanal" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No Channel" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -23382,13 +23131,13 @@ }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "אין ערוץ" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nessun canale" } }, @@ -23400,13 +23149,13 @@ }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Ingen kanal" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Нема канала" } }, @@ -23506,16 +23255,10 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Keine Schnittstelle" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No Interface" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -23524,13 +23267,13 @@ }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "אין ממשק" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nessuna interfaccia" } }, @@ -23542,13 +23285,13 @@ }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Inget gränssnitt" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Нема интерфејса" } }, @@ -23570,16 +23313,10 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Keine PIN (geht einfach)" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No PIN (Just Works)" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -23588,13 +23325,13 @@ }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "ללא קוד (פשוט עובד)" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nessun PIN (funziona e basta)" } }, @@ -23606,13 +23343,13 @@ }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Ingen PIN (Bara fungerar)" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Нема ПИН-а (само ради)" } }, @@ -23684,16 +23421,10 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Keine Antwort" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No Response" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -23702,13 +23433,13 @@ }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "אין תגובה" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nessuna risposta" } }, @@ -23720,13 +23451,13 @@ }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Inget svar" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Нема одговора" } }, @@ -23748,16 +23479,10 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Keine Route" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No Route" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -23766,13 +23491,13 @@ }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "אין מסלול" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nessun percorso" } }, @@ -23784,13 +23509,13 @@ }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Ingen rutt" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Нема руте" } }, @@ -24190,6 +23915,64 @@ } } }, + "None" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Keins" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Aucun" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "ללא" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Nessuno" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Brak" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ingen" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ништа" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "无" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "無" + } + } + } + }, "Not a valid route file" : { "localizations" : { "it" : { @@ -24216,16 +23999,10 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nicht authorisiert" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Not Authorized" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -24234,31 +24011,31 @@ }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "לא מאושר" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Non autorizzato" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nieautoryzowany" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Inte auktoriserad" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Није ауторизовано" } }, @@ -25514,12 +25291,6 @@ "value" : "Configurazione del contatore PAX" } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "PAX Counter Config" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -26094,21 +25865,15 @@ }, "Please set a region" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Please set a region" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Impostare una regione" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Молимо изаберите регион" } }, @@ -26142,6 +25907,64 @@ } } }, + "Poop" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Kacke" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Caca" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "חרא" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Cacca" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kupa" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Bajs" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Кака" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "便便" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "便便" + } + } + } + }, "Position" : { "localizations" : { "de" : { @@ -26542,7 +26365,7 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Power" } }, @@ -26980,6 +26803,64 @@ } } }, + "Process" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prozess" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Process" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Process" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Processo" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Process" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Process" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Процес" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Process" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Process" + } + } + } + }, "Project information" : { "localizations" : { "it" : { @@ -27120,6 +27001,64 @@ } } }, + "Question" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Fragezeichen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Point d'interrogation" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "סימן שאלה" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Punto interrogativo" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Znak zapytania" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Frågetecken" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Знак питања" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "问号" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "問號" + } + } + } + }, "Radiation" : { "localizations" : { "it" : { @@ -27418,7 +27357,7 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Redémarrer" } }, @@ -27436,7 +27375,7 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Uruchom ponownie" } }, @@ -27454,13 +27393,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "重启" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "重新啟動" } } @@ -27476,7 +27415,7 @@ }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Redémarrer le noeud ?" } }, @@ -27494,7 +27433,7 @@ }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Uruchomić ponownie węzeł?" } }, @@ -27512,13 +27451,13 @@ }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "重启节点?" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "重啟節點" } } @@ -29556,31 +29495,25 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Satellit" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Satellite" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Satellite" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "לווין" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Satellite" } }, @@ -29592,13 +29525,13 @@ }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Satellit" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Сателит" } }, @@ -29620,13 +29553,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Satellite Flyover" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Satellite Flyover" } }, @@ -29638,13 +29565,13 @@ }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "לווין בשמיים" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Sorvolo satellitare" } }, @@ -29656,13 +29583,13 @@ }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Satellitöverflygning" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Прелет сателита" } }, @@ -30046,16 +29973,10 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Sekundär" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Secondary" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -30064,13 +29985,13 @@ }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "משני" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Secondario" } }, @@ -30082,13 +30003,13 @@ }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Sekundär" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Секундарни" } }, @@ -32562,31 +32483,25 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Standard" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Standard" } }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Standard" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "סטנדרטי" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Standard" } }, @@ -32598,13 +32513,13 @@ }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Standard" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Стандардно" } }, @@ -32626,13 +32541,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Standard Muted" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Standard Muted" } }, @@ -32644,13 +32553,13 @@ }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "סטנדרתי-השתק" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Standard Silenzioso" } }, @@ -32662,13 +32571,13 @@ }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Standard Muted" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Стандардно мутирано" } }, @@ -32942,6 +32851,70 @@ } } }, + "Subsystem" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Subsystem" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Subsystem" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Subsystem" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Subsystem" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sottosistema" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Subsystem" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Subsystem" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подсистем" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Subsystem" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Subsystem" + } + } + } + }, "Supported" : { "localizations" : { "de" : { @@ -33122,518 +33095,6 @@ } } }, - "tapback.exclamation" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ausrufezeichen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Exclamation Mark" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Point d'exclamation" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "סימן קריאה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Punto esclamativo" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wykrzyknik" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Utropstecken" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Узвичник" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "感叹号" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "驚嘆號" - } - } - } - }, - "tapback.haha" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "HaHa" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "HaHa" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "HaHa" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "חחח" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "HaHa" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "HaHa" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "HaHa" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Хахаха" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "哈哈" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "哈哈" - } - } - } - }, - "tapback.heart" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Herz" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Heart" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Coeur" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "לב" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cuore" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Serce" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hjärta" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Срце" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "心" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "心" - } - } - } - }, - "tapback.poop" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kacke" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Poop" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Caca" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "חרא" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cacca" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kupa" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bajs" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Кака" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "便便" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "便便" - } - } - } - }, - "tapback.question" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fragezeichen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Question Mark" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Point d'interrogation" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "סימן שאלה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Punto interrogativo" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Znak zapytania" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Frågetecken" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Знак питања" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "问号" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "問號" - } - } - } - }, - "tapback.thumbsdown" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Daumen runter" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thumbs Down" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pouce baissé" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אגודל למטה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pollici in giù" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kciuk w dół" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tummen ner" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Палац доле" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "倒大拇指" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "倒大拇指" - } - } - } - }, - "tapback.thumbsup" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Daumen hoch" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thumbs Up" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pouce levé" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אגודל למעלה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pollici in su" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kciuk w górę" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tummen upp" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Лајк" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "竖大拇指" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "豎大拇指" - } - } - } - }, - "tapback.wave" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Welle" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wave" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wave" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wave" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Onda" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wave" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vinka" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Махање" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wave" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "招手" - } - } - } - }, "telementry.hazardous" : { "localizations" : { "en" : { @@ -34364,16 +33825,10 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Das Paket ist zu groß" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "The packet is too large" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -34382,13 +33837,13 @@ }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "ההודעה ארוכה/גדולה מידי" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Il pacchetto è troppo grande" } }, @@ -34400,13 +33855,13 @@ }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Paketet är för stort" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Пакет је превелики" } }, @@ -34952,6 +34407,122 @@ } } }, + "Thumbs Down" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Daumen runter" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pouce baissé" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "אגודל למטה" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Pollici in giù" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kciuk w dół" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Tummen ner" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Палац доле" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "倒大拇指" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "倒大拇指" + } + } + } + }, + "Thumbs Up" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Daumen hoch" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pouce levé" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "אגודל למעלה" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Pollici in su" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kciuk w górę" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Tummen upp" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Лајк" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "竖大拇指" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "豎大拇指" + } + } + } + }, "Time" : { "localizations" : { "de" : { @@ -37496,6 +37067,64 @@ } } }, + "Wave" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Welle" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Wave" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Wave" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Onda" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Wave" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Vinka" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Махање" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Wave" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "招手" + } + } + } + }, "Waypoint Options" : { "localizations" : { "de" : { diff --git a/Meshtastic/Enums/AppSettingsEnums.swift b/Meshtastic/Enums/AppSettingsEnums.swift index 5ddcaad7..fbe64a90 100644 --- a/Meshtastic/Enums/AppSettingsEnums.swift +++ b/Meshtastic/Enums/AppSettingsEnums.swift @@ -78,7 +78,7 @@ enum UserTrackingModes: Int, CaseIterable, Identifiable { var description: String { switch self { case .none: - return "map.usertrackingmode.none".localized + return "None".localized case .follow: return "map.usertrackingmode.follow".localized case .followWithHeading: diff --git a/Meshtastic/Enums/CannedMessagesConfigEnums.swift b/Meshtastic/Enums/CannedMessagesConfigEnums.swift index 7209c8ed..306b078c 100644 --- a/Meshtastic/Enums/CannedMessagesConfigEnums.swift +++ b/Meshtastic/Enums/CannedMessagesConfigEnums.swift @@ -45,7 +45,7 @@ enum InputEventChars: Int, CaseIterable, Identifiable { switch self { case .none: - return "inputevent.none".localized + return "None".localized case .up: return "inputevent.up".localized case .down: diff --git a/Meshtastic/Enums/DeviceEnums.swift b/Meshtastic/Enums/DeviceEnums.swift index be2295f2..514f7fec 100644 --- a/Meshtastic/Enums/DeviceEnums.swift +++ b/Meshtastic/Enums/DeviceEnums.swift @@ -152,17 +152,17 @@ enum RebroadcastModes: Int, CaseIterable, Identifiable { var name: String { switch self { case .all: - return "All" + return "All".localized case .allSkipDecoding: - return "All Skip Decoding" + return "All Skip Decoding".localized case .localOnly: - return "Local Only" + return "Local Only".localized case .knownOnly: - return "Known Only" + return "Known Only".localized case .none: - return "None" + return "None".localized case .corePortnums: - return "Core Portnums Only" + return "Core Portnums Only".localized } } var description: String { diff --git a/Meshtastic/Enums/MessagingEnums.swift b/Meshtastic/Enums/MessagingEnums.swift index 193060fa..29f84eac 100644 --- a/Meshtastic/Enums/MessagingEnums.swift +++ b/Meshtastic/Enums/MessagingEnums.swift @@ -46,21 +46,21 @@ enum Tapbacks: Int, CaseIterable, Identifiable { var description: String { switch self { case .wave: - return "tapback.wave".localized + return "Wave".localized case .heart: - return "tapback.heart".localized + return "Heart".localized case .thumbsUp: - return "tapback.thumbsup".localized + return "Thumbs Up".localized case .thumbsDown: - return "tapback.thumbsdown".localized + return "Thumbs Down".localized case .haHa: - return "tapback.haha".localized + return "HaHa".localized case .exclamation: - return "tapback.exclamation".localized + return "Exclamation".localized case .question: - return "tapback.question".localized + return "Question".localized case .poop: - return "tapback.poop".localized + return "Poop".localized } } } diff --git a/Meshtastic/Views/Helpers/LoRaSignalStrengthIndicator.swift b/Meshtastic/Views/Helpers/LoRaSignalStrengthIndicator.swift index 688dcc24..3a64f6a7 100644 --- a/Meshtastic/Views/Helpers/LoRaSignalStrengthIndicator.swift +++ b/Meshtastic/Views/Helpers/LoRaSignalStrengthIndicator.swift @@ -47,7 +47,7 @@ enum LoRaSignalStrength: Int { var description: String { switch self { case .none: - return "lora.signal.strength.none".localized + return "None".localized case .bad: return "lora.signal.strength.bad".localized case .fair: diff --git a/Meshtastic/Views/Settings/AppLog.swift b/Meshtastic/Views/Settings/AppLog.swift index 76f87388..7a0154b6 100644 --- a/Meshtastic/Views/Settings/AppLog.swift +++ b/Meshtastic/Views/Settings/AppLog.swift @@ -75,11 +75,11 @@ struct AppLog: View { } } else { Table(logs, selection: $selection, sortOrder: $sortOrder) { - TableColumn("log.time") { value in + TableColumn("Time") { value in Text(value.date.formatted(dateFormatStyle)) } .width(min: 125, max: 150) - TableColumn("log.level") { value in + TableColumn("Level") { value in Text(value.level.description) .foregroundStyle(value.level.color) } diff --git a/Meshtastic/Views/Settings/Logs/LogDetail.swift b/Meshtastic/Views/Settings/Logs/LogDetail.swift index 31da29d4..19e03029 100644 --- a/Meshtastic/Views/Settings/Logs/LogDetail.swift +++ b/Meshtastic/Views/Settings/Logs/LogDetail.swift @@ -38,7 +38,7 @@ struct LogDetail: View { /// Time Label { HStack { - Text("log.time".localized + ":") + Text("Time".localized + ":") .font(idiom == .phone ? .caption : .title) .frame(width: idiom == .phone ? 115 : 190, alignment: .trailing) Text(log.date.formatted(dateFormatStyle)) @@ -56,7 +56,7 @@ struct LogDetail: View { /// Subsystem Label { HStack { - Text("log.subsystem".localized + ":") + Text("Subsystem".localized + ":") .font(idiom == .phone ? .caption : .title) .frame(width: idiom == .phone ? 115 : 190, alignment: .trailing) Text(log.subsystem) @@ -73,7 +73,7 @@ struct LogDetail: View { /// Process Label { HStack { - Text("log.process".localized + ":") + Text("Process".localized + ":") .font(idiom == .phone ? .caption : .title) .frame(width: idiom == .phone ? 115 : 190, alignment: .trailing) Text(log.process) @@ -90,7 +90,7 @@ struct LogDetail: View { /// Level Label { HStack { - Text("log.level".localized + ":") + Text("Level".localized + ":") .font(idiom == .phone ? .caption : .title) .frame(width: idiom == .phone ? 115 : 190, alignment: .trailing) Text(log.level.description) From 9dcc6b25ff4266a58f6e2f6fafcfba20660cb0eb Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Wed, 7 May 2025 21:22:33 -0700 Subject: [PATCH 82/93] Review translation keys --- Localizable.xcstrings | 414 ++++++++++++------------------------------ 1 file changed, 114 insertions(+), 300 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 58ac1a43..4cec2281 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -2293,12 +2293,6 @@ "value" : "Nach" } }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "After" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -3439,12 +3433,6 @@ }, "Bad Request" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Bad Request" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -4553,24 +4541,12 @@ "value" : "Category" } }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Category" - } - }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Categoria" } }, - "se" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Category" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -5547,21 +5523,15 @@ }, "Client" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Client" - } - }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Cliente" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Клијент" } }, @@ -8476,12 +8446,6 @@ "value" : "Gerätekonfiguration" } }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Device Configuration" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -10866,12 +10830,6 @@ }, "Echo" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Echo" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -11788,7 +11746,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ausrufezeichen" } }, @@ -11800,7 +11758,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "סימן קריאה" } }, @@ -11818,13 +11776,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Utropstecken" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Узвичник" } }, @@ -11910,36 +11868,18 @@ }, "Export" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Export" - } - }, "fr" : { "stringUnit" : { "state" : "needs_review", "value" : "Export" } }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Export" - } - }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Esportazione" } }, - "se" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Export" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -13996,12 +13936,6 @@ }, "HaHa" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "HaHa" - } - }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -14010,25 +13944,19 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "חחח" } }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "HaHa" - } - }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "HaHa" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Хахаха" } }, @@ -14180,7 +14108,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Herz" } }, @@ -14192,13 +14120,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "לב" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Cuore" } }, @@ -14210,13 +14138,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Hjärta" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Срце" } }, @@ -15398,15 +15326,9 @@ "value" : "Incomplete" } }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Incomplete" - } - }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Incompleto" } }, @@ -15438,12 +15360,6 @@ }, "India" : { "localizations" : { - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "India" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23119,7 +23035,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Kein Kanal" } }, @@ -23131,13 +23047,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "אין ערוץ" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nessun canale" } }, @@ -23149,13 +23065,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ingen kanal" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Нема канала" } }, @@ -23255,7 +23171,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Keine Schnittstelle" } }, @@ -23267,13 +23183,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "אין ממשק" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nessuna interfaccia" } }, @@ -23285,13 +23201,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Inget gränssnitt" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Нема интерфејса" } }, @@ -23313,7 +23229,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Keine PIN (geht einfach)" } }, @@ -23325,13 +23241,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "ללא קוד (פשוט עובד)" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nessun PIN (funziona e basta)" } }, @@ -23343,13 +23259,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ingen PIN (Bara fungerar)" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Нема ПИН-а (само ради)" } }, @@ -23421,7 +23337,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Keine Antwort" } }, @@ -23433,13 +23349,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "אין תגובה" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nessuna risposta" } }, @@ -23451,13 +23367,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Inget svar" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Нема одговора" } }, @@ -23479,7 +23395,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Keine Route" } }, @@ -23491,13 +23407,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "אין מסלול" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nessun percorso" } }, @@ -23509,13 +23425,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ingen rutt" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Нема руте" } }, @@ -23919,55 +23835,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Keins" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Aucun" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "ללא" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nessuno" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Brak" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ingen" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ништа" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "无" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "無" } } @@ -23999,7 +23915,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nicht authorisiert" } }, @@ -24011,31 +23927,31 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "לא מאושר" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Non autorizzato" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nieautoryzowany" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Inte auktoriserad" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Није ауторизовано" } }, @@ -25221,12 +25137,6 @@ }, "PAX Counter" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "PAX Counter" - } - }, "he" : { "stringUnit" : { "state" : "translated", @@ -25273,12 +25183,6 @@ }, "PAX Counter Config" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "PAX Counter Config" - } - }, "he" : { "stringUnit" : { "state" : "translated", @@ -25867,13 +25771,13 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Impostare una regione" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Молимо изаберите регион" } }, @@ -25911,7 +25815,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Kacke" } }, @@ -25923,13 +25827,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "חרא" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Cacca" } }, @@ -25941,13 +25845,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Bajs" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Кака" } }, @@ -25967,12 +25871,6 @@ }, "Position" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Position" - } - }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -25997,12 +25895,6 @@ "value" : "Pozycja" } }, - "se" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Position" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -27005,7 +26897,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Fragezeichen" } }, @@ -27017,7 +26909,7 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "סימן שאלה" } }, @@ -27035,13 +26927,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Frågetecken" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Знак питања" } }, @@ -27351,7 +27243,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Neustart" } }, @@ -27363,13 +27255,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "התחל מחדש" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Riavvio" } }, @@ -27381,13 +27273,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Starta om" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Поновно покретање" } }, @@ -27409,7 +27301,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Knoten neustarten?" } }, @@ -27421,13 +27313,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "התחל מכשיר מחדש??" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Riavviare il nodo?" } }, @@ -27439,13 +27331,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Starta om nod?" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Поново покрени чвор?" } }, @@ -29439,12 +29331,6 @@ }, "Russia" : { "localizations" : { - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Russia" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -29495,7 +29381,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Satellit" } }, @@ -29507,16 +29393,10 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "לווין" } }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Satellite" - } - }, "pl" : { "stringUnit" : { "state" : "translated", @@ -29525,13 +29405,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Satellit" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Сателит" } }, @@ -29551,12 +29431,6 @@ }, "Satellite Flyover" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Satellite Flyover" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -29565,13 +29439,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "לווין בשמיים" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Sorvolo satellitare" } }, @@ -29583,13 +29457,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Satellitöverflygning" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Прелет сателита" } }, @@ -29973,7 +29847,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Sekundär" } }, @@ -29985,13 +29859,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "משני" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Secondario" } }, @@ -30003,13 +29877,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Sekundär" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Секундарни" } }, @@ -30863,12 +30737,6 @@ }, "Serial" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Serial" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -32481,12 +32349,6 @@ }, "Standard" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Standard" - } - }, "fr" : { "stringUnit" : { "state" : "needs_review", @@ -32495,31 +32357,19 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "סטנדרטי" } }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Standard" - } - }, "pl" : { "stringUnit" : { "state" : "translated", "value" : "Standardowy" } }, - "se" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Standard" - } - }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Стандардно" } }, @@ -32539,12 +32389,6 @@ }, "Standard Muted" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Standard Muted" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -32553,13 +32397,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "סטנדרתי-השתק" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Standard Silenzioso" } }, @@ -32571,13 +32415,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Standard Muted" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Стандардно мутирано" } }, @@ -32995,12 +32839,6 @@ }, "Taiwan" : { "localizations" : { - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Taiwan" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33825,7 +33663,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Das Paket ist zu groß" } }, @@ -33837,13 +33675,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "ההודעה ארוכה/גדולה מידי" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Il pacchetto è troppo grande" } }, @@ -33855,13 +33693,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Paketet är för stort" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Пакет је превелики" } }, @@ -34411,7 +34249,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Daumen runter" } }, @@ -34423,13 +34261,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "אגודל למטה" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Pollici in giù" } }, @@ -34441,13 +34279,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Tummen ner" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Палац доле" } }, @@ -34469,7 +34307,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Daumen hoch" } }, @@ -34481,13 +34319,13 @@ }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "אגודל למעלה" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Pollici in su" } }, @@ -34499,13 +34337,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Tummen upp" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Лајк" } }, @@ -35781,12 +35619,6 @@ }, "Unknown" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Unknown" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -36233,12 +36065,6 @@ }, "Uptime" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Uptime" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -37071,7 +36897,7 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Welle" } }, @@ -37081,15 +36907,9 @@ "value" : "Wave" } }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Wave" - } - }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Onda" } }, @@ -37101,13 +36921,13 @@ }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Vinka" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Махање" } }, @@ -37351,12 +37171,6 @@ }, "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." - } - }, "he" : { "stringUnit" : { "state" : "translated", From db680f8cf69af70eeae56f71bfed10e54bb34fe5 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Wed, 7 May 2025 23:09:50 -0700 Subject: [PATCH 83/93] Update interval translation keys --- Localizable.xcstrings | 4595 +++++++---------- Meshtastic/Enums/AppSettingsEnums.swift | 16 +- .../Enums/CannedMessagesConfigEnums.swift | 14 +- Meshtastic/Enums/DisplayEnums.swift | 28 +- Meshtastic/Enums/IntervalEnums.swift | 96 +- Meshtastic/Enums/PositionConfigEnums.swift | 24 +- Meshtastic/Enums/SerialConfigEnums.swift | 14 +- Meshtastic/Enums/TelemetryEnums.swift | 12 +- Meshtastic/Tips/ChannelTips.swift | 4 +- .../Helpers/LoRaSignalStrengthIndicator.swift | 6 +- 10 files changed, 1994 insertions(+), 2815 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 4cec2281..0df57c57 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -2172,6 +2172,9 @@ } } } + }, + "Administration Enabled" : { + }, "Advanced" : { "localizations" : { @@ -3431,6 +3434,86 @@ } } }, + "Back" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zurück" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Retour" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אחרוה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indietro" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wstecz" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bakåt" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Назад" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "后退" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "返回" + } + } + } + }, + "Bad" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pessimo" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Лош" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "弱" + } + } + } + }, "Bad Request" : { "localizations" : { "fr" : { @@ -4535,12 +4618,6 @@ "value" : "Kategorie" } }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Category" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -10694,6 +10771,64 @@ } } }, + "Down" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Runter" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bas" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "למטה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In basso" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "W Dół" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ner" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Доле" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "下" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "下" + } + } + } + }, "Downlink Enabled" : { "localizations" : { "it" : { @@ -10896,6 +11031,64 @@ } } }, + "Eighteen Hours" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Achtzehn Stunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dix huit heures" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שמונה עשר שעות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diciotto ore" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Osiemnaście Godzin" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arton Timmar" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Осамнаест сати" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "十八小时" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "18 小時" + } + } + } + }, "Elev. Gain" : { "localizations" : { "it" : { @@ -11868,12 +12061,6 @@ }, "Export" : { "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Export" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -12150,6 +12337,34 @@ } } }, + "Fair" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ordentliche Signalstärke" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiera" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Прихватљив" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "尚可" + } + } + } + }, "Favorite" : { "localizations" : { "de" : { @@ -12284,6 +12499,64 @@ } } }, + "Fifteen Seconds" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fünfzehn Sekunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quinze secondes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "חמש עשרה שניות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quindici secondi" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Piętnaście Sekund" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Femton Sekunder" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Петнаест секунди" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "十五秒" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "15 秒" + } + } + } + }, "File Storage" : { "localizations" : { "it" : { @@ -12660,6 +12933,64 @@ } } }, + "Five Hours" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fünf Stunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cinq heures" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "חמש שעות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cinque ore" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pięć Godzin" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fem Timmar" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пет сати" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "五小时" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "5 小時" + } + } + } + }, "Five Minutes" : { "localizations" : { "de" : { @@ -12688,6 +13019,64 @@ } } }, + "Five Seconds" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fünf Sekunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cinq secondes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "חמש שניות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cinque secondi" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pięć Sekund" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fem Sekunder" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пет секунди" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "五秒" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "5 秒" + } + } + } + }, "Fixed Pin" : { "localizations" : { "de" : { @@ -12896,6 +13285,238 @@ } } }, + "Forty Eight Hours" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Achtundvierzig Stunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quarante huit heures" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ארבעים ושמונה שעות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quarantotto ore" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Czterdzieści Osiem Godzin" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fyrtioåtta Timmar" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Четртесет и осам сати" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "四十八小时" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "48小時" + } + } + } + }, + "Forty Five Seconds" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fündundvierzig Sekunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quarante cinq secondes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ארבעים וחמש שניות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quarantacinque secondi" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Czterdzieści Pięć Sekund" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fyrtiofem Sekunder" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Четрдесет и пет секунди" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "四十五秒" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "45 秒" + } + } + } + }, + "Four Hours" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vier Stunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quatre heures" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ארבע שעות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quattro ore" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cztery Godziny" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fyra Timmar" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Четири сата" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "四小时" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "4 小時" + } + } + } + }, + "Four Seconds" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vier Sekunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quatre secondes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ארבע שניות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quattro secondi" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cztery Sekundy" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fyra Sekunder" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Четири секунде" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "四秒" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "4 秒" + } + } + } + }, "Frequency" : { "localizations" : { "de" : { @@ -13244,6 +13865,28 @@ } } }, + "Good" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buono" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Добро" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "良好" + } + } + } + }, "GPIO" : { "localizations" : { "it" : { @@ -13936,12 +14579,6 @@ }, "HaHa" : { "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "HaHa" - } - }, "he" : { "stringUnit" : { "state" : "translated", @@ -14002,6 +14639,34 @@ } } }, + "Hazardous" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hazardous" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pericoloso" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Опасно" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "危險" + } + } + } + }, "Heading" : { "localizations" : { "it" : { @@ -14734,18 +15399,6 @@ }, "Hybrid" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hybrid" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hybrid" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -14798,18 +15451,6 @@ }, "Hybrid Flyover" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hybrid Flyover" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hybrid Flyover" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -15332,24 +15973,12 @@ "value" : "Incompleto" } }, - "se" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Incomplete" - } - }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Недовршен" } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Incomplete" - } - }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -15430,454 +16059,6 @@ } } }, - "inputevent.back" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zurück" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Back" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Retour" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אחרוה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Indietro" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wstecz" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bakåt" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Назад" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "后退" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "返回" - } - } - } - }, - "inputevent.cancel" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abbrechen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancel" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Annuler" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "בטל" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Annullamento" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anuluj" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Avbryt" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Откажи" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "取消" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "取消" - } - } - } - }, - "inputevent.down" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Runter" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Down" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bas" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "למטה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "In basso" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "W Dół" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ner" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Доле" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "下" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "下" - } - } - } - }, - "inputevent.left" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Links" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Left" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gauche" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שמאלה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "A sinistra" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "W Lewo" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vänster" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Лево" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "左" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "左" - } - } - } - }, - "inputevent.right" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rechts" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Right" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Droite" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "ימינה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Diritto" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "W Prawo" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Höger" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Десно" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "右" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "右" - } - } - } - }, - "inputevent.select" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Auswählen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectionner" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "בחר" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selezionare" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wybierz" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Välj" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Изабери" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "選擇" - } - } - } - }, - "inputevent.up" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hoch" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Up" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Haut" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "למעלה" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Su" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "W Górę" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Upp" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Горе" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "上" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "上" - } - } - } - }, "Inputs" : { "localizations" : { "it" : { @@ -15906,1734 +16087,6 @@ } } }, - "interval.eighteen.hours" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Achtzehn Stunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eighteen Hours" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dix huit heures" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שמונה עשר שעות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Diciotto ore" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Osiemnaście Godzin" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Arton Timmar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Осамнаест сати" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "十八小时" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "18 小時" - } - } - } - }, - "interval.fifteen.minutes" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fünfzehn Minuten" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fifteen Minutes" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quinze minutes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "חמש עשרה דקות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quindici minuti" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Piętnaście Minut" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Femton Minuter" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Петнаест минута" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "十五分钟" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "15 分鐘" - } - } - } - }, - "interval.fifteen.seconds" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fünfzehn Sekunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fifteen Seconds" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quinze secondes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "חמש עשרה שניות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quindici secondi" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Piętnaście Sekund" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Femton Sekunder" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Петнаест секунди" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "十五秒" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "15 秒" - } - } - } - }, - "interval.five.hours" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fünf Stunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Five Hours" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cinq heures" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "חמש שעות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cinque ore" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pięć Godzin" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fem Timmar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пет сати" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "五小时" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "5 小時" - } - } - } - }, - "interval.five.minutes" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fünf Minuten" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Five Minutes" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cinq minutes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "חמש דקות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cinque minuti" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pięć Minut" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fem Minuter" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пет минута" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "五分钟" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "5 分鐘" - } - } - } - }, - "interval.five.seconds" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fünf Sekunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Five Seconds" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cinq secondes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "חמש שניות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cinque secondi" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pięć Sekund" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fem Sekunder" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пет секунди" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "五秒" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "5 秒" - } - } - } - }, - "interval.fortyeight.hours" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Achtundvierzig Stunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Forty Eight Hours" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quarante huit heures" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "ארבעים ושמונה שעות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quarantotto ore" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Czterdzieści Osiem Godzin" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fyrtioåtta Timmar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Четртесет и осам сати" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "四十八小时" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "48小時" - } - } - } - }, - "interval.fortyfive.seconds" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fündundvierzig Sekunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Forty Five Seconds" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quarante cinq secondes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "ארבעים וחמש שניות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quarantacinque secondi" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Czterdzieści Pięć Sekund" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fyrtiofem Sekunder" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Четрдесет и пет секунди" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "四十五秒" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "45 秒" - } - } - } - }, - "interval.four.hours" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vier Stunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Four Hours" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quatre heures" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "ארבע שעות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quattro ore" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cztery Godziny" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fyra Timmar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Четири сата" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "四小时" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "4 小時" - } - } - } - }, - "interval.four.seconds" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vier Sekunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Four Seconds" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quatre secondes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "ארבע שניות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quattro secondi" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cztery Sekundy" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fyra Sekunder" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Четири секунде" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "四秒" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "4 秒" - } - } - } - }, - "interval.one.hour" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eine Stunde" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "One Hour" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Une heure" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שעה אחת" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Un'ora" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Jedna Godzina" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "En Timme" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Један сат" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "一小时" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "1 小時" - } - } - } - }, - "interval.one.minute" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eine Minute" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "One Minute" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Une minute" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "דקה אחת" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Un minuto" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Jedna Minuta" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "En Minut" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Један минут" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "一分钟" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "1 分鐘" - } - } - } - }, - "interval.one.second" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eine Sekunde" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "One Second" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Une seconde" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שניה אחת" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Un secondo" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Jedna Sekunda" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "En Sekund" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Један секунд" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "一秒" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "1 秒" - } - } - } - }, - "interval.seventytwo.hours" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zweiundsiebzig Stunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seventy Two Hours" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Soixante douze heures" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שבעים ושתיים שעות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Settantadue ore" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Siedemdziesiąt Dwie Godziny" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sjuttiotvå Timmar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Седамдесет и два сата" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "七十二小时" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "72小時" - } - } - } - }, - "interval.six.hours" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sechs Stunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Six Hours" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Six heures" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שש שעות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sei ore" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sześć Godzin" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sex Timmar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Шест сати" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "六小时" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "6 小時" - } - } - } - }, - "interval.ten.minutes" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zehn Minuten" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ten Minutes" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dix minutes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "עשר דקות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dieci minuti" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dziesięć Minut" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tio Minuter" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Десет минута" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "十分钟" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "10 分鐘" - } - } - } - }, - "interval.ten.seconds" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zehn Sekunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ten Seconds" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dix secondes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "עשר שניות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dieci secondi" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dziesięć Sekund" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tio Sekunder" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Десет секунди" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "十秒" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "10 秒" - } - } - } - }, - "interval.thirty.minutes" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dreißig Minuten" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thirty Minutes" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trente minutes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שלושים דקות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trenta minuti" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trzydzieści Minut" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trettio Minuter" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пола сата" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "三十分钟" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "30 分鐘" - } - } - } - }, - "interval.thirty.seconds" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dreißig Sekunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thirty Seconds" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trente secondes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שלושים שניות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trenta secondi" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trzydzieści Sekund" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trettio Sekunder" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Тридесет секунди" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "三十秒" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "30 秒" - } - } - } - }, - "interval.thirtysix.hours" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sechsunddreissig Stunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thirty Six Hours" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trente six heures" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שלושים ושש שעות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trentasei ore" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trzydzieści Sześć Godzin" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trettiosex Timmar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Тридесет и шест сати" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "三十六小时" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "36 小時" - } - } - } - }, - "interval.three.hours" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Drei Stunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Three Hours" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trois heures" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שלוש שעות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tre ore" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trzy Godziny" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tre Timmar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Три сата" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "三小时" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "3 小時" - } - } - } - }, - "interval.three.seconds" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Drei Sekunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Three Seconds" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trois secondes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שלוש שניות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tre secondi" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trzy Sekundy" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tre Sekunder" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Три секунде" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "三秒" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "3 秒" - } - } - } - }, - "interval.twelve.hours" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zwölf Stunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twelve Hours" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Douze heures" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שניים עשר שעות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dodici ore" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dwanaście Godzin" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tolv Timmar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Дванаест сати" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "十二小时" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "12 小時" - } - } - } - }, - "interval.twentyfour.hours" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vierundzwanzig Stunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twenty Four Hours" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vingt quatre heures" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "עשרים וארבע שעות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ventiquattro ore" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dwadzieścia Cztery Godziny" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tjugofyra Timmar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Двадесет четири сата" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "二十四小时" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "24 小時" - } - } - } - }, - "interval.two.hours" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zwei Stunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Two Hours" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Deux heures" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שעתיים" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Due ore" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dwie Godziny" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Två Timmar" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Два сата" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "两小时" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "2 小時" - } - } - } - }, - "interval.two.minutes" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zwei Minutes" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Two Minutes" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Deux minutes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שתי דקות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Due minuti" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dwie Minuty" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Två Minuter" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Два минута" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "两分钟" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "2 分鐘" - } - } - } - }, - "interval.two.seconds" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zwei Sekunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Two Seconds" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Deux secondes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שתי שניות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Due secondi" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dwie Sekundy" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Två Sekunder" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Две секунде" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "两秒" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "2 秒" - } - } - } - }, "inverted.top.bar.for.2.color.display" : { "localizations" : { "en" : { @@ -17986,6 +16439,64 @@ } } }, + "Left" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Links" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gauche" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שמאלה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "A sinistra" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "W Lewo" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vänster" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Лево" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "左" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "左" + } + } + } + }, "Legacy Administration" : { "localizations" : { "de" : { @@ -18758,108 +17269,6 @@ } } }, - "lora.signal.strength.bad" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Schlechte Signalstärke" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bad" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pessimo" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Лош" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "弱" - } - } - } - }, - "lora.signal.strength.fair" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ordentliche Signalstärke" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fair" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fiera" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Прихватљив" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "尚可" - } - } - } - }, - "lora.signal.strength.good" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gute Signalstärke" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Good" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Buono" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Добар" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "良好" - } - } - } - }, "LOW" : { "localizations" : { "it" : { @@ -22051,12 +20460,6 @@ "value" : "Nachrichten" } }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Messages" - } - }, "he" : { "stringUnit" : { "state" : "translated", @@ -22337,6 +20740,34 @@ } } }, + "Moderate" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Moderato" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Умерено" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "适度" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "中等" + } + } + } + }, "module.configuration" : { "localizations" : { "de" : { @@ -24219,7 +22650,7 @@ } } }, - "off" : { + "Off" : { "localizations" : { "de" : { "stringUnit" : { @@ -24227,12 +22658,6 @@ "value" : "Aus" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Off" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -24373,7 +22798,7 @@ } } }, - "on.boot" : { + "On Boot Only" : { "localizations" : { "de" : { "stringUnit" : { @@ -24381,12 +22806,6 @@ "value" : "Nur beim Starten" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "On Boot Only" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -24473,18 +22892,54 @@ "value" : "Eine Stunde" } }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "One Hour" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une heure" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שעה אחת" + } + }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Un'ora" } }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jedna Godzina" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "En Timme" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Један сат" } }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "一小时" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -24501,16 +22956,46 @@ "value" : "Eine Minute" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une minute" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "דקה אחת" + } + }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Un minuto" } }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jedna Minuta" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "En Minut" + } + }, "sr" : { "stringUnit" : { "state" : "translated", - "value" : "Једна минута" + "value" : "Један минут" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "一分钟" } }, "zh-Hant-TW" : { @@ -24521,6 +23006,64 @@ } } }, + "One Second" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eine Sekunde" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une seconde" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שניה אחת" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un secondo" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jedna Sekunda" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "En Sekund" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Један секунд" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "一秒" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 秒" + } + } + } + }, "Online" : { "localizations" : { "de" : { @@ -25240,12 +23783,6 @@ "state" : "translated", "value" : "Конфигурација PAX бројача примљена: %@" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "PAX Counter config received: %@" - } } } }, @@ -25871,12 +24408,6 @@ }, "Position" : { "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Position" - } - }, "he" : { "stringUnit" : { "state" : "translated", @@ -28462,6 +26993,64 @@ } } }, + "Right" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rechts" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Droite" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ימינה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diritto" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "W Prawo" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Höger" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Десно" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "右" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "右" + } + } + } + }, "ringtone" : { }, @@ -29385,12 +27974,6 @@ "value" : "Satellit" } }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Satellite" - } - }, "he" : { "stringUnit" : { "state" : "translated", @@ -30037,6 +28620,64 @@ } } }, + "Select" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Auswählen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sélectionner" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בחר" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selezionare" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wybierz" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Välj" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Изабери" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "選擇" + } + } + } + }, "Select a channel" : { "localizations" : { "de" : { @@ -30108,6 +28749,9 @@ } } } + }, + "Select a node from the drop down to manage connected or remote devices." : { + }, "Select a Trace Route" : { "localizations" : { @@ -31445,6 +30089,64 @@ } } }, + "Seventy Two Hours" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zweiundsiebzig Stunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Soixante douze heures" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שבעים ושתיים שעות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Settantadue ore" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Siedemdziesiąt Dwie Godziny" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sjuttiotvå Timmar" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Седамдесет и два сата" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "七十二小时" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "72小時" + } + } + } + }, "Share QR Code & Link" : { "localizations" : { "de" : { @@ -32035,6 +30737,64 @@ } } }, + "Six Hours" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sechs Stunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Six heures" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שש שעות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sei ore" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sześć Godzin" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sex Timmar" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Шест сати" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "六小时" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "6 小時" + } + } + } + }, "Smart Position" : { "localizations" : { "it" : { @@ -32349,12 +31109,6 @@ }, "Standard" : { "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Standard" - } - }, "he" : { "stringUnit" : { "state" : "translated", @@ -32933,90 +31687,6 @@ } } }, - "telementry.hazardous" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hazardous" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pericoloso" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Опасно" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "危險" - } - } - } - }, - "telementry.unhealthy" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unhealthy" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Non sano" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Нездраво" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "不健康" - } - } - } - }, - "telementry.veryUnhealthy" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Very Unhealthy" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Molto malsano" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Веома нездраво" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "非常不健康" - } - } - } - }, "telemetry" : { "localizations" : { "de" : { @@ -33145,96 +31815,6 @@ } } }, - "telemetry.good" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Good" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Buono" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Добро" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "良好" - } - } - } - }, - "telemetry.moderate" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Moderate" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Moderato" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Умерено" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "适度" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "中等" - } - } - } - }, - "telemetry.sensitive" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unhealthy for Sensitive Groups" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insalubre per i gruppi sensibili" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Нездраво за осетљиве групе" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "對敏感群體不健康" - } - } - } - }, "Temp" : { "localizations" : { "de" : { @@ -33299,16 +31879,46 @@ "value" : "Zehn Minuten" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dix minutes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "עשר דקות" + } + }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Dieci minuti" } }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dziesięć Minut" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tio Minuter" + } + }, "sr" : { "stringUnit" : { "state" : "translated", - "value" : "Десет пинута" + "value" : "Десет минута" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "十分钟" } }, "zh-Hant-TW" : { @@ -33319,6 +31929,64 @@ } } }, + "Ten Seconds" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zehn Sekunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dix secondes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "עשר שניות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dieci secondi" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dziesięć Sekund" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tio Sekunder" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Десет секунди" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "十秒" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "10 秒" + } + } + } + }, "Tertiary Admin Key" : { "localizations" : { "de" : { @@ -34037,16 +32705,46 @@ "value" : "Dreißig Minuten" } }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trente minutes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שלושים דקות" + } + }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Trenta minuti" } }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trzydzieści Minut" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trettio Minuter" + } + }, "sr" : { "stringUnit" : { "state" : "translated", - "value" : "Тридесет минута" + "value" : "Пола сата" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "三十分钟" } }, "zh-Hant-TW" : { @@ -34057,6 +32755,122 @@ } } }, + "Thirty Seconds" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dreißig Sekunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trente secondes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שלושים שניות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trenta secondi" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trzydzieści Sekund" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trettio Sekunder" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Тридесет секунди" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "三十秒" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 秒" + } + } + } + }, + "Thirty Six Hours" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sechsunddreissig Stunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trente six heures" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שלושים ושש שעות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trentasei ore" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trzydzieści Sześć Godzin" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trettiosex Timmar" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Тридесет и шест сати" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "三十六小时" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "36 小時" + } + } + } + }, "This conversation will be deleted." : { "localizations" : { "it" : { @@ -34245,6 +33059,122 @@ } } }, + "Three Hours" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Drei Stunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trois heures" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שלוש שעות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tre ore" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trzy Godziny" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tre Timmar" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Три сата" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "三小时" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "3 小時" + } + } + } + }, + "Three Seconds" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Drei Sekunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trois secondes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שלוש שניות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tre secondi" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trzy Sekundy" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tre Sekunder" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Три секунде" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "三秒" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "3 秒" + } + } + } + }, "Thumbs Down" : { "localizations" : { "de" : { @@ -34611,134 +33541,6 @@ } } }, - "tip.channel.admin.message" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Admin Kanal erkannt: Wähle einen Knoten vom Dropdown aus um verbundene oder entfernte Geräte zu verwalten." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Admin channel detected: Select a node from the drop down to manage connected or remote devices." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Admin channel detected: Select a node from the drop down to manage connected or remote devices." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Admin channel detected: Select a node from the drop down to manage connected or remote devices." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canale amministrativo rilevato: Selezionare un nodo dal menu a tendina per gestire i dispositivi collegati o remoti." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Admin channel detected: Select a node from the drop down to manage connected or remote devices." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Administratörskanal upptäckt: Välj en nod från rullgardinsmenyn för att hantera anslutna eller fjärranslutna enheter." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Детектован админ канал: Изаберите чвор из падајућег менија да бисте управљали повезаним или удаљеним уређајима." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "检测到 admin 频道:请从下拉菜单中选择一个节点,来管理已连接或远程设备。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "偵測到管理頻道:從下拉選單中選擇一個節點來管理連接或遠端設備。" - } - } - } - }, - "tip.channel.admin.title" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Admin Kanal" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Admin Channel" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Admin Channel" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Admin Channel" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canale Admin" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Admin Channel" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Administratörskanal" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Административни канал" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "admin 频道" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "管理頻道" - } - } - } - }, "tip.channels.create.message" : { "localizations" : { "de" : { @@ -35457,20 +34259,172 @@ } } }, + "Twelve Hours" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zwölf Stunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Douze heures" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שניים עשר שעות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dodici ore" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dwanaście Godzin" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tolv Timmar" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дванаест сати" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "十二小时" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "12 小時" + } + } + } + }, + "Twenty Four Hours" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vierundzwanzig Stunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vingt quatre heures" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "עשרים וארבע שעות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ventiquattro ore" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dwadzieścia Cztery Godziny" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tjugofyra Timmar" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Двадесет четири сата" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "二十四小时" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "24 小時" + } + } + } + }, "Two Hours" : { "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zwei Stunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deux heures" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שעתיים" + } + }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Due ore" } }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dwie Godziny" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Två Timmar" + } + }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Два сата" } }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "两小时" + } + }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -35479,6 +34433,122 @@ } } }, + "Two Minutes" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zwei Minutes" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deux minutes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שתי דקות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Due minuti" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dwie Minuty" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Två Minuter" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Два минута" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "两分钟" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "2 分鐘" + } + } + } + }, + "Two Seconds" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zwei Sekunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deux secondes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שתי שניות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Due secondi" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dwie Sekundy" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Två Sekunder" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Две секунде" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "两秒" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "2 秒" + } + } + } + }, "UDP Broadcast" : { "localizations" : { "it" : { @@ -35573,6 +34643,56 @@ } } }, + "Unhealthy" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unhealthy" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non sano" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Нездраво" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "不健康" + } + } + } + }, + "Unhealthy for Sensitive Groups" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insalubre per i gruppi sensibili" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Нездраво за осетљиве групе" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "對敏感群體不健康" + } + } + } + }, "United States" : { "localizations" : { "it" : { @@ -35807,6 +34927,64 @@ } } }, + "Up" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hoch" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Haut" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "למעלה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Su" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "W Górę" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Upp" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Горе" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "上" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "上" + } + } + } + }, "Up Down 1" : { "localizations" : { "it" : { @@ -36627,6 +35805,28 @@ } } }, + "Very Unhealthy" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Molto malsano" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Веома нездраво" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "非常不健康" + } + } + } + }, "very.long.range.slow" : { "localizations" : { "en" : { @@ -36901,24 +36101,12 @@ "value" : "Welle" } }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Wave" - } - }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Onda" } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Wave" - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -36931,12 +36119,6 @@ "value" : "Махање" } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Wave" - } - }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -37183,12 +36365,6 @@ "value" : "Quando è abilitato, il modulo PAX Counter conta il numero di persone che passano utilizzando il WiFi e il Bluetooth. Per il funzionamento del contatore PAX, sia il WiFI che il Bluetooth devono essere disattivati." } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work." - } - }, "se" : { "stringUnit" : { "state" : "translated", @@ -37419,7 +36595,8 @@ "value" : "X: %1$@, Y: %2$d" } } - } + }, + "shouldTranslate" : false }, "X: %@, Y: %f" : { "localizations" : { @@ -37453,7 +36630,8 @@ "value" : "X: %1$@, Y: %2$f" } } - } + }, + "shouldTranslate" : false }, "X: %@, Y: %lld" : { "localizations" : { @@ -37487,7 +36665,8 @@ "value" : "X: %1$@, Y: %2$lld" } } - } + }, + "shouldTranslate" : false }, "y" : { "localizations" : { diff --git a/Meshtastic/Enums/AppSettingsEnums.swift b/Meshtastic/Enums/AppSettingsEnums.swift index fbe64a90..9a86c363 100644 --- a/Meshtastic/Enums/AppSettingsEnums.swift +++ b/Meshtastic/Enums/AppSettingsEnums.swift @@ -117,21 +117,21 @@ enum LocationUpdateInterval: Int, CaseIterable, Identifiable { var description: String { switch self { case .tenSeconds: - return "interval.ten.seconds".localized + return "Ten Seconds".localized case .fifteenSeconds: - return "interval.fifteen.seconds".localized + return "Fifteen Seconds".localized case .thirtySeconds: - return "interval.thirty.seconds".localized + return "Thirty Seconds".localized case .fortyFiveSeconds: - return "interval.fortyfive.seconds".localized + return "Forty Five Seconds".localized case .oneMinute: - return "interval.one.minute".localized + return "One Minute".localized case .fiveMinutes: - return "interval.five.minutes".localized + return "Five Minutes".localized case .tenMinutes: - return "interval.ten.minutes".localized + return "Ten Minutes".localized case .fifteenMinutes: - return "interval.fifteen.minutes".localized + return "Fifteen Minutes".localized } } } diff --git a/Meshtastic/Enums/CannedMessagesConfigEnums.swift b/Meshtastic/Enums/CannedMessagesConfigEnums.swift index 306b078c..d08829bc 100644 --- a/Meshtastic/Enums/CannedMessagesConfigEnums.swift +++ b/Meshtastic/Enums/CannedMessagesConfigEnums.swift @@ -47,19 +47,19 @@ enum InputEventChars: Int, CaseIterable, Identifiable { case .none: return "None".localized case .up: - return "inputevent.up".localized + return "Up".localized case .down: - return "inputevent.down".localized + return "Down".localized case .left: - return "inputevent.left".localized + return "Left".localized case .right: - return "inputevent.right".localized + return "Right".localized case .select: - return "inputevent.select".localized + return "Select".localized case .back: - return "inputevent.back".localized + return "Back".localized case .cancel: - return "inputevent.cancel".localized + return "Cancel".localized } } func protoEnumValue() -> ModuleConfig.CannedMessageConfig.InputEventChar { diff --git a/Meshtastic/Enums/DisplayEnums.swift b/Meshtastic/Enums/DisplayEnums.swift index 25753f02..089140f0 100644 --- a/Meshtastic/Enums/DisplayEnums.swift +++ b/Meshtastic/Enums/DisplayEnums.swift @@ -49,21 +49,21 @@ enum ScreenOnIntervals: Int, CaseIterable, Identifiable { var description: String { switch self { case .fifteenSeconds: - return "interval.fifteen.seconds".localized + return "Fifteen Seconds".localized case .thirtySeconds: - return "interval.thirty.seconds".localized + return "Thirty Seconds".localized case .oneMinute: - return "interval.one.minute".localized + return "One Minute".localized case .fiveMinutes: - return "interval.five.minutes".localized + return "Five Minutes".localized case .tenMinutes: - return "interval.ten.minutes".localized + return "Ten Minutes".localized case .fifteenMinutes: - return "interval.fifteen.minutes".localized + return "Fifteen Minutes".localized case .thirtyMinutes: - return "interval.thirty.minutes".localized + return "Thirty Minutes".localized case .oneHour: - return "interval.one.hour".localized + return "One Hour".localized case .max: return "Always On".localized } @@ -87,17 +87,17 @@ enum ScreenCarouselIntervals: Int, CaseIterable, Identifiable { case .off: return "off".localized case .fifteenSeconds: - return "interval.fifteen.seconds".localized + return "Fifteen Seconds".localized case .thirtySeconds: - return "interval.thirty.seconds".localized + return "Thirty Seconds".localized case .oneMinute: - return "interval.one.minute".localized + return "One Minute".localized case .fiveMinutes: - return "interval.five.minutes".localized + return "Five Minutes".localized case .tenMinutes: - return "interval.ten.minutes".localized + return "Ten Minutes".localized case .fifteenMinutes: - return "interval.fifteen.minutes".localized + return "Fifteen Minutes".localized } } } diff --git a/Meshtastic/Enums/IntervalEnums.swift b/Meshtastic/Enums/IntervalEnums.swift index 976c8c92..a0513ad0 100644 --- a/Meshtastic/Enums/IntervalEnums.swift +++ b/Meshtastic/Enums/IntervalEnums.swift @@ -24,19 +24,19 @@ enum NagIntervals: Int, CaseIterable, Identifiable { case .unset: return "Unset".localized case .oneSecond: - return "interval.one.second".localized + return "One Second".localized case .fiveSeconds: - return "interval.five.seconds".localized + return "Five Seconds".localized case .tenSeconds: - return "interval.ten.seconds".localized + return "Ten Seconds".localized case .fifteenSeconds: - return "interval.fifteen.seconds".localized + return "Fifteen Seconds".localized case .thirtySeconds: - return "interval.thirty.seconds".localized + return "Thirty Seconds".localized case .oneMinute: - return "interval.one.minute".localized + return "One Minute".localized case .fiveMinutes: - return "interval.five.minutes".localized + return "Five Minutes".localized } } } @@ -61,23 +61,23 @@ enum OutputIntervals: Int, CaseIterable, Identifiable { case .unset: return "Unset".localized case .oneSecond: - return "interval.one.second".localized + return "One Second".localized case .twoSeconds: - return "interval.two.seconds".localized + return "Two Seconds".localized case .threeSeconds: - return "interval.three.seconds".localized + return "Three Seconds".localized case .fourSeconds: - return "interval.four.seconds".localized + return "Four Seconds".localized case .fiveSeconds: - return "interval.five.seconds".localized + return "Five Seconds".localized case .tenSeconds: - return "interval.ten.seconds".localized + return "Ten Seconds".localized case .fifteenSeconds: - return "interval.fifteen.seconds".localized + return "Fifteen Seconds".localized case .thirtySeconds: - return "interval.thirty.seconds".localized + return "Thirty Seconds".localized case .oneMinute: - return "interval.one.minute".localized + return "One Minute".localized } } } @@ -100,25 +100,25 @@ enum SenderIntervals: Int, CaseIterable, Identifiable { var description: String { switch self { case .off: - return "off".localized + return "Off".localized case .fifteenSeconds: - return "interval.fifteen.seconds".localized + return "Fifteen Seconds".localized case .thirtySeconds: - return "interval.thirty.seconds".localized + return "Thirty Seconds".localized case .fortyFiveSeconds: - return "interval.fortyfive.seconds".localized + return "Forty Five Seconds".localized case .oneMinute: - return "interval.one.minute".localized + return "One Minute".localized case .fiveMinutes: - return "interval.five.minutes".localized + return "Five Minutes".localized case .tenMinutes: - return "interval.ten.minutes".localized + return "Ten Minutes".localized case .fifteenMinutes: - return "interval.fifteen.minutes".localized + return "Fifteen Minutes".localized case .thirtyMinutes: - return "interval.thirty.minutes".localized + return "Thirty Minutes".localized case .oneHour: - return "interval.one.hour".localized + return "One Hour".localized } } } @@ -153,49 +153,49 @@ enum UpdateIntervals: Int, CaseIterable, Identifiable { switch self { case .tenSeconds: - return "interval.ten.seconds".localized + return "Ten Seconds".localized case .fifteenSeconds: - return "interval.fifteen.seconds".localized + return "Fifteen Seconds".localized case .thirtySeconds: - return "interval.thirty.seconds".localized + return "Thirty Seconds".localized case .fortyFiveSeconds: - return "interval.fortyfive.seconds".localized + return "Forty Five Seconds".localized case .oneMinute: - return "interval.one.minute".localized + return "One Minute".localized case .twoMinutes: - return "interval.two.minutes".localized + return "Two Minutes".localized case .fiveMinutes: - return "interval.five.minutes".localized + return "Five Minutes".localized case .tenMinutes: - return "interval.ten.minutes".localized + return "Ten Minutes".localized case .fifteenMinutes: - return "interval.fifteen.minutes".localized + return "Fifteen Minutes".localized case .thirtyMinutes: - return "interval.thirty.minutes".localized + return "Thirty Minutes".localized case .oneHour: - return "interval.one.hour".localized + return "One Hour".localized case .twoHours: - return "interval.two.hours".localized + return "Two Hours".localized case .threeHours: - return "interval.three.hours".localized + return "Three Hours".localized case .fourHours: - return "interval.four.hours".localized + return "Four Hours".localized case .fiveHours: - return "interval.five.hours".localized + return "Five Hours".localized case .sixHours: - return "interval.six.hours".localized + return "Six Hours".localized case .twelveHours: - return "interval.twelve.hours".localized + return "Twelve Hours".localized case .eighteenHours: - return "interval.eighteen.hours".localized + return "Eighteen Hours".localized case .twentyFourHours: - return "interval.twentyfour.hours".localized + return "Twenty Four Hours".localized case .thirtySixHours: - return "interval.thirtysix.hours".localized + return "Thirty Six Hours".localized case .fortyeightHours: - return "interval.fortyeight.hours".localized + return "Forty Eight Hours".localized case .seventyTwoHours: - return "interval.seventytwo.hours".localized + return "Seventy Two Hours".localized } } } diff --git a/Meshtastic/Enums/PositionConfigEnums.swift b/Meshtastic/Enums/PositionConfigEnums.swift index 6ee5059c..5c24510b 100644 --- a/Meshtastic/Enums/PositionConfigEnums.swift +++ b/Meshtastic/Enums/PositionConfigEnums.swift @@ -73,29 +73,29 @@ enum GpsUpdateIntervals: Int, CaseIterable, Identifiable { var description: String { switch self { case .thirtySeconds: - return "interval.thirty.seconds".localized + return "Thirty Seconds".localized case .oneMinute: - return "interval.one.minute".localized + return "One Minute".localized case .twoMinutes: - return "interval.two.minutes".localized + return "Two Minutes".localized case .fiveMinutes: - return "interval.five.minutes".localized + return "Five Minutes".localized case .tenMinutes: - return "interval.ten.minutes".localized + return "Ten Minutes".localized case .fifteenMinutes: - return "interval.fifteen.minutes".localized + return "Fifteen Minutes".localized case .thirtyMinutes: - return "interval.thirty.minutes".localized + return "Thirty Minutes".localized case .oneHour: - return "interval.one.hour".localized + return "One Hour".localized case .sixHours: - return "interval.six.hours".localized + return "Six Hours".localized case .twelveHours: - return "interval.twelve.hours".localized + return "Twelve Hours".localized case .twentyFourHours: - return "interval.twentyfour.hours".localized + return "Twenty Four Hours".localized case .maxInt32: - return "on.boot".localized + return "On Boot Only".localized } } } diff --git a/Meshtastic/Enums/SerialConfigEnums.swift b/Meshtastic/Enums/SerialConfigEnums.swift index 2d31725b..fe81d91a 100644 --- a/Meshtastic/Enums/SerialConfigEnums.swift +++ b/Meshtastic/Enums/SerialConfigEnums.swift @@ -168,19 +168,19 @@ enum SerialTimeoutIntervals: Int, CaseIterable, Identifiable { case .unset: return "Unset".localized case .oneSecond: - return "interval.one.second".localized + return "One Second".localized case .fiveSeconds: - return "interval.five.seconds".localized + return "Five Seconds".localized case .tenSeconds: - return "interval.ten.seconds".localized + return "Ten Seconds".localized case .fifteenSeconds: - return "interval.fifteen.seconds".localized + return "Thirty Seconds".localized case .thirtySeconds: - return "interval.thirty.seconds".localized + return "Thirty Seconds".localized case .oneMinute: - return "interval.one.minute".localized + return "One Minute".localized case .fiveMinutes: - return "interval.five.minutes".localized + return "Five Minutes".localized } } } diff --git a/Meshtastic/Enums/TelemetryEnums.swift b/Meshtastic/Enums/TelemetryEnums.swift index 68d65961..82856e71 100644 --- a/Meshtastic/Enums/TelemetryEnums.swift +++ b/Meshtastic/Enums/TelemetryEnums.swift @@ -20,17 +20,17 @@ enum Aqi: Int, CaseIterable, Identifiable { var description: String { switch self { case .good: - return "telemetry.good".localized + return "Good".localized case .moderate: - return "telemetry.moderate".localized + return "Moderate".localized case .sensitive: - return "telemetry.sensitive".localized + return "Unhealthy for Sensitive Groups".localized case .unhealthy: - return "telementry.unhealthy".localized + return "Unhealthy".localized case .veryUnhealthy: - return "telementry.veryUnhealthy".localized + return "Very Unhealthy".localized case .hazardous: - return "telementry.hazardous".localized + return "Hazardous".localized } } var color: Color { diff --git a/Meshtastic/Tips/ChannelTips.swift b/Meshtastic/Tips/ChannelTips.swift index 712a266e..6b6a0301 100644 --- a/Meshtastic/Tips/ChannelTips.swift +++ b/Meshtastic/Tips/ChannelTips.swift @@ -45,10 +45,10 @@ struct AdminChannelTip: Tip { return "tip.channel.admin" } var title: Text { - Text("tip.channel.admin.title") + Text("Administration Enabled") } var message: Text? { - Text("tip.channel.admin.message") + Text("Select a node from the drop down to manage connected or remote devices.") } var image: Image? { Image(systemName: "fibrechannel") diff --git a/Meshtastic/Views/Helpers/LoRaSignalStrengthIndicator.swift b/Meshtastic/Views/Helpers/LoRaSignalStrengthIndicator.swift index 3a64f6a7..bc5fb605 100644 --- a/Meshtastic/Views/Helpers/LoRaSignalStrengthIndicator.swift +++ b/Meshtastic/Views/Helpers/LoRaSignalStrengthIndicator.swift @@ -49,11 +49,11 @@ enum LoRaSignalStrength: Int { case .none: return "None".localized case .bad: - return "lora.signal.strength.bad".localized + return "Bad".localized case .fair: - return "lora.signal.strength.fair".localized + return "Fair".localized case .good: - return "lora.signal.strength.good".localized + return "Good".localized } } } From d318d960ea07829e013948fb1e2b6f67b6d84510 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Thu, 8 May 2025 08:59:24 -0700 Subject: [PATCH 84/93] More localization key --- Localizable.xcstrings | 1602 ++++++++--------- Meshtastic/Enums/SerialConfigEnums.swift | 10 +- Meshtastic/Extensions/Date.swift | 10 +- Meshtastic/Tips/MessagesTips.swift | 2 +- Meshtastic/Views/Messages/UserList.swift | 2 +- Meshtastic/Views/Nodes/PaxCounterLog.swift | 22 +- .../Views/Settings/Config/PowerConfig.swift | 8 +- .../Settings/Config/SaveConfigButton.swift | 2 +- Meshtastic/Views/Settings/UserConfig.swift | 2 +- 9 files changed, 776 insertions(+), 884 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 0df57c57..7f6a5ef9 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -30,7 +30,8 @@ "value" : "\t%@" } } - } + }, + "shouldTranslate" : false }, " %@" : { "localizations" : { @@ -58,7 +59,8 @@ "value" : "%@" } } - } + }, + "shouldTranslate" : false }, " %@%%" : { "localizations" : { @@ -74,7 +76,8 @@ "value" : " %@%%" } } - } + }, + "shouldTranslate" : false }, ": %@" : { "localizations" : { @@ -102,7 +105,8 @@ "value" : ": %@" } } - } + }, + "shouldTranslate" : false }, ": %d" : { "localizations" : { @@ -130,7 +134,8 @@ "value" : ": %d" } } - } + }, + "shouldTranslate" : false }, "(Re)define PIN_GPS_EN for your board." : { "localizations" : { @@ -186,7 +191,8 @@ "value" : "%@" } } - } + }, + "shouldTranslate" : false }, "%@ - %@" : { "localizations" : { @@ -1983,6 +1989,52 @@ } } }, + "ADC Override" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "ADC Override" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ADC Override" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Override ADC" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "ADC Override" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "ADC-överskrivning" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Преписивање ADC-а" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "ADC校正" + } + } + } + }, "Add Channel" : { "localizations" : { "it" : { @@ -2322,6 +2374,92 @@ } } }, + "After config values save the node will reboot." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nach dem Ändern der Einstellungen wird das Gerät neu starten." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une fois la configuration sauvegardée, le noeud redémarrera." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "לאחר שמירת הגדרות המכשיר יתחיל מחדש." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dopo il salvataggio dei valori di configurazione, il nodo si riavvia." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Po zapisaniu wartości konfiguracji węzeł zostanie zrestartowany." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Efter att konfigurationsvärdena sparats kommer noden att starta om." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Након што сачувате вредности конфигурације, чвор ће се поново покренути." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "节点将会在保存配置后重启。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "節點將會在設定儲存後重啟。" + } + } + } + }, + "Afternoon" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nachmittag" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pomeriggio" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пре подне" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "上午" + } + } + } + }, "Airtime" : { "localizations" : { "de" : { @@ -3684,6 +3822,58 @@ } } }, + "Battery" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Batterie" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Battery" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Batteria" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Battery" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Batteri" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Батерија" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "电池" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電池" + } + } + } + }, "Battery Level" : { "localizations" : { "de" : { @@ -3798,6 +3988,34 @@ } } }, + "BLE" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "BLE" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "BLE" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "БЛЕ" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "BLE" + } + } + } + }, "BLE Name" : { "localizations" : { "de" : { @@ -5985,110 +6203,6 @@ } } }, - "config.power.adc.multiplier" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Multiplier" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Multiplier" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Multiplier" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Moltiplicatore" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Multiplier" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Multiplikator" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Мултипликатор" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "修正倍數" - } - } - } - }, - "config.power.adc.override" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "ADC Override" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "ADC Override" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "ADC Override" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Override ADC" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "ADC Override" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "ADC-överskrivning" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Преписивање ADC-а" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "ADC校正" - } - } - } - }, "config.power.saving" : { "localizations" : { "de" : { @@ -6199,64 +6313,6 @@ } } }, - "config.power.section.battery" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Batterie" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Battery" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Battery" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Batteria" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Battery" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Batteri" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Батерија" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "电池" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電池" - } - } - } - }, "config.power.shutdown.on.power.loss" : { "localizations" : { "de" : { @@ -6535,70 +6591,6 @@ } } }, - "config.save.confirm" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nach dem Ändern der Einstellungen wird das Gerät neu starten." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "After config values save the node will reboot." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Une fois la configuration sauvegardée, le noeud redémarrera." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "לאחר שמירת הגדרות המכשיר יתחיל מחדש." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dopo il salvataggio dei valori di configurazione, il nodo si riavvia." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Po zapisaniu wartości konfiguracji węzeł zostanie zrestartowany." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Efter att konfigurationsvärdena sparats kommer noden att starta om." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Након што сачувате вредности конфигурације, чвор ће се поново покренути." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "节点将会在保存配置后重启。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "節點將會在設定儲存後重啟。" - } - } - } - }, "Configuration for: %@" : { "localizations" : { "de" : { @@ -7113,7 +7105,7 @@ } } }, - "contacts %@" : { + "Contacts (%@)" : { "localizations" : { "de" : { "stringUnit" : { @@ -7121,12 +7113,6 @@ "value" : "Kontakte (%@)" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contacts (%@)" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -11913,6 +11899,34 @@ } } }, + "Evening" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abend" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sera" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вече" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "下午" + } + } + } + }, "Exchange Positions" : { "localizations" : { "it" : { @@ -20554,6 +20568,40 @@ } } }, + "Midday" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mittag" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Midday" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mezzogiorno" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подне" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "中午" + } + } + } + }, "Minimum Distance" : { "localizations" : { "de" : { @@ -20832,6 +20880,34 @@ } } }, + "Morning" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Morgen" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mattina" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Јутро" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "早晨" + } + } + } + }, "MQTT" : { "localizations" : { "it" : { @@ -20988,6 +21064,52 @@ } } }, + "Multiplier" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Multiplier" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Multiplier" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Moltiplicatore" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Multiplier" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Multiplikator" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Мултипликатор" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "修正倍數" + } + } + } + }, "Must be a single emoji" : { "localizations" : { "it" : { @@ -21462,6 +21584,92 @@ } } }, + "Nighttime" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nacht" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notte" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ноћ" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "夜晚" + } + } + } + }, + "NMEA Positions" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "NMEA Positionen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Positions NMEA" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מיקומי NMEA" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizioni NMEA" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pozycje NMEA" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "NMEA-positioner" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "NMEA позиције" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "NMEA 位置" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "NMEA 位置" + } + } + } + }, "No Channel" : { "localizations" : { "de" : { @@ -22888,61 +23096,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Eine Stunde" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "One Hour" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Une heure" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "שעה אחת" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Un'ora" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Jedna Godzina" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "En Timme" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Један сат" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "一小时" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "1 小時" } } @@ -23786,40 +23988,6 @@ } } }, - "paxcounter.ble" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "BLE" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "BLE" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "BLE" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "БЛЕ" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "BLE" - } - } - } - }, "paxcounter.content.unavailable" : { "localizations" : { "en" : { @@ -23922,74 +24090,6 @@ } } }, - "paxcounter.total" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Total PAX" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Totale PAX" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Totalt PAX" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Укупно PAX" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX 總數" - } - } - } - }, - "paxcounter.wifi" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "WiFi" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "WiFi" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "WiFi" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "ВајФај" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "WiFi" - } - } - } - }, "Perform a factory reset on the node you are connected to" : { "localizations" : { "de" : { @@ -25312,6 +25412,64 @@ } } }, + "Protobufs" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Protobufs" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Protobufs" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Protobufs" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Protobufs" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Protobufy" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Protobufs" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Протобафови" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Protobufs" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Protobufs" + } + } + } + }, "Public Key" : { "localizations" : { "de" : { @@ -26286,176 +26444,6 @@ } } }, - "relativetimeofday.afternoon" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nachmittag" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Afternoon" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pomeriggio" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пре подне" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "上午" - } - } - } - }, - "relativetimeofday.evening" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abend" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Evening" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sera" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Вече" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "下午" - } - } - } - }, - "relativetimeofday.midday" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mittag" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Midday" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mezzogiorno" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подне" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "中午" - } - } - } - }, - "relativetimeofday.morning" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Morgen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Morning" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mattina" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Јутро" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "早晨" - } - } - } - }, - "relativetimeofday.nighttime" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nacht" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nighttime" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notte" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ноћ" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "夜晚" - } - } - } - }, "Release Notes" : { "localizations" : { "it" : { @@ -29551,262 +29539,6 @@ } } }, - "serial.mode.nmea" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "NMEA Positionen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "NMEA Positions" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Positions NMEA" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מיקומי NMEA" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Posizioni NMEA" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pozycje NMEA" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "NMEA-positioner" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "NMEA позиције" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "NMEA 位置" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "NMEA 位置" - } - } - } - }, - "serial.mode.proto" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Protobufs" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Protobufs" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Protobufs" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Protobufs" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Protobufs" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Protobufy" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Protobufs" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Протобафови" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Protobufs" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Protobufs" - } - } - } - }, - "serial.mode.simple" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Einfach" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Simple" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Simple" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "פשוט" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Semplice" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prosty" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enkel" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Једноставни" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "简单" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "簡易" - } - } - } - }, - "serial.mode.txtmsg" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Textnachricht" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Text Message" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message texte" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הודעת טקסט" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messaggio di testo" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wiadomość tekstowa" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Textmeddelande" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Текстуална порука" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "文本消息" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "文字訊息" - } - } - } - }, "Series" : { "localizations" : { "it" : { @@ -30709,6 +30441,64 @@ } } }, + "Simple" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Einfach" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Simple" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "פשוט" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Semplice" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prosty" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enkel" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Једноставни" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "简单" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "簡易" + } + } + } + }, "Singapore 923mhz" : { "localizations" : { "en" : { @@ -32021,6 +31811,64 @@ } } }, + "Text Message" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Textnachricht" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Message texte" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הודעת טקסט" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio di testo" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wiadomość tekstowa" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Textmeddelande" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Текстуална порука" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "文本消息" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "文字訊息" + } + } + } + }, "tft.full.color.displays" : { "localizations" : { "en" : { @@ -33797,70 +33645,6 @@ } } }, - "tip.messages.message" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Du kannst Kanalnachrichten (Gruppenchats) und Direktnachrichten senden und empfangen. Bei jeder Nachricht kannst du lange drücken, um verfügbare Aktionen wie Kopieren, Antworten, Tapback und Löschen sowie Zustelldetails anzuzeigen." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "You can send and receive channel (group chats) and direct messages. From any message you can long press to see available actions like copy, reply, tapback and delete as well as delivery details." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vous pouvez envoyer et recevoir des canaux (chats de groupe) et des messages directs. Depuis n’importe quel message, vous pouvez faire un appui long pour voir les actions possibles comme copier, répondre, tapback et supprimer ainsi que les détails de l'envoi." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "ניתן לשלוח הודעות ערוץ (קבוצות צ'אט) והודעות פרטיות. על הודעה ניתן לעשות לחיצה ארוכה בכדי לראות פעולות אפשריות כגון העתק, הגב, תגובה מהירה, מחק ובנוסף לראות מצב שליחה." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "È possibile inviare e ricevere messaggi di canale (chat di gruppo) e messaggi diretti. Da qualsiasi messaggio è possibile premere a lungo per visualizzare le azioni disponibili, come copia, risposta, tapback e cancellazione, nonché i dettagli di consegna." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "You can send and receive channel (group chats) and direct messages. From any message you can long press to see available actions like copy, reply, tapback and delete as well as delivery details." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Du kan skicka och ta emot kanalmeddelanden (gruppchatt) och direkta meddelanden. Från alla meddelanden kan du långtrycka för att se tillgängliga åtgärder som kopiera, svara, tapback och radera samt leveransdetaljer." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Можете слати и примати поруке у каналима (групним четовима) и директне поруке. Из било које поруке можете дуго притиснути да бисте видели доступне радње као што су копирање, одговор, реакција и брисање, као и детаље о испоруци." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "您可以发送和接收群聊或私聊消息。在任何消息中,您都可以长按查看可用的操作,如复制、回复、拍一拍、删除以及投递详情。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "您可以傳送及接收頻道(群組聊天)和私人訊息。對任何訊息長按,可顯示操作選單,包括複製、回覆、表情回應、刪除及傳送詳情等功能。" - } - } - } - }, "TLS Enabled" : { "localizations" : { "it" : { @@ -33949,6 +33733,34 @@ } } }, + "Total PAX" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Totale PAX" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Totalt PAX" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Укупно PAX" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX 總數" + } + } + } + }, "Trace Route" : { "localizations" : { "it" : { @@ -34645,27 +34457,21 @@ }, "Unhealthy" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unhealthy" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Non sano" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Нездраво" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "不健康" } } @@ -36441,6 +36247,34 @@ } } }, + "WiFi" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "WiFi" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "WiFi" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ВајФај" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "WiFi" + } + } + } + }, "WiFi Options" : { "localizations" : { "de" : { @@ -36752,6 +36586,64 @@ } } }, + "You can send and receive channel (group chats) and direct messages. From any message you can long press to see available actions like copy, reply, tapback and delete as well as delivery details." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Du kannst Kanalnachrichten (Gruppenchats) und Direktnachrichten senden und empfangen. Bei jeder Nachricht kannst du lange drücken, um verfügbare Aktionen wie Kopieren, Antworten, Tapback und Löschen sowie Zustelldetails anzuzeigen." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vous pouvez envoyer et recevoir des canaux (chats de groupe) et des messages directs. Depuis n’importe quel message, vous pouvez faire un appui long pour voir les actions possibles comme copier, répondre, tapback et supprimer ainsi que les détails de l'envoi." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ניתן לשלוח הודעות ערוץ (קבוצות צ'אט) והודעות פרטיות. על הודעה ניתן לעשות לחיצה ארוכה בכדי לראות פעולות אפשריות כגון העתק, הגב, תגובה מהירה, מחק ובנוסף לראות מצב שליחה." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È possibile inviare e ricevere messaggi di canale (chat di gruppo) e messaggi diretti. Da qualsiasi messaggio è possibile premere a lungo per visualizzare le azioni disponibili, come copia, risposta, tapback e cancellazione, nonché i dettagli di consegna." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "You can send and receive channel (group chats) and direct messages. From any message you can long press to see available actions like copy, reply, tapback and delete as well as delivery details." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Du kan skicka och ta emot kanalmeddelanden (gruppchatt) och direkta meddelanden. Från alla meddelanden kan du långtrycka för att se tillgängliga åtgärder som kopiera, svara, tapback och radera samt leveransdetaljer." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Можете слати и примати поруке у каналима (групним четовима) и директне поруке. Из било које поруке можете дуго притиснути да бисте видели доступне радње као што су копирање, одговор, реакција и брисање, као и детаље о испоруци." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "您可以发送和接收群聊或私聊消息。在任何消息中,您都可以长按查看可用的操作,如复制、回复、拍一拍、删除以及投递详情。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "您可以傳送及接收頻道(群組聊天)和私人訊息。對任何訊息長按,可顯示操作選單,包括複製、回覆、表情回應、刪除及傳送詳情等功能。" + } + } + } + }, "Your current location will be set as the fixed position and broadcast over the mesh on the position interval." : { "localizations" : { "it" : { diff --git a/Meshtastic/Enums/SerialConfigEnums.swift b/Meshtastic/Enums/SerialConfigEnums.swift index fe81d91a..681ef89e 100644 --- a/Meshtastic/Enums/SerialConfigEnums.swift +++ b/Meshtastic/Enums/SerialConfigEnums.swift @@ -120,15 +120,15 @@ enum SerialModeTypes: Int, CaseIterable, Identifiable { case .default: return "Default".localized case .simple: - return "serial.mode.simple".localized + return "Simple".localized case .proto: - return "serial.mode.proto".localized + return "Protobufs".localized case .txtmsg: - return "serial.mode.txtmsg".localized + return "Text Message".localized case .nmea: - return "serial.mode.nmea".localized + return "NMEA Positions".localized case .caltopo: - return "serial.mode.caltopo".localized + return "CALTOPO".localized } } func protoEnumValue() -> ModuleConfig.SerialConfig.Serial_Mode { diff --git a/Meshtastic/Extensions/Date.swift b/Meshtastic/Extensions/Date.swift index 25bf034d..f0b27331 100644 --- a/Meshtastic/Extensions/Date.swift +++ b/Meshtastic/Extensions/Date.swift @@ -30,11 +30,11 @@ extension Date { let hour = Calendar.current.component(.hour, from: self) switch hour { - case 6..<12: return "relativetimeofday.morning".localized - case 12: return "relativetimeofday.midday".localized - case 13..<17: return "relativetimeofday.afternoon".localized - case 17..<22: return "relativetimeofday.evening".localized - default: return "relativetimeofday.nighttime".localized + case 6..<12: return "Morning".localized + case 12: return "Midday".localized + case 13..<17: return "Afternoon".localized + case 17..<22: return "Evening".localized + default: return "Nighttime".localized } } } diff --git a/Meshtastic/Tips/MessagesTips.swift b/Meshtastic/Tips/MessagesTips.swift index a470dcaa..1e5ac07c 100644 --- a/Meshtastic/Tips/MessagesTips.swift +++ b/Meshtastic/Tips/MessagesTips.swift @@ -16,7 +16,7 @@ struct MessagesTip: Tip { Text("Messages") } var message: Text? { - Text("tip.messages.message") + Text("You can send and receive channel (group chats) and direct messages. From any message you can long press to see available actions like copy, reply, tapback and delete as well as delivery details.") } var image: Image? { Image(systemName: "bubble.left.and.bubble.right") diff --git a/Meshtastic/Views/Messages/UserList.swift b/Meshtastic/Views/Messages/UserList.swift index 7a7193f2..7e57ce8c 100644 --- a/Meshtastic/Views/Messages/UserList.swift +++ b/Meshtastic/Views/Messages/UserList.swift @@ -194,7 +194,7 @@ struct UserList: View { } } .listStyle(.plain) - .navigationTitle(String.localizedStringWithFormat("contacts %@".localized, String(users.count == 0 ? 0 : users.count))) + .navigationTitle(String.localizedStringWithFormat("Contacts (%@)".localized, String(users.count == 0 ? 0 : users.count))) .sheet(isPresented: $editingFilters) { NodeListFilter(filterTitle: "Contact Filters", viaLora: $viaLora, viaMqtt: $viaMqtt, isOnline: $isOnline, isPkiEncrypted: $isPkiEncrypted, isFavorite: $isFavorite, isIgnored: $isIgnored, isEnvironment: $isEnvironment, distanceFilter: $distanceFilter, maximumDistance: $maxDistance, hopsAway: $hopsAway, roleFilter: $roleFilter, deviceRoles: $deviceRoles) } diff --git a/Meshtastic/Views/Nodes/PaxCounterLog.swift b/Meshtastic/Views/Nodes/PaxCounterLog.swift index 58d68bb1..ed5a87c8 100644 --- a/Meshtastic/Views/Nodes/PaxCounterLog.swift +++ b/Meshtastic/Views/Nodes/PaxCounterLog.swift @@ -44,7 +44,7 @@ struct PaxCounterLog: View { y: .value("y", (point.wifi + point.ble)) ) } - .accessibilityLabel("paxcounter.total") + .accessibilityLabel("Total PAX") .accessibilityValue("X: \(point.time!), Y: \(point.wifi + point.ble)") .foregroundStyle(paxChartColor) .interpolationMethod(.cardinal) @@ -55,7 +55,7 @@ struct PaxCounterLog: View { y: .value("y", point.wifi) ) } - .accessibilityLabel("paxcounter.wifi") + .accessibilityLabel("WiFi") .accessibilityValue("X: \(point.time!), Y: \(point.wifi)") .foregroundStyle(wifiChartColor) @@ -65,7 +65,7 @@ struct PaxCounterLog: View { y: .value("y", point.ble) ) } - .accessibilityLabel("paxcounter.ble") + .accessibilityLabel("BLE") .accessibilityValue("X: \(point.time!), Y: \(point.ble)") .foregroundStyle(bleChartColor) } @@ -76,9 +76,9 @@ struct PaxCounterLog: View { .chartXAxis(.automatic) .chartYScale(domain: 0...maxValue) .chartForegroundStyleScale([ - "paxcounter.ble".localized: .blue, - "paxcounter.wifi".localized: .orange, - "paxcounter.total".localized: .green + "BLE".localized: .blue, + "WiFi".localized: .orange, + "Total PAX".localized: .green ]) .chartLegend(position: .automatic, alignment: .bottom) } @@ -89,13 +89,13 @@ struct PaxCounterLog: View { if UIScreen.main.bounds.size.width > 768 && (UIDevice.current.userInterfaceIdiom == .pad || UIDevice.current.userInterfaceIdiom == .mac) { // Add a table for mac and ipad Table(pax) { - TableColumn("paxcounter.ble") { pc in + TableColumn("BLE") { pc in Text("\(pc.ble)") } - TableColumn("paxcounter.wifi") { pc in + TableColumn("WiFi") { pc in Text("\(pc.wifi)") } - TableColumn("paxcounter.total") { pc in + TableColumn("Total PAX") { pc in Text("\(pc.wifi + pc.ble)") } TableColumn("Uptime") { pc in @@ -120,10 +120,10 @@ struct PaxCounterLog: View { ] LazyVGrid(columns: columns, alignment: .leading, spacing: 1) { GridRow { - Text("paxcounter.ble") + Text("BLE") .font(.caption) .fontWeight(.bold) - Text("paxcounter.wifi") + Text("WiFi") .font(.caption) .fontWeight(.bold) Text("Total") diff --git a/Meshtastic/Views/Settings/Config/PowerConfig.swift b/Meshtastic/Views/Settings/Config/PowerConfig.swift index 0c94e646..5fde379c 100644 --- a/Meshtastic/Views/Settings/Config/PowerConfig.swift +++ b/Meshtastic/Views/Settings/Config/PowerConfig.swift @@ -55,15 +55,15 @@ struct PowerConfig: View { if currentDevice?.architecture == .esp32 || currentDevice?.architecture == .esp32S3 { Section { Toggle(isOn: $adcOverride) { - Text("config.power.adc.override") + Text("ADC Override") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) if adcOverride { HStack { - Text("config.power.adc.multiplier") + Text("Multiplier") Spacer() - FloatField(title: "config.power.adc.multiplier", number: $adcMultiplier) { + FloatField(title: "Multiplier", number: $adcMultiplier) { (2.0 ... 6.0).contains($0) } .focused($isFocused) @@ -71,7 +71,7 @@ struct PowerConfig: View { } } } header: { - Text("config.power.section.battery") + Text("Battery") } // Section { // Picker("config.power.wait.bluetooth.secs", selection: $waitBluetoothSecs) { diff --git a/Meshtastic/Views/Settings/Config/SaveConfigButton.swift b/Meshtastic/Views/Settings/Config/SaveConfigButton.swift index 36b92443..6cba6785 100644 --- a/Meshtastic/Views/Settings/Config/SaveConfigButton.swift +++ b/Meshtastic/Views/Settings/Config/SaveConfigButton.swift @@ -30,7 +30,7 @@ struct SaveConfigButton: View { onConfirmation() } } message: { - Text("config.save.confirm") + Text("After config values save the node will reboot.") } } } diff --git a/Meshtastic/Views/Settings/UserConfig.swift b/Meshtastic/Views/Settings/UserConfig.swift index 51f55dbe..4a47255c 100644 --- a/Meshtastic/Views/Settings/UserConfig.swift +++ b/Meshtastic/Views/Settings/UserConfig.swift @@ -186,7 +186,7 @@ struct UserConfig: View { } } } message: { - Text("config.save.confirm") + Text("After config values save the node will reboot.") } } Spacer() From 9bed5e34df02417aead11592a072e8b272a2abd7 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Thu, 8 May 2025 11:29:18 -0700 Subject: [PATCH 85/93] Localize device role strings --- Localizable.xcstrings | 2156 ++++++++--------- Meshtastic/Enums/DeviceEnums.swift | 51 +- .../Views/Settings/Config/DeviceConfig.swift | 3 + Meshtastic/Views/Settings/RouteRecorder.swift | 4 +- 4 files changed, 987 insertions(+), 1227 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 7f6a5ef9..d167f561 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -3176,6 +3176,64 @@ } } }, + "App connected or stand alone messaging device." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Client (Standard) - Mit App verbundener Client." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Application connectée ou appareil de messagerie autonome." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אפליקציה מחוברת או מכשיר תקשורת עצמאי." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo di messaggistica collegato all'app o indipendente." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klient (domyślnie) - Klient połączony z aplikacją." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Appansluten eller fristående meddelandeenhet." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Апликација повезана или самостални уређај за размену порука." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "连接 App 或独立的消息发送设备。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "可連接 App 或作為獨立運作的訊息裝置。" + } + } + } + }, "App Data" : { "localizations" : { "it" : { @@ -4390,6 +4448,180 @@ } } }, + "Broadcasts GPS position packets as priority." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sendet GPS-Positionspakete mit Priorität." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Transmet les paquets de positions GPS en priorité." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "משדר מיקום GPS בעדיפות גבוהה." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmette i pacchetti di posizione GPS come priorità." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tracker - Do użytku z urządzeniami przeznaczonymi jako śledzenie GPS. Pakiety pozycyjne wysyłane z tego urządzenia będą miały wyższy priorytet, z nadawaniem pozycji co dwie minuty. Inteligentna transmisja pozycji będzie domyślnie wyłączona." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sänder ut GPS-positionspaket som prioritet." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Емитује пакете са GPS позицијом као приоритет." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "定位模式 - 用于作为 GPS 跟踪器。从该设备发送的定位数据包优先级较高,每两分钟广播一次。智能位置广播默认为关闭。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "優先傳送 GPS 位置封包。" + } + } + } + }, + "Broadcasts location as message to default channel regularly for to assist with device recovery." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sendet den Standort regelmäßig als Nachricht an den Standardkanal, um die Suche nach dem Gerät zu unterstützen." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Transmet régulièrement la position par message dans le canal par défaut pour vous aider à retrouver l'appareil." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "משדר מיקום כהודעה לערוץ ברירת מחדל לעיתים קבועות בכדי לסייע במציאת המכשיר." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmette regolarmente la posizione come messaggio al canale predefinito per assistere il recupero del dispositivo." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Broadcasts location as message to default channel regularly for to assist with device recovery." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sänder regelbundet ut plats som meddelande till standardkanalen för att underlätta återhämtning av enheten." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Редовно емитује локацију као поруку подразумеваном каналу ради помоћи при проналаску уређаја." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "定期向默认信道发送位置信息,以协助设备恢复。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置會定期把位置廣播到預設頻道,方便找回遺失設備。\n" + } + } + } + }, + "Broadcasts telemetry packets as priority." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sendet Telemetriepakete mit Priorität." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Transmet les paquets de télémétrie en priorité." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "משדר טלמטריה בעדיפות גבוהה." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trasmette i pacchetti di telemetria come priorità." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Broadcasts telemetry packets as priority." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sänder ut telemetripaket som prioritet." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Емитује телеметријске пакете као приоритет." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将遥测数据包优先广播。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "優先廣播遙測指標。" + } + } + } + }, "Button GPIO" : { "localizations" : { "it" : { @@ -5844,6 +6076,40 @@ } } }, + "Client Hidden" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Client - Versteckt" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cliente Nascosto" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Скривени клијент" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "客户端隐藏" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Client Hidden" + } + } + } + }, "Client History" : { "localizations" : { "it" : { @@ -5900,6 +6166,34 @@ } } }, + "Client Mute" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cliente Muto" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Клијент мутиран" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "客户端静默" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Client Mute" + } + } + } + }, "Client options" : { "localizations" : { "it" : { @@ -8749,6 +9043,122 @@ } } }, + "Device that does not forward packets from other devices." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gerät, das keine Pakete von anderen Geräten weiterleitet." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Appareil ne transmettant pas les paquets provenant d'autres appareils." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מכשיר שאינו מעביר הודעות ממכשירים אחרים הלאה." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo che non inoltra pacchetti da altri dispositivi." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wyciszenie klienta - To samo, co klient, z wyjątkiem pakietów, które nie przeskakują przez ten węzeł, nie przyczynia się do routingu pakietów dla siatki." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enhet som inte vidarebefordrar paket från andra enheter." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Уређај који не прослеђује пакете примљене од других уређаја." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "不转发其他设备数据包的设备。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置不會轉發來自其他設備的封包。" + } + } + } + }, + "Device that only broadcasts as needed for stealth or power savings." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gerät, das nur bei Bedarf sendet, um nicht entdeckt zu werden oder Strom zu sparen." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Appareil ne diffusant que si nécessaire pour la discrétion et l'économie d'énergie." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מכשיר שרק משדר לפי צורך בכדי לחסוך בחשמל או לשמור על חשאיות." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispositivo che trasmette solo quando è necessario, per non dare nell'occhio o per risparmiare energia." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : " Used for nodes that \"only speak when spoken to\" Turns all of the routine broadcasts but allows for ad-hoc communication. Still rebroadcasts, but with local only rebroadcast mode (known meshes only). Can be used for private operation or to dramatically reduce airtime / power consumption." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enhet som endast sänder ut när det behövs för stealth eller energibesparing." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Уређај који емитује само по потреби ради прикривености или уштеде енергије." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "只在需要时才广播的设备,以达到隐蔽或省电的目的。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "裝置僅在必要時廣播,以達到隱蔽性或節能目的。" + } + } + } + }, "device.config" : { "localizations" : { "de" : { @@ -8935,1166 +9345,6 @@ } } }, - "device.role.client" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Client (Standard) - Mit App verbundener Client." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "App connected or stand alone messaging device." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Application connectée ou appareil de messagerie autonome." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אפליקציה מחוברת או מכשיר תקשורת עצמאי." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dispositivo di messaggistica collegato all'app o indipendente." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Klient (domyślnie) - Klient połączony z aplikacją." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appansluten eller fristående meddelandeenhet." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Апликација повезана или самостални уређај за размену порука." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "连接 App 或独立的消息发送设备。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "可連接 App 或作為獨立運作的訊息裝置。" - } - } - } - }, - "device.role.clienthidden" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerät, das nur bei Bedarf sendet, um nicht entdeckt zu werden oder Strom zu sparen." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device that only broadcasts as needed for stealth or power savings." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appareil ne diffusant que si nécessaire pour la discrétion et l'économie d'énergie." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מכשיר שרק משדר לפי צורך בכדי לחסוך בחשמל או לשמור על חשאיות." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dispositivo che trasmette solo quando è necessario, per non dare nell'occhio o per risparmiare energia." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : " Used for nodes that \"only speak when spoken to\" Turns all of the routine broadcasts but allows for ad-hoc communication. Still rebroadcasts, but with local only rebroadcast mode (known meshes only). Can be used for private operation or to dramatically reduce airtime / power consumption." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enhet som endast sänder ut när det behövs för stealth eller energibesparing." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Уређај који емитује само по потреби ради прикривености или уштеде енергије." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "只在需要时才广播的设备,以达到隐蔽或省电的目的。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "裝置僅在必要時廣播,以達到隱蔽性或節能目的。" - } - } - } - }, - "device.role.clientmute" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerät, das keine Pakete von anderen Geräten weiterleitet." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device that does not forward packets from other devices." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appareil ne transmettant pas les paquets provenant d'autres appareils." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מכשיר שאינו מעביר הודעות ממכשירים אחרים הלאה." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dispositivo che non inoltra pacchetti da altri dispositivi." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wyciszenie klienta - To samo, co klient, z wyjątkiem pakietów, które nie przeskakują przez ten węzeł, nie przyczynia się do routingu pakietów dla siatki." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enhet som inte vidarebefordrar paket från andra enheter." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Уређај који не прослеђује пакете примљене од других уређаја." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "不转发其他设备数据包的设备。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "裝置不會轉發來自其他設備的封包。" - } - } - } - }, - "device.role.lostandfound" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sendet den Standort regelmäßig als Nachricht an den Standardkanal, um die Suche nach dem Gerät zu unterstützen." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Broadcasts location as message to default channel regularly for to assist with device recovery." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Transmet régulièrement la position par message dans le canal par défaut pour vous aider à retrouver l'appareil." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "משדר מיקום כהודעה לערוץ ברירת מחדל לעיתים קבועות בכדי לסייע במציאת המכשיר." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trasmette regolarmente la posizione come messaggio al canale predefinito per assistere il recupero del dispositivo." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Broadcasts location as message to default channel regularly for to assist with device recovery." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sänder regelbundet ut plats som meddelande till standardkanalen för att underlätta återhämtning av enheten." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Редовно емитује локацију као поруку подразумеваном каналу ради помоћи при проналаску уређаја." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "定期向默认信道发送位置信息,以协助设备恢复。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "裝置會定期把位置廣播到預設頻道,方便找回遺失設備。\n" - } - } - } - }, - "device.role.name.clientHidden" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Client - Versteckt" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Client Hidden" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cliente Nascosto" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Скривени клијент" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "客户端隐藏" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Client Hidden" - } - } - } - }, - "device.role.name.clientMute" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Client Mute" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cliente Muto" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Клијент мутиран" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "客户端静默" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Client Mute" - } - } - } - }, - "device.role.name.lostAndFound" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tracker" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lost and Found" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Oggetti smarriti" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Изгубљено и нађено" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "失物招领" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lost and Found" - } - } - } - }, - "device.role.name.repeater" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Repeater" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Repeater" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ripetitore" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Поновљач" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "中继" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Repeater" - } - } - } - }, - "device.role.name.router" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Рутер" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "路由" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router" - } - } - } - }, - "device.role.name.routerClient" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router & Client" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router & Client" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router & Client" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Рутер и клијент" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "路由 & 客户端" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router & Client" - } - } - } - }, - "device.role.name.routerlate" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router mit Verzögerung" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router Late" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router tardivo" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Рутер са кашњењем" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router Late" - } - } - } - }, - "device.role.name.sensor" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sensor" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sensor" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sensore" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Сензор" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "传感器" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sensor" - } - } - } - }, - "device.role.name.tak" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "TAK" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "TAK" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "TAK" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "TAK" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "TAK" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "TAK" - } - } - } - }, - "device.role.name.takTracker" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "TAK Tracker" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "TAK Tracker" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tracker TAK" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "ТАК Трекер" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "TAK 追踪器" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "TAK Tracker" - } - } - } - }, - "device.role.name.tracker" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tracker" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tracker" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tracker" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Трекер" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "追踪器" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tracker" - } - } - } - }, - "device.role.repeater" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Infrastruktur-Knoten nur auf einem Turm oder einer Bergspitze. Nicht für Dächer oder mobile Knoten verwenden. Übermittelt Nachrichten mit minimalem Mehraufwand. Nicht sichtbar in der Knotenliste." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Relays messages with minimal overhead. Not visible in Nodes list." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Noeud d'infrastructure qui étend la couverture du réseau en relayant les messages avec un minimum de surcharge. Invisible dans la liste des noeuds." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מכשיר תשתית להרחבת המש על ידי העברת הודעות עם דאטה נוסף מינימלי." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nodo infrastrutturale solo su una torre o sulla cima di una montagna. Non deve essere utilizzato per tetti o nodi mobili. Trasmette i messaggi con un overhead minimo. Non visibile nell'elenco dei nodi." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Przekaźnik - Pakiety siatki będą preferować trasowanie przez ten węzeł. Ta rola eliminuje niepotrzebny nadmiar, taki jak NodeInfo, DeviceTelemetry i inne pakiety siatki, skutkując tym, że urządzenie nie będzie widoczne jako część sieci. Proszę zobaczyć tryb Rebroadcast dla dodatkowych ustawień specyficznych dla tej roli." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Infrastrukturnod för att utöka nätverkstäckningen genom att vidarebefordra meddelanden med minimal overhead. Syns inte i Noder-listan." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Инфраструктурни чвор само на торњу или врху планине. Није намењен за кровове или мобилне чворове. Прослеђује поруке уз минимално оптерећење. Није видљив у листи чворова." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "仅用于塔顶或山顶的基础设施节点。 不得用于屋顶或移动节点。以最小的开销中继信息。在节点列表中不可见。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "僅適用於安裝於塔台或山頂。不適用於屋頂或移動式節點。具備高效的訊息轉發能力,資源消耗極低。此類節點不會顯示於節點列表中。" - } - } - } - }, - "device.role.router" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router - Mesh Pakete werden bevorzugt über diesen Knoten gerouted. Dieser Knoten wird nicht von einer Client App benutzt. WLAN, Bluetooth und Display sind aus." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage. Visible in Nodes list." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Noeud d'infrastructure qui étend la couverture du réseau en relayant les messages. Visible dans la liste des noeuds." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מכשיר תשתית להרחבת המש על ידי העברת הודעות. מופיע ברשימת מכשירים." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nodo infrastrutturale solo su una torre o sulla cima di una montagna. Non deve essere utilizzato per tetti o nodi mobili. Necessita di una copertura eccezionale. Visibile nell'elenco dei nodi." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router - Pakiety siatki będą preferować trasowanie przez ten węzeł. Zakłada, że urządzenie będzie działać samodzielnie, umieszczone w miejscu z przewagą zasięgu. UWAGA: Radia BLE/Wi-Fi i ekran OLED zostaną uśpione." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Infrastrukturnod för att utöka nätverkstäckningen genom att vidarebefordra meddelanden. Synlig i Noder-listan." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Инфраструктурни чвор само на торњу или врху планине. Не користи се за кровове или мобилне чворове. Потребна му је изузетна покривеност. Видљиво на листи чворова." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "仅用于塔顶或山顶的基础设施节点。 不得用于屋顶或移动节点。 需要特殊的覆盖范围。在节点列表中可见。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "僅適用於安裝於塔台或山頂的基礎設施節點。不適用於屋頂或移動式節點,需具備卓越的訊號覆蓋能力。此類節點會顯示於節點列表中。" - } - } - } - }, - "device.role.routerclient" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Router Client - Mesh Pakete werden bevorzugt über diesen Knoten gerouted. Der Router Client kann parallel auch von einer Client-App genutzt werden." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Deprecated role use client." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Combinaison des modes ROUTER et CLIENT. Pas pour les appareils mobiles." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "קומבינציה של ROUTER וCLIENT. לא למכשירים ניידים." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ruolo deprecato utilizzare il client." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kombination av både ROUTER och CLIENT. Inte för mobila enheter." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Застарело. Користи клијент ролу." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "已废弃的角色,使用客户端。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "已不再使用,請選擇 Client。" - } - } - } - }, - "device.role.routerlate" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Infrastrukturknoten, der Pakete immer nur einmal weiterleitet, aber erst nach allen anderen Betriebsarten, um eine zusätzliche Abdeckung für lokale Cluster zu gewährleisten. Sichtbar in der Liste der Knoten." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Infrastructure node that always rebroadcasts packets once but only after all other modes, ensuring additional coverage for local clusters. Visible in Nodes list." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nodo infrastruttura che ritrasmette sempre i pacchetti una volta, ma solo dopo tutte le altre modalità, garantendo una copertura aggiuntiva per i cluster locali. Visibile nell'elenco dei nodi." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Нод инфраструктуре који увек поново преноси пакете једном, али тек након свих других начина, обезбеђујући додатно покриће за локалне кластере. Видљив на листи нодова." - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "基礎設施節點,會在所有其他模式完成轉發後,固定將封包重新轉發一次,以確保鄰近節點群擁有額外的覆蓋範圍。此節點會顯示於節點列表中。" - } - } - } - }, - "device.role.sensor" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sendet Telemetriepakete mit Priorität." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Broadcasts telemetry packets as priority." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Transmet les paquets de télémétrie en priorité." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "משדר טלמטריה בעדיפות גבוהה." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trasmette i pacchetti di telemetria come priorità." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Broadcasts telemetry packets as priority." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sänder ut telemetripaket som prioritet." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Емитује телеметријске пакете као приоритет." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "将遥测数据包优先广播。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "優先廣播遙測指標。" - } - } - } - }, - "device.role.tak" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Optimiert für ATAK-Systemkommunikation, verringert die Anzahl der Routineübertragungen." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Optimized for ATAK system communication, reduces routine broadcasts." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Optimisé pour le système de communication ATAK, diminue les émissions de routine." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מותאם למערכת ATAK, מקטין תקשורת קבועה." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ottimizzato per la comunicazione del sistema ATAK, riduce le trasmissioni di routine." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Optimized for ATAK system communication, reduces routine broadcasts." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Optimerad för kommunikation med ATAK-systemet, minskar rutinutsändningar." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Оптимизован за комуникацију са ATAK системом, смањује рутинске емисије." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "针对 ATAK 系统通信进行优化,减少常规广播。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "為 ATAK 系統通訊最佳化,並減少例行廣播頻率。" - } - } - } - }, - "device.role.taktracker" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aktiviert automatische TAK-PLI-Übertragungen und verringert die Anzahl der Routineübertragungen." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enables automatic TAK PLI broadcasts and reduces routine broadcasts." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enables automatic TAK PLI broadcasts and reduces routine broadcasts." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enables automatic TAK PLI broadcasts and reduces routine broadcasts." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abilita le trasmissioni automatiche di TAK PLI e riduce le trasmissioni di routine." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enables automatic TAK PLI broadcasts and reduces routine broadcasts." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aktiverar automatiska TAK PLI-utsändningar och minskar rutinutsändningar." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Омогућава аутоматске TAK PLI емисије и смањује рутинске емисије." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "启用自动 TAK PLI(Position Location Information)广播,并减少常规广播。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "啟用自動傳送 TAK PLI 資訊,並降低例行廣播頻率。" - } - } - } - }, - "device.role.tracker" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sendet GPS-Positionspakete mit Priorität." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Broadcasts GPS position packets as priority." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Transmet les paquets de positions GPS en priorité." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "משדר מיקום GPS בעדיפות גבוהה." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trasmette i pacchetti di posizione GPS come priorità." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tracker - Do użytku z urządzeniami przeznaczonymi jako śledzenie GPS. Pakiety pozycyjne wysyłane z tego urządzenia będą miały wyższy priorytet, z nadawaniem pozycji co dwie minuty. Inteligentna transmisja pozycji będzie domyślnie wyłączona." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sänder ut GPS-positionspaket som prioritet." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Емитује пакете са GPS позицијом као приоритет." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "定位模式 - 用于作为 GPS 跟踪器。从该设备发送的定位数据包优先级较高,每两分钟广播一次。智能位置广播默认为关闭。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "優先傳送 GPS 位置封包。" - } - } - } - }, "Dilution of precision (DOP) PDOP used by default" : { "localizations" : { "it" : { @@ -11271,6 +10521,64 @@ } } }, + "Enables automatic TAK PLI broadcasts and reduces routine broadcasts." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiviert automatische TAK-PLI-Übertragungen und verringert die Anzahl der Routineübertragungen." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enables automatic TAK PLI broadcasts and reduces routine broadcasts." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enables automatic TAK PLI broadcasts and reduces routine broadcasts." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abilita le trasmissioni automatiche di TAK PLI e riduce le trasmissioni di routine." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enables automatic TAK PLI broadcasts and reduces routine broadcasts." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiverar automatiska TAK PLI-utsändningar och minskar rutinutsändningar." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Омогућава аутоматске TAK PLI емисије и смањује рутинске емисије." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用自动 TAK PLI(Position Location Information)广播,并减少常规广播。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "啟用自動傳送 TAK PLI 資訊,並降低例行廣播頻率。" + } + } + } + }, "Enables devices with native I2S audio output to use the RTTTL over speaker like a buzzer. T-Watch S3 and T-Deck for example have this capability." : { "localizations" : { "it" : { @@ -11971,8 +11279,8 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Punto esclamativo" + "state" : "translated", + "value" : "Esclamativo" } }, "pl" : { @@ -16073,6 +15381,150 @@ } } }, + "Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage. Visible in Nodes list." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router - Mesh Pakete werden bevorzugt über diesen Knoten gerouted. Dieser Knoten wird nicht von einer Client App benutzt. WLAN, Bluetooth und Display sind aus." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Noeud d'infrastructure qui étend la couverture du réseau en relayant les messages. Visible dans la liste des noeuds." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מכשיר תשתית להרחבת המש על ידי העברת הודעות. מופיע ברשימת מכשירים." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodo infrastrutturale solo su una torre o sulla cima di una montagna. Non deve essere utilizzato per tetti o nodi mobili. Necessita di una copertura eccezionale. Visibile nell'elenco dei nodi." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router - Pakiety siatki będą preferować trasowanie przez ten węzeł. Zakłada, że urządzenie będzie działać samodzielnie, umieszczone w miejscu z przewagą zasięgu. UWAGA: Radia BLE/Wi-Fi i ekran OLED zostaną uśpione." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Infrastrukturnod för att utöka nätverkstäckningen genom att vidarebefordra meddelanden. Synlig i Noder-listan." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Инфраструктурни чвор само на торњу или врху планине. Не користи се за кровове или мобилне чворове. Потребна му је изузетна покривеност. Видљиво на листи чворова." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "仅用于塔顶或山顶的基础设施节点。 不得用于屋顶或移动节点。 需要特殊的覆盖范围。在节点列表中可见。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "僅適用於安裝於塔台或山頂的基礎設施節點。不適用於屋頂或移動式節點,需具備卓越的訊號覆蓋能力。此類節點會顯示於節點列表中。" + } + } + } + }, + "Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Relays messages with minimal overhead. Not visible in Nodes list." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Infrastruktur-Knoten nur auf einem Turm oder einer Bergspitze. Nicht für Dächer oder mobile Knoten verwenden. Übermittelt Nachrichten mit minimalem Mehraufwand. Nicht sichtbar in der Knotenliste." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Noeud d'infrastructure qui étend la couverture du réseau en relayant les messages avec un minimum de surcharge. Invisible dans la liste des noeuds." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מכשיר תשתית להרחבת המש על ידי העברת הודעות עם דאטה נוסף מינימלי." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodo infrastrutturale solo su una torre o sulla cima di una montagna. Non deve essere utilizzato per tetti o nodi mobili. Trasmette i messaggi con un overhead minimo. Non visibile nell'elenco dei nodi." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Przekaźnik - Pakiety siatki będą preferować trasowanie przez ten węzeł. Ta rola eliminuje niepotrzebny nadmiar, taki jak NodeInfo, DeviceTelemetry i inne pakiety siatki, skutkując tym, że urządzenie nie będzie widoczne jako część sieci. Proszę zobaczyć tryb Rebroadcast dla dodatkowych ustawień specyficznych dla tej roli." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Infrastrukturnod för att utöka nätverkstäckningen genom att vidarebefordra meddelanden med minimal overhead. Syns inte i Noder-listan." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Инфраструктурни чвор само на торњу или врху планине. Није намењен за кровове или мобилне чворове. Прослеђује поруке уз минимално оптерећење. Није видљив у листи чворова." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "仅用于塔顶或山顶的基础设施节点。 不得用于屋顶或移动节点。以最小的开销中继信息。在节点列表中不可见。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "僅適用於安裝於塔台或山頂。不適用於屋頂或移動式節點。具備高效的訊息轉發能力,資源消耗極低。此類節點不會顯示於節點列表中。" + } + } + } + }, + "Infrastructure node that always rebroadcasts packets once but only after all other modes, ensuring additional coverage for local clusters. Visible in Nodes list." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Infrastrukturknoten, der Pakete immer nur einmal weiterleitet, aber erst nach allen anderen Betriebsarten, um eine zusätzliche Abdeckung für lokale Cluster zu gewährleisten. Sichtbar in der Liste der Knoten." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodo infrastruttura che ritrasmette sempre i pacchetti una volta, ma solo dopo tutte le altre modalità, garantendo una copertura aggiuntiva per i cluster locali. Visibile nell'elenco dei nodi." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Нод инфраструктуре који увек поново преноси пакете једном, али тек након свих других начина, обезбеђујући додатно покриће за локалне кластере. Видљив на листи нодова." + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "基礎設施節點,會在所有其他模式完成轉發後,固定將封包重新轉發一次,以確保鄰近節點群擁有額外的覆蓋範圍。此節點會顯示於節點列表中。" + } + } + } + }, "Inputs" : { "localizations" : { "it" : { @@ -17283,6 +16735,40 @@ } } }, + "Lost and Found" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tracker" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oggetti smarriti" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Изгубљено и нађено" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "失物招领" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lost and Found" + } + } + } + }, "LOW" : { "localizations" : { "it" : { @@ -20576,12 +20062,6 @@ "value" : "Mittag" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Midday" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -23096,55 +22576,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Eine Stunde" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Une heure" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "שעה אחת" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Un'ora" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Jedna Godzina" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "En Timme" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Један сат" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "一小时" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "1 小時" } } @@ -23348,6 +22828,64 @@ } } }, + "Optimized for ATAK system communication, reduces routine broadcasts." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Optimiert für ATAK-Systemkommunikation, verringert die Anzahl der Routineübertragungen." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Optimisé pour le système de communication ATAK, diminue les émissions de routine." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מותאם למערכת ATAK, מקטין תקשורת קבועה." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ottimizzato per la comunicazione del sistema ATAK, riduce le trasmissioni di routine." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Optimized for ATAK system communication, reduces routine broadcasts." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Optimerad för kommunikation med ATAK-systemet, minskar rutinutsändningar." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Оптимизован за комуникацију са ATAK системом, смањује рутинске емисије." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "针对 ATAK 系统通信进行优化,减少常规广播。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "為 ATAK 系統通訊最佳化,並減少例行廣播頻率。" + } + } + } + }, "optimized.for.2.color.displays" : { "localizations" : { "en" : { @@ -23816,7 +23354,7 @@ } } }, - "pause" : { + "Pause" : { "localizations" : { "de" : { "stringUnit" : { @@ -23824,12 +23362,6 @@ "value" : "Pause" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pause" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -25604,8 +25136,8 @@ }, "it" : { "stringUnit" : { - "state" : "needs_review", - "value" : "Punto interrogativo" + "state" : "translated", + "value" : "Interrogativo" } }, "pl" : { @@ -26616,6 +26148,40 @@ } } }, + "Repeater" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Repeater" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ripetitore" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Поновљач" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "中继" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Repeater" + } + } + } + }, "Replace Channels" : { "localizations" : { "it" : { @@ -26883,7 +26449,7 @@ } } }, - "resume" : { + "Resume" : { "localizations" : { "de" : { "stringUnit" : { @@ -26891,12 +26457,6 @@ "value" : "Fortsetzen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Resume" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -27350,6 +26910,68 @@ } } }, + "Router" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Рутер" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "路由" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router" + } + } + } + }, + "Router Late" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router mit Verzögerung" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router tardivo" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Рутер са кашњењем" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Router Late" + } + } + } + }, "Routes" : { "localizations" : { "it" : { @@ -29239,6 +28861,40 @@ } } }, + "Sensor" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sensor" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sensore" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Сензор" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "传感器" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sensor" + } + } + } + }, "Sensor options" : { "localizations" : { "it" : { @@ -31397,6 +31053,74 @@ } } }, + "TAK" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "TAK" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "TAK" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "TAK" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "TAK" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "TAK" + } + } + } + }, + "TAK Tracker" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "TAK Tracker" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tracker TAK" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ТАК Трекер" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "TAK 追踪器" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "TAK Tracker" + } + } + } + }, "Takes a Meshtastic channel URL and saves the channel settings." : { "localizations" : { "it" : { @@ -33893,6 +33617,46 @@ } } }, + "Tracker" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tracker" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tracker" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tracker" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Трекер" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "追踪器" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tracker" + } + } + } + }, "Traffic" : { "localizations" : { "de" : { @@ -34459,19 +34223,19 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Non sano" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Нездраво" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "不健康" } } diff --git a/Meshtastic/Enums/DeviceEnums.swift b/Meshtastic/Enums/DeviceEnums.swift index 514f7fec..a859fc20 100644 --- a/Meshtastic/Enums/DeviceEnums.swift +++ b/Meshtastic/Enums/DeviceEnums.swift @@ -21,7 +21,6 @@ enum DeviceRoles: Int, CaseIterable, Identifiable { case takTracker = 10 case repeater = 4 case router = 2 - case routerClient = 3 case routerLate = 11 var id: Int { self.rawValue } @@ -30,56 +29,52 @@ enum DeviceRoles: Int, CaseIterable, Identifiable { case .client: return "Client".localized case .clientMute: - return "device.role.name.clientMute".localized + return "Client Mute".localized case .router: - return "device.role.name.router".localized - case .routerClient: - return "device.role.name.routerClient".localized + return "Router".localized case .repeater: - return "device.role.name.repeater".localized + return "Repeater".localized case .tracker: - return "device.role.name.tracker".localized + return "Tracker".localized case .sensor: - return "device.role.name.sensor".localized + return "Sensor".localized case .tak: - return "device.role.name.tak".localized + return "TAK".localized case .takTracker: - return "device.role.name.takTracker".localized + return "TAK Tracker".localized case .clientHidden: - return "device.role.name.clientHidden".localized + return "Client Hidden".localized case .lostAndFound: - return "device.role.name.lostAndFound".localized + return "Lost and Found".localized case .routerLate: - return "device.role.name.routerlate".localized + return "Router Late".localized } } var description: String { switch self { case .client: - return "device.role.client".localized + return "App connected or stand alone messaging device.".localized case .clientMute: - return "device.role.clientmute".localized + return "Device that does not forward packets from other devices.".localized case .router: - return "device.role.router".localized - case .routerClient: - return "device.role.routerclient".localized + return "Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage. Visible in Nodes list.".localized case .repeater: - return "device.role.repeater".localized + return "Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Relays messages with minimal overhead. Not visible in Nodes list.".localized case .tracker: - return "device.role.tracker".localized + return "Broadcasts GPS position packets as priority.".localized case .sensor: - return "device.role.sensor".localized + return "Broadcasts telemetry packets as priority.".localized case .tak: - return "device.role.tak".localized + return "Optimized for ATAK system communication, reduces routine broadcasts.".localized case .takTracker: - return "device.role.taktracker".localized + return "Enables automatic TAK PLI broadcasts and reduces routine broadcasts.".localized case .clientHidden: - return "device.role.clienthidden".localized + return "Device that only broadcasts as needed for stealth or power savings.".localized case .lostAndFound: - return "device.role.lostandfound".localized + return "Broadcasts location as message to default channel regularly for to assist with device recovery.".localized case .routerLate: - return "device.role.routerlate".localized + return "Infrastructure node that always rebroadcasts packets once but only after all other modes, ensuring additional coverage for local clusters. Visible in Nodes list.".localized } } @@ -89,7 +84,7 @@ enum DeviceRoles: Int, CaseIterable, Identifiable { return "apps.iphone" case .clientMute: return "speaker.slash" - case .router, .routerClient, .routerLate: + case .router, .routerLate: return "wifi.router" case .repeater: return "repeat" @@ -116,8 +111,6 @@ enum DeviceRoles: Int, CaseIterable, Identifiable { return Config.DeviceConfig.Role.clientMute case .router: return Config.DeviceConfig.Role.router - case .routerClient: - return Config.DeviceConfig.Role.routerClient case .repeater: return Config.DeviceConfig.Role.repeater case .tracker: diff --git a/Meshtastic/Views/Settings/Config/DeviceConfig.swift b/Meshtastic/Views/Settings/Config/DeviceConfig.swift index 807aa673..89f50cc9 100644 --- a/Meshtastic/Views/Settings/Config/DeviceConfig.swift +++ b/Meshtastic/Views/Settings/Config/DeviceConfig.swift @@ -310,6 +310,9 @@ struct DeviceConfig: View { } } func setDeviceValues() { + if node?.deviceConfig?.role ?? 0 == 3 { + node?.deviceConfig?.role = 1 + } self.deviceRole = Int(node?.deviceConfig?.role ?? 0) self.buttonGPIO = Int(node?.deviceConfig?.buttonGpio ?? 0) self.buzzerGPIO = Int(node?.deviceConfig?.buzzerGpio ?? 0) diff --git a/Meshtastic/Views/Settings/RouteRecorder.swift b/Meshtastic/Views/Settings/RouteRecorder.swift index 58190878..56c35163 100644 --- a/Meshtastic/Views/Settings/RouteRecorder.swift +++ b/Meshtastic/Views/Settings/RouteRecorder.swift @@ -204,7 +204,7 @@ struct RouteRecorder: View { locationsHandler.isRecording = false locationsHandler.isRecordingPaused = true } label: { - Label("pause", systemImage: "pause") + Label("Pause", systemImage: "pause") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) @@ -216,7 +216,7 @@ struct RouteRecorder: View { locationsHandler.isRecording = true locationsHandler.isRecordingPaused = false } label: { - Label("resume", systemImage: "playpause") + Label("Resume", systemImage: "playpause") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) From 9ecf7f7fbf9fd25614b9aa484f8168cda41955c2 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Thu, 8 May 2025 14:42:11 -0700 Subject: [PATCH 86/93] Additional localization key fixes --- Localizable.xcstrings | 3317 +++++++---------- Meshtastic/Enums/AppSettingsEnums.swift | 4 +- Meshtastic/Enums/LoraConfigEnums.swift | 39 +- Meshtastic/Enums/PositionConfigEnums.swift | 12 +- Meshtastic/Enums/RouteEnums.swift | 24 +- Meshtastic/Helpers/BLEManager.swift | 2 +- Meshtastic/Persistence/UpdateCoreData.swift | 2 +- Meshtastic/Tips/ChannelTips.swift | 8 +- Meshtastic/Views/Bluetooth/Connect.swift | 6 +- .../Views/Bluetooth/InvalidVersion.swift | 2 +- Meshtastic/Views/Nodes/DeviceMetricsLog.swift | 2 +- .../Views/Nodes/Helpers/NodeListItem.swift | 2 +- Meshtastic/Views/Settings/Channels.swift | 2 +- .../Views/Settings/Config/LoRaConfig.swift | 3 + .../Config/Module/DetectionSensorConfig.swift | 2 +- .../Config/Module/TelemetryConfig.swift | 2 +- .../Views/Settings/Config/NetworkConfig.swift | 4 +- .../Views/Settings/Config/PowerConfig.swift | 4 +- 18 files changed, 1496 insertions(+), 1941 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index d167f561..9061d29d 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -1681,6 +1681,64 @@ } } }, + "A Meshtastic QR code contains the LoRa config and channel values needed for radios to communicate. You can share a complete channel configuration using the Replace Channels option, if you choose Add Channels your shared channels will be added to the channels on the receiving radio." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "In a Meshtastic LoRa Mesh there are up to 8 channels. The first one is the Primary channel where most activity happens and is required. If you don't share your primary channel your first shared channel becomes the primary channel on the other network. It talks on its primary and your secondary channel. A channel with the name 'admin' controls nodes remotely. Other channels are for private groups, each with its own key." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un code QR Meshtastic contient la configuration LoRa et les valeurs de canal nécessaires pour communiquer. La plupart des activités du maillage ont lieu sur le canal principal requis. Si vous ne partagez pas votre canal principal, votre premier canal partagé devient le canal principal de l’autre réseau. Les autres canaux sont pour les groupes privés, chacun avec sa propre clé." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "במשטסטיק יש עד 8 ערוצים. הראשון הינו הראשי והינו היכן שרוב הפעילות מתבצעת והכרחי. אם לא תשתף את הערוץ הראשי שלך הערוץ הראשון שלך נהיה הערוץ הראשי ברשת השניה. הוא מדבר בערוץ הראשי שלו במשני שלך. ערוץ בעל השם 'admin' הינו לשליטה מרחוק. ערוצים נוספים הינם לקבוצות פרטיות, כל אחת עם מפתח הצפנה משלה." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un codice QR Meshtastic contiene la configurazione LoRa e i valori dei canali necessari alle radio per comunicare. È possibile condividere una configurazione completa dei canali utilizzando l'opzione Sostituisci canali; se si sceglie Aggiungi canali, i canali condivisi verranno aggiunti ai canali della radio ricevente." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "In a Meshtastic LoRa Mesh there are up to 8 channels. The first one is the Primary channel where most activity happens and is required. If you don't share your primary channel your first shared channel becomes the primary channel on the other network. It talks on its primary and your secondary channel. A channel with the name 'admin' controls nodes remotely. Other channels are for private groups, each with its own key." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "En Meshtastic QR-kod innehåller LoRa-konfigurationen och kanalvärden som behövs för kommunikation. De flesta aktiviteter i mesh-nätverket sker på den obligatoriska primärkanalen. Om du inte delar din primärkanal blir din första delade kanal primärkanalen på det andra nätverket. Andra kanaler är för privata grupper, varje med sin egen nyckel." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "QR код за Мештастик садржи LoRA конфигурацију и вредности канала које су потребне радијима за комуникацију. Можете поделити потпуну конфигурацију канала користећи опцију „Замени канале“, а ако изаберете „Додај канале“, ваши делени канали ће бити додати каналима на примајућем радију." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 Meshtastic 网络中最多有 8 个频道。第一个频道是主频道,大多数活动都发生在这里,也是必需的。如果您不共享主频道,您的第一个共享频道就会成为其他网络的主频道。它会在其主频道和您的辅助频道上对话。名称为 admin 的频道可远程控制节点。其他频道用于私人群组,每个群组都有自己的密钥。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meshtastic QR Code 包含 LoRa 設定與頻道資訊。選擇「取代頻道」可分享完整設定,「新增頻道」則會將分享的頻道新增到接收設備中。" + } + } + } + }, "A Trace Route was sent, no response has been received." : { "localizations" : { "it" : { @@ -3114,6 +3172,58 @@ } } }, + "Ambient Lighting module config received: %@" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration du module lumière ambiante reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות מודולת תאורת סביבה התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo di illuminazione ambientale ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ambient Lighting module config received: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguration för omgivningsbelysningsmodulen mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Примљена конфигурација модула амбијенталног осветљења: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ambient Lighting module config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ambient Lighting module config received: %@" + } + } + } + }, "An open source, off-grid, decentralized, mesh network that runs on affordable, low-power radios." : { "localizations" : { "de" : { @@ -4046,6 +4156,74 @@ } } }, + "biking" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "biken" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "tour in bicicletta" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "тура бициклом" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自行车旅行" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "自行車" + } + } + } + }, + "Biking" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Biken" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In bicicletta" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вожња бицикле" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自行车" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "自行車" + } + } + } + }, "BLE" : { "localizations" : { "it" : { @@ -6497,116 +6675,6 @@ } } }, - "config.power.saving" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stromsparen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Power Saving" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Power Saving" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Risparmio energetico" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Power Saving" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Strömsparläge" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Уштеда енергије" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "省电模式" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "省電模式" - } - } - } - }, - "config.power.saving.description" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sospenderà tutto il più possibile, per il ruolo di tracker e sensore questo includerà anche la radio lora. Non utilizzare questa impostazione se si desidera utilizzare il dispositivo con le applicazioni del telefono o se si utilizza un dispositivo senza pulsante utente." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sätter allt i viloläge så mycket som möjligt, för spårnings- och sensorläge kommer detta också inkludera LoRa-radion. Använd inte denna inställning om du vill använda din enhet med mobilappar eller använder en enhet utan en användarknapp." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Спаваће све што је више могуће, за улогу трагача и сензора ово ће укључивати и лора радио. Не користите ово подешавање ако желите да користите свој уређај са мобилним апликацијама или користите уређај без корисничког дугмета." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "尽可能让所有设备处于睡眠状态,对于跟踪器和传感器来说,这也包括 LoRa 无线电。如果您想将电台与手机 App 一起使用,或使用没有用户按钮的电台,请不要使用此设置。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "此設定會讓裝置盡可能休眠,包括 LoRa 無線電(用於 Tracker 和 Sensor 角色)。若您要搭配手機 App,或裝置沒有用戶按鈕,請不要使用此設定。" - } - } - } - }, "config.power.shutdown.on.power.loss" : { "localizations" : { "de" : { @@ -7039,7 +7107,7 @@ } } }, - "connected" : { + "Connected" : { "localizations" : { "de" : { "stringUnit" : { @@ -7047,12 +7115,6 @@ "value" : "Derzeit verbunden" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth Connected" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -7147,71 +7209,7 @@ } } }, - "connected.radio" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verbundenes Gerät" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connected Radio" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Radio connectée" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מכשיר מחובר" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Radio connessa" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Podłączone radio" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ansluten Radio" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Повезани радио" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "电台已连接" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "已連接的節點" - } - } - } - }, - "connecting" : { + "Connecting . ." : { "localizations" : { "de" : { "stringUnit" : { @@ -7219,12 +7217,6 @@ "value" : "Verbinde..." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connecting . ." - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -7329,61 +7321,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Verbindung nach %d Versuchen zu %@ fehlgeschlagen. Evtl. hilft es, die Verbindung unter Einstellungen > Bluetooth manuell zu löschen." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connection failed after %d attempts to connect to %@. You may need to forget your device under Settings > Bluetooth." - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Connexion impossible après %d essais avec %@. Allez dans Réglages > Bluetooth et essayez de faire de faire > Oublier cet appareil." } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "התחברות נכשלה לאחר %d נסיונות להתחבר ל%@. יתכן ויש צורך 'לשכוח' את המכשיר בהגדרות מכשיר > בלוטוס." } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Connessione fallita dopo %d tentativi di connessione a %@. Potrebbe essere necessario disaccoppiare il tuo dispositivo in Impostazioni > Bluetooth." } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Połączenie nie powiodło się po %d próbach połączenia z %@. Zapomnij o urządzeniu w Ustawienia > Bluetooth." } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Anslutningen misslyckades efter %d försök att ansluta till %@. Du kan behöva glömma din enhet under Inställningar > Bluetooth." } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Веза није успела након %d покушаја да се повеже са %@. Можда ћете морати да заборавите уређај у Подешавања > Блутут." } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "尝试连接%d失败,你可能需要在系统设置的蓝牙选项中忽略该设备。" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "嘗試連接%d失敗,您可能需要在系统設定的藍芽選項中忽略該節點。" } } @@ -8069,6 +8055,64 @@ } } }, + "Decimal Degrees Format" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dezimalgrad Format" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Format décimal pour les degrés" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "פורמט קואורדינטות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Formato dei gradi decimali" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Format Dziesiętny Stopni" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Decimalgrader" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Формат децималних степени" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "十进制" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "十進制" + } + } + } + }, "Default" : { "localizations" : { "de" : { @@ -8161,6 +8205,64 @@ } } }, + "Degrees Minutes Seconds" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Grad Minuten Sekunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Degrés Minutes Secondes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מעלות דקות שניות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gradi Minuti Secondi" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stopnie Minuty Sekundy" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Grader Minuter Sekunder" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Степени Минути Секунде" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "度分秒" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "度分秒" + } + } + } + }, "Delete" : { "localizations" : { "de" : { @@ -8219,6 +8321,58 @@ } } }, + "Delete all device metrics?" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Effacer toutes les mesures de l’appareil?" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "נקה יומן מכשיר?" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancellare tutte le metriche del dispositivo?" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usunąć wszystkie metryki urządzenia?" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ta bort alla enhetsmätvärden?" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Избришите све метрике уређаја?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除所有设备指标?" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "要刪除所有裝置指標嗎?" + } + } + } + }, "Delete all environment metrics?" : { "localizations" : { "it" : { @@ -9223,64 +9377,6 @@ } } }, - "device.metrics.delete" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete all device metrics?" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Effacer toutes les mesures de l’appareil?" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "נקה יומן מכשיר?" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancellare tutte le metriche del dispositivo?" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Usunąć wszystkie metryki urządzenia?" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ta bort alla enhetsmätvärden?" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Избришите све метрике уређаја?" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "删除所有设备指标?" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "要刪除所有裝置指標嗎?" - } - } - } - }, "device.metrics.log" : { "localizations" : { "de" : { @@ -10177,6 +10273,74 @@ } } }, + "driving" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "fahren" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "guida" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "вожња" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "驾驶" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "開車" + } + } + } + }, + "Driving" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fahren" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Guida" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вожња аута" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "驾驶" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "開車" + } + } + } + }, "Drop Pin in Maps" : { "localizations" : { "it" : { @@ -12523,6 +12687,122 @@ } } }, + "Follow" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folgen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suivre" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "עקוב" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seguire" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Śledź" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Följ" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Прати" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跟随" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "置中" + } + } + } + }, + "Follow with heading" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Folgen mit Steuerkurs" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suivre avec le cap" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "עקוב עם כיוון" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seguire con l'intestazione" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Śledź z kierunkiem" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Följ med riktning" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Прати са правцем" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "跟随航向" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "跟隨與方向" + } + } + } + }, "For all Mqtt functionality other than the map report you must also set uplink and downlink for each channel you want to bridge over Mqtt." : { "localizations" : { "it" : { @@ -13459,390 +13739,6 @@ } } }, - "gpsformat.dec" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dezimalgrad Format" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Decimal Degrees Format" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Format décimal pour les degrés" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "פורמט קואורדינטות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Formato dei gradi decimali" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Format Dziesiętny Stopni" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Decimalgrader" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Формат децималних степени" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "十进制" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "十進制" - } - } - } - }, - "gpsformat.dms" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Grad Minuten Sekunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Degrees Minutes Seconds" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Degrés Minutes Secondes" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מעלות דקות שניות" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gradi Minuti Secondi" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stopnie Minuty Sekundy" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Grader Minuter Sekunder" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Степени Минути Секунде" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "度分秒" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "度分秒" - } - } - } - }, - "gpsformat.mgrs" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Militärisches Gitternetz-Referenzsystem" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Military Grid Reference System" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Military Grid Reference System" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Military Grid Reference System" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sistema di riferimento della griglia militare" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wojskowa siatka odniesienia" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Militärt rutnätsreferenssystem" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Војни референтни систем мреже" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "军事网格参考系统" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "軍事網格參考系統" - } - } - } - }, - "gpsformat.olc" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Open Location Code (aka Plus Codes)" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Open Location Code (aka Plus Codes)" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Open Location Code (alias Plus Codes)" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Open Location Code (aka Plus Codes)" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Codice di localizzazione aperto (alias Codice Plus)" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otwarty Kod Lokalizacji (tzw. Plus Kody)" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Öppen Platskod (även känd som Pluskoder)" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Отворени код локације (тј. Плус кодови)" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "开放的位置代码(又称加码)" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "開放位置代碼" - } - } - } - }, - "gpsformat.osgr" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ordnance Survey Gitterreferenz" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ordnance Survey Grid Reference" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ordnance Survey Grid Reference" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ordnance Survey Grid Reference" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Riferimento di griglia Ordnance Survey" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Brytyjski Układ Odniesienia" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ordnance Survey Rutnätsreferens" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Референца мреже Орданс Сурвеја" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "英国国土测量局网格参考" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "英國國土測量局網格參考系統" - } - } - } - }, - "gpsformat.utm" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Universal Transversal Mercator" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Universal Transverse Mercator" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Projection Mercator Transverse Universelle" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Universal Transverse Mercator" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mercatore Universale Trasverso" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uniwersalny Układ Transwersalny Mercatora" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Universal Transversal Mercator" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Универзални трансверзални Меркаторов пројекат" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "通用横轴墨卡托投影" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "通用橫軸墨卡托投影" - } - } - } - }, "Group Message" : { "localizations" : { "de" : { @@ -14255,6 +14151,74 @@ } } }, + "hiking" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "wandern" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "escursione" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "планинарње" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "徒步" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "登山" + } + } + } + }, + "Hiking" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wandern" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Escursioni" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Планинарење" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "徒步" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "登山" + } + } + } + }, "History Return Max" : { "localizations" : { "it" : { @@ -16523,6 +16487,28 @@ } } }, + "Long Range - Moderate" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lungo raggio - Moderato" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дугачки домет - Умерено" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Long Range - Moderate" + } + } + } + }, "Long Range - Slow" : { "localizations" : { "it" : { @@ -16545,34 +16531,6 @@ } } }, - "long.range.moderate" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Long Range - Moderate" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lungo raggio - Moderato" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Дугачки домет - Умерено" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Long Range - Moderate" - } - } - } - }, "Longitude" : { "localizations" : { "de" : { @@ -16855,14 +16813,8 @@ } } }, - "Malaysia 433mhz" : { + "Malaysia 433MHz" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Malaysia 433MHz" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -16883,34 +16835,86 @@ } } }, - "Malaysia 919mhz" : { + "Malaysia 919MHz" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Malaysia 919MHz" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Malesia 919MHz" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Малезија 919MHz" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "馬來西亞 919MHz" } } } }, + "Manage Channels" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kanäle verwalten" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gérer les canaux" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Manage Channels" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gestire i canali" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Manage Channels" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hantera Kanaler" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Управљај каналима" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理频道" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "管理頻道" + } + } + } + }, "Managed Device" : { "localizations" : { "it" : { @@ -17151,134 +17155,6 @@ } } }, - "map.usertrackingmode.follow" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Folgen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Follow" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Suivre" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "עקוב" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seguire" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Śledź" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Följ" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Прати" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "跟随" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "置中" - } - } - } - }, - "map.usertrackingmode.followwithheading" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Folgen mit Steuerkurs" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Follow with heading" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Suivre avec le cap" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "עקוב עם כיוון" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seguire con l'intestazione" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Śledź z kierunkiem" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Följ med riktning" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Прати са правцем" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "跟随航向" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "跟隨與方向" - } - } - } - }, "Max Retransmission Reached" : { "localizations" : { "de" : { @@ -17337,14 +17213,8 @@ } } }, - "medium.range.fast" : { + "Medium Range - Fast" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Medium Range - Fast" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -17365,14 +17235,8 @@ } } }, - "medium.range.slow" : { + "Medium Range - Slow" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Medium Range - Slow" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -17479,64 +17343,6 @@ } } }, - "mesh.log.ambientlighting.config %@" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ambient Lighting module config received: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration du module lumière ambiante reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות מודולת תאורת סביבה התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione del modulo di illuminazione ambientale ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ambient Lighting module config received: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguration för omgivningsbelysningsmodulen mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Примљена конфигурација модула амбијенталног осветљења: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ambient Lighting module config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ambient Lighting module config received: %@" - } - } - } - }, "mesh.log.bluetooth.config %@" : { "localizations" : { "de" : { @@ -20082,6 +19888,64 @@ } } }, + "Military Grid Reference System" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Militärisches Gitternetz-Referenzsystem" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Military Grid Reference System" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Military Grid Reference System" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sistema di riferimento della griglia militare" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wojskowa siatka odniesienia" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Militärt rutnätsreferenssystem" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Војни референтни систем мреже" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "军事网格参考系统" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "軍事網格參考系統" + } + } + } + }, "Minimum Distance" : { "localizations" : { "de" : { @@ -20388,6 +20252,64 @@ } } }, + "Most data on your mesh is sent over the primary channel. You can set up secondary channels to create additional messaging groups secured by their own key. [Channel config tips](https://meshtastic.org/docs/configuration/tips/)" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die meisten Daten in deinem Mesh werden über den primären Kanal gesendet. Du kannst sekundäre Kanäle einrichten, um zusätzliche Nachrichtengruppen zu erstellen, die durch ihren eigenen Schlüssel gesichert sind. [Tipps zur Kanalkonfiguration](https://meshtastic.org/docs/configuration/radio/channels/)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "La pluspart des données de votre maillage sont envoyées sur le canal principal. Vous pouvez définir des canaux secondaires pour créer des groupes de messagerie additionnelle sécurisés avec leur propre clé. [Conseils de configuration du canal](https://meshtastic.org/docs/configuration/tips/)" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Most data on your mesh is sent over the primary channel. You can set up secondary channels to create additional messaging groups secured by their own key. [Channel config tips](https://meshtastic.org/docs/configuration/radio/channels/)" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La maggior parte dei dati sulla rete viene inviata attraverso il canale primario. È possibile impostare canali secondari per creare gruppi di messaggistica aggiuntivi protetti da una propria chiave. [Suggerimenti per la configurazione del canale](https://meshtastic.org/docs/configuration/tips/)" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Most data on your mesh is sent over the primary channel. You can set up secondary channels to create additional messaging groups secured by their own key. [Channel config tips](https://meshtastic.org/docs/configuration/radio/channels/)" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "De flesta data i ditt mesh-nätverk skickas över primärkanalen. Du kan ställa in sekundära kanaler för att skapa ytterligare meddelandegrupper skyddade av sin egen nyckel. Tips för kanalkonfiguration" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Већина података на вашој мрежи шаље се преко примарног канала. Можете подесити секундарне канале како бисте креирали додатне групе за размену порука, које су обезбеђене сопственим кључем. [Савети за конфигурацију канала](https://meshtastic.org/docs/configuration/tips/)" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mesh 网格上的大部分数据都通过主频道发送。您可以设置辅助频道以创建由其自身密钥保护的消息组。[频道配置提示](https://meshtastic.org/docs/configuration/tips/)" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "您的Mesh網路中大部分資料將透過主要頻道傳輸。若需要額外的訊息群組,您可以設定次要頻道,並設定專屬金鑰進行保護。" + } + } + } + }, "MQTT" : { "localizations" : { "it" : { @@ -21002,29 +20924,23 @@ } } }, - "New Zealand 865mhz" : { + "New Zealand 865MHz" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "New Zealand 865MHz" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Nuova Zelanda 865MHz" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Нови зеланд 865MHz" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "紐西蘭 865MHz" } } @@ -22794,6 +22710,64 @@ } } }, + "Open Location Code (aka Plus Codes)" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Open Location Code (aka Plus Codes)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Open Location Code (alias Plus Codes)" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Open Location Code (aka Plus Codes)" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Codice di localizzazione aperto (alias Codice Plus)" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otwarty Kod Lokalizacji (tzw. Plus Kody)" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Öppen Platskod (även känd som Pluskoder)" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Отворени код локације (тј. Плус кодови)" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "开放的位置代码(又称加码)" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "開放位置代碼" + } + } + } + }, "Open Settings" : { "localizations" : { "de" : { @@ -23022,6 +22996,64 @@ } } }, + "Ordnance Survey Grid Reference" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ordnance Survey Gitterreferenz" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ordnance Survey Grid Reference" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ordnance Survey Grid Reference" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riferimento di griglia Ordnance Survey" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Brytyjski Układ Odniesienia" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ordnance Survey Rutnätsreferens" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Референца мреже Орданс Сурвеја" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "英国国土测量局网格参考" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "英國國土測量局網格參考系統" + } + } + } + }, "OS Log Entry Details" : { "localizations" : { "it" : { @@ -23216,6 +23248,62 @@ } } }, + "overlanding" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "overland drive" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вожња преко копна" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "越野" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "開車 (overland drive)" + } + } + } + }, + "Overlanding" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overlanding" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Оверлендинг" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "越野" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "越野旅行" + } + } + } + }, "Override automatic OLED screen detection." : { "localizations" : { "it" : { @@ -23650,42 +23738,30 @@ } } }, - "Philippines 433mhz" : { + "Philippines 433MHz" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Philippines 433MHz" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Filippine 433MHz" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Филипини 433MHz" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "菲律賓 433MHz" } } } }, - "Philippines 868mhz" : { + "Philippines 868MHz" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Philippines 868MHz" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -23706,29 +23782,23 @@ } } }, - "Philippines 915mhz" : { + "Philippines 915MHz" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Philippines 915MHz" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Filippine 915MHz" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Филипини 915MHz" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "菲律賓 915MHz" } } @@ -24302,46 +24372,6 @@ } } }, - "position.precision %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Innerhalb %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Within %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entro il %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inom %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "У кругу %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@ 之內" - } - } - } - }, "Positions Enabled" : { "localizations" : { "it" : { @@ -24538,6 +24568,58 @@ } } }, + "Power Saving" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stromsparen" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Power Saving" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Risparmio energetico" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Power Saving" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Strömsparläge" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Уштеда енергије" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "省电模式" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "省電模式" + } + } + } + }, "Power Screen" : { "localizations" : { "it" : { @@ -26994,474 +27076,6 @@ } } }, - "routes.activitytype.biking" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Biken" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Biking" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "In bicicletta" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Вожња бицикле" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "自行车" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "自行車" - } - } - } - }, - "routes.activitytype.driving" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fahren" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Driving" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Guida" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Вожња аута" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "驾驶" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "開車" - } - } - } - }, - "routes.activitytype.filename.biking" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "biken" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "bike tour" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "tour in bicicletta" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "тура бициклом" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "自行车旅行" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "自行車" - } - } - } - }, - "routes.activitytype.filename.driving" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "fahren" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "drive" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "guida" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "вожња" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "驾驶" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "開車" - } - } - } - }, - "routes.activitytype.filename.hiking" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "wandern" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "hike" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "escursione" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "планинарње" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "徒步" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "登山" - } - } - } - }, - "routes.activitytype.filename.overlanding" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "overland drive" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "overland drive" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Вожња преко копна" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "越野" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "開車 (overland drive)" - } - } - } - }, - "routes.activitytype.filename.skiing" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "skitour" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "ski tour" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "tour sciistico" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "ски тура" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "滑雪之旅" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "滑雪" - } - } - } - }, - "routes.activitytype.filename.walking" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "gehen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "walk" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "passeggiata" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "шетња" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "步行" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "走路" - } - } - } - }, - "routes.activitytype.hiking" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wandern" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hiking" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Escursioni" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Планинарење" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "徒步" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "登山" - } - } - } - }, - "routes.activitytype.overlanding" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Overlanding" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Overlanding" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Оверлендинг" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "越野" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "越野旅行" - } - } - } - }, - "routes.activitytype.skiing" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Skifahren" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Skiing" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sci" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Скијање" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "滑雪" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "滑雪" - } - } - } - }, - "routes.activitytype.walking" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gehen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Walking" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Camminare" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Шетња" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "步行" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "走路" - } - } - } - }, "RSSI %@ dBm" : { "localizations" : { "it" : { @@ -29311,29 +28925,7 @@ } } }, - "Set the GPIO pins for RXD and TXD." : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Impostare i pin GPIO per RXD e TXD." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подеси GPIO пинове за RXD и TXD." - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "設定 RXD 和 TXD 的 GPIO 腳位。" - } - } - } - }, - "set.region" : { + "Set LoRa Region" : { "localizations" : { "de" : { "stringUnit" : { @@ -29341,12 +28933,6 @@ "value" : "Setze LoRa Region" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Set LoRa Region" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -29397,6 +28983,28 @@ } } }, + "Set the GPIO pins for RXD and TXD." : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impostare i pin GPIO per RXD e TXD." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подеси GPIO пинове за RXD и TXD." + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定 RXD 和 TXD 的 GPIO 腳位。" + } + } + } + }, "Sets the maximum number of hops, default is 3. Increasing hops also increases congestion and should be used carefully. O hop broadcast messages will not get ACKs." : { "localizations" : { "it" : { @@ -29655,6 +29263,64 @@ } } }, + "Sharing Meshtastic Channels" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meshtastic Kanäle teilen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Partage des canaux Meshtastic" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "משתף ערוצי משטסטיק" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Condividere i canali Meshtastic" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sharing Meshtastic Channels" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dela Meshtastic-kanaler" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дељење Мештастик канала" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "共享 Meshtastic 频道" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "分享 Meshtastic 頻道" + } + } + } + }, "Short Name" : { "localizations" : { "de" : { @@ -29723,14 +29389,8 @@ } } }, - "short.range.fast" : { + "Short Range - Fast" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Short Range - Fast" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -29751,14 +29411,8 @@ } } }, - "short.range.slow" : { + "Short Range - Slow" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Short Range - Slow" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -29779,14 +29433,8 @@ } } }, - "short.range.turbo" : { + "Short Range - Turbo" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Short Range - Turbo" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -30155,14 +29803,8 @@ } } }, - "Singapore 923mhz" : { + "Singapore 923MHz" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Singapore 923MHz" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -30241,6 +29883,74 @@ } } }, + "skiing" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "skitour" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "tour sciistico" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ски тура" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑雪之旅" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑雪" + } + } + } + }, + "Skiing" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skifahren" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sci" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Скијање" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑雪" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "滑雪" + } + } + } + }, "Smart Position" : { "localizations" : { "it" : { @@ -30489,7 +30199,7 @@ } } }, - "ssid" : { + "SSID" : { "localizations" : { "de" : { "stringUnit" : { @@ -30497,12 +30207,6 @@ "value" : "SSID" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "SSID" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -30899,61 +30603,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Subsystem" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Subsystem" } }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Subsystem" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Subsystem" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Sottosistema" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Subsystem" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Subsystem" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Подсистем" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Subsystem" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Subsystem" } } @@ -33113,262 +32811,6 @@ } } }, - "tip.channels.create.message" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Die meisten Daten in deinem Mesh werden über den primären Kanal gesendet. Du kannst sekundäre Kanäle einrichten, um zusätzliche Nachrichtengruppen zu erstellen, die durch ihren eigenen Schlüssel gesichert sind. [Tipps zur Kanalkonfiguration](https://meshtastic.org/docs/configuration/radio/channels/)" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Most data on your mesh is sent over the primary channel. You can set up secondary channels to create additional messaging groups secured by their own key. [Channel config tips](https://meshtastic.org/docs/configuration/tips/)" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La pluspart des données de votre maillage sont envoyées sur le canal principal. Vous pouvez définir des canaux secondaires pour créer des groupes de messagerie additionnelle sécurisés avec leur propre clé. [Conseils de configuration du canal](https://meshtastic.org/docs/configuration/tips/)" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Most data on your mesh is sent over the primary channel. You can set up secondary channels to create additional messaging groups secured by their own key. [Channel config tips](https://meshtastic.org/docs/configuration/radio/channels/)" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "La maggior parte dei dati sulla rete viene inviata attraverso il canale primario. È possibile impostare canali secondari per creare gruppi di messaggistica aggiuntivi protetti da una propria chiave. [Suggerimenti per la configurazione del canale](https://meshtastic.org/docs/configuration/tips/)" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Most data on your mesh is sent over the primary channel. You can set up secondary channels to create additional messaging groups secured by their own key. [Channel config tips](https://meshtastic.org/docs/configuration/radio/channels/)" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "De flesta data i ditt mesh-nätverk skickas över primärkanalen. Du kan ställa in sekundära kanaler för att skapa ytterligare meddelandegrupper skyddade av sin egen nyckel. Tips för kanalkonfiguration" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Већина података на вашој мрежи шаље се преко примарног канала. Можете подесити секундарне канале како бисте креирали додатне групе за размену порука, које су обезбеђене сопственим кључем. [Савети за конфигурацију канала](https://meshtastic.org/docs/configuration/tips/)" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mesh 网格上的大部分数据都通过主频道发送。您可以设置辅助频道以创建由其自身密钥保护的消息组。[频道配置提示](https://meshtastic.org/docs/configuration/tips/)" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "您的Mesh網路中大部分資料將透過主要頻道傳輸。若需要額外的訊息群組,您可以設定次要頻道,並設定專屬金鑰進行保護。" - } - } - } - }, - "tip.channels.create.title" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kanäle verwalten" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manage Channels" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gérer les canaux" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manage Channels" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gestire i canali" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manage Channels" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hantera Kanaler" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Управљај каналима" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "管理频道" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "管理頻道" - } - } - } - }, - "tip.channels.share.message" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "In a Meshtastic LoRa Mesh there are up to 8 channels. The first one is the Primary channel where most activity happens and is required. If you don't share your primary channel your first shared channel becomes the primary channel on the other network. It talks on its primary and your secondary channel. A channel with the name 'admin' controls nodes remotely. Other channels are for private groups, each with its own key." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "A Meshtastic QR code contains the LoRa config and channel values needed for radios to communicate. You can share a complete channel configuration using the Replace Channels option, if you choose Add Channels your shared channels will be added to the channels on the receiving radio." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Un code QR Meshtastic contient la configuration LoRa et les valeurs de canal nécessaires pour communiquer. La plupart des activités du maillage ont lieu sur le canal principal requis. Si vous ne partagez pas votre canal principal, votre premier canal partagé devient le canal principal de l’autre réseau. Les autres canaux sont pour les groupes privés, chacun avec sa propre clé." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "במשטסטיק יש עד 8 ערוצים. הראשון הינו הראשי והינו היכן שרוב הפעילות מתבצעת והכרחי. אם לא תשתף את הערוץ הראשי שלך הערוץ הראשון שלך נהיה הערוץ הראשי ברשת השניה. הוא מדבר בערוץ הראשי שלו במשני שלך. ערוץ בעל השם 'admin' הינו לשליטה מרחוק. ערוצים נוספים הינם לקבוצות פרטיות, כל אחת עם מפתח הצפנה משלה." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Un codice QR Meshtastic contiene la configurazione LoRa e i valori dei canali necessari alle radio per comunicare. È possibile condividere una configurazione completa dei canali utilizzando l'opzione Sostituisci canali; se si sceglie Aggiungi canali, i canali condivisi verranno aggiunti ai canali della radio ricevente." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "In a Meshtastic LoRa Mesh there are up to 8 channels. The first one is the Primary channel where most activity happens and is required. If you don't share your primary channel your first shared channel becomes the primary channel on the other network. It talks on its primary and your secondary channel. A channel with the name 'admin' controls nodes remotely. Other channels are for private groups, each with its own key." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "En Meshtastic QR-kod innehåller LoRa-konfigurationen och kanalvärden som behövs för kommunikation. De flesta aktiviteter i mesh-nätverket sker på den obligatoriska primärkanalen. Om du inte delar din primärkanal blir din första delade kanal primärkanalen på det andra nätverket. Andra kanaler är för privata grupper, varje med sin egen nyckel." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "QR код за Мештастик садржи LoRA конфигурацију и вредности канала које су потребне радијима за комуникацију. Можете поделити потпуну конфигурацију канала користећи опцију „Замени канале“, а ако изаберете „Додај канале“, ваши делени канали ће бити додати каналима на примајућем радију." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "在 Meshtastic 网络中最多有 8 个频道。第一个频道是主频道,大多数活动都发生在这里,也是必需的。如果您不共享主频道,您的第一个共享频道就会成为其他网络的主频道。它会在其主频道和您的辅助频道上对话。名称为 admin 的频道可远程控制节点。其他频道用于私人群组,每个群组都有自己的密钥。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Meshtastic QR Code 包含 LoRa 設定與頻道資訊。選擇「取代頻道」可分享完整設定,「新增頻道」則會將分享的頻道新增到接收設備中。" - } - } - } - }, - "tip.channels.share.title" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Meshtastic Kanäle teilen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sharing Meshtastic Channels" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Partage des canaux Meshtastic" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "משתף ערוצי משטסטיק" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Condividere i canali Meshtastic" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sharing Meshtastic Channels" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dela Meshtastic-kanaler" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Дељење Мештастик канала" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "共享 Meshtastic 频道" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "分享 Meshtastic 頻道" - } - } - } - }, "TLS Enabled" : { "localizations" : { "it" : { @@ -33621,37 +33063,31 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", - "value" : "Tracker" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Tracker" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Tracker" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Трекер" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "追踪器" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Tracker" } } @@ -34141,42 +33577,30 @@ } } }, - "Ukraine 433mhz" : { + "Ukraine 433MHz" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ukraine 433MHz" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Ucraina 433MHz" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Украјина 433MHz" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "烏克蘭 433MHz" } } } }, - "Ukraine 868mhz" : { + "Ukraine 868MHz" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ukraine 868MHz" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -34307,6 +33731,64 @@ } } }, + "Universal Transverse Mercator" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Universal Transversal Mercator" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Projection Mercator Transverse Universelle" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Universal Transverse Mercator" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mercatore Universale Trasverso" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uniwersalny Układ Transwersalny Mercatora" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Universal Transversal Mercator" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Универзални трансверзални Меркаторов пројекат" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通用横轴墨卡托投影" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "通用橫軸墨卡托投影" + } + } + } + }, "Unknown" : { "localizations" : { "fr" : { @@ -34605,134 +34087,64 @@ } } }, - "update.firmware" : { + "Update Your Firmware" : { "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Firmware aktualisieren" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Update Your Firmware" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Mettre à jour votre Firmware" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "עדכן קושחה" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Aggiornare il firmware" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Zaktualizuj firmware" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Uppdatera din firmware" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Ажурирај твој фирмвер" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "更新你的固件" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "更新韌體" } } } }, - "update.interval" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aktualisierungsintervall" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Update Interval" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervale de mise à jour" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "זמן בין עדכונים" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervallo di aggiornamento" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Interwał aktualizacji" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uppdateringsintervall" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Интервал ажурирања" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "更新间隔" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "更新間隔" - } - } - } - }, "Updated Node Stats Data." : { "localizations" : { "it" : { @@ -35398,6 +34810,7 @@ } }, "very.long.range.slow" : { + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -35663,6 +35076,74 @@ } } }, + "walk" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "gehen" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "passeggiata" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "шетња" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "步行" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "走路" + } + } + } + }, + "Walking" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gehen" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Camminare" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Шетња" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "步行" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "走路" + } + } + } + }, "Wave" : { "localizations" : { "de" : { @@ -36067,6 +35548,52 @@ } } }, + "Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button." : { + "localizations" : { + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sospenderà tutto il più possibile, per il ruolo di tracker e sensore questo includerà anche la radio lora. Non utilizzare questa impostazione se si desidera utilizzare il dispositivo con le applicazioni del telefono o se si utilizza un dispositivo senza pulsante utente." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sätter allt i viloläge så mycket som möjligt, för spårnings- och sensorläge kommer detta också inkludera LoRa-radion. Använd inte denna inställning om du vill använda din enhet med mobilappar eller använder en enhet utan en användarknapp." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Спаваће све што је више могуће, за улогу трагача и сензора ово ће укључивати и лора радио. Не користите ово подешавање ако желите да користите свој уређај са мобилним апликацијама или користите уређај без корисничког дугмета." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "尽可能让所有设备处于睡眠状态,对于跟踪器和传感器来说,这也包括 LoRa 无线电。如果您想将电台与手机 App 一起使用,或使用没有用户按钮的电台,请不要使用此设置。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "此設定會讓裝置盡可能休眠,包括 LoRa 無線電(用於 Tracker 和 Sensor 角色)。若您要搭配手機 App,或裝置沒有用戶按鈕,請不要使用此設定。" + } + } + } + }, "Wind" : { "localizations" : { "it" : { @@ -36139,6 +35666,40 @@ } } }, + "Within %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Innerhalb %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entro il %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inom %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "У кругу %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 之內" + } + } + } + }, "x" : { "localizations" : { "it" : { diff --git a/Meshtastic/Enums/AppSettingsEnums.swift b/Meshtastic/Enums/AppSettingsEnums.swift index 9a86c363..0797a0df 100644 --- a/Meshtastic/Enums/AppSettingsEnums.swift +++ b/Meshtastic/Enums/AppSettingsEnums.swift @@ -80,9 +80,9 @@ enum UserTrackingModes: Int, CaseIterable, Identifiable { case .none: return "None".localized case .follow: - return "map.usertrackingmode.follow".localized + return "Follow".localized case .followWithHeading: - return "map.usertrackingmode.followwithheading".localized + return "Follow with heading".localized } } var icon: String { diff --git a/Meshtastic/Enums/LoraConfigEnums.swift b/Meshtastic/Enums/LoraConfigEnums.swift index 479d1fe7..c6dc7628 100644 --- a/Meshtastic/Enums/LoraConfigEnums.swift +++ b/Meshtastic/Enums/LoraConfigEnums.swift @@ -105,27 +105,27 @@ enum RegionCodes: Int, CaseIterable, Identifiable { case .in: return "India".localized case .nz865: - return "New Zealand 865mhz".localized + return "New Zealand 865MHz".localized case .th: return "Thailand".localized case .ua433: - return "Ukraine 433mhz".localized + return "Ukraine 433MHz".localized case .ua868: - return "Ukraine 868mhz".localized + return "Ukraine 868MHz".localized case .lora24: return "2.4 Ghz".localized case .my433: - return "Malaysia 433mhz".localized + return "Malaysia 433MHz".localized case .my919: - return "Malaysia 919mhz".localized + return "Malaysia 919MHz".localized case .sg923: - return "Singapore 923mhz".localized + return "Singapore 923MHz".localized case .ph433: - return "Philippines 433mhz".localized + return "Philippines 433MHz".localized case .ph868: - return "Philippines 868mhz".localized + return "Philippines 868MHz".localized case .ph915: - return "Philippines 915mhz".localized + return "Philippines 915MHz".localized } } var dutyCycle: Int { @@ -280,7 +280,6 @@ enum ModemPresets: Int, CaseIterable, Identifiable { case longFast = 0 case longSlow = 1 case longModerate = 7 - case vLongSlow = 2 case medSlow = 3 case medFast = 4 case shortSlow = 5 @@ -295,19 +294,17 @@ enum ModemPresets: Int, CaseIterable, Identifiable { case .longSlow: return "Long Range - Slow".localized case .longModerate: - return "long.range.moderate".localized - case .vLongSlow: - return "very.long.range.slow".localized + return "Long Range - Moderate".localized case .medSlow: - return "medium.range.slow".localized + return "Medium Range - Slow".localized case .medFast: - return "medium.range.fast".localized + return "Medium Range - Fast".localized case .shortSlow: - return "short.range.slow".localized + return "Short Range - Slow".localized case .shortFast: - return "short.range.fast".localized + return "Short Range - Fast".localized case .shortTurbo: - return "short.range.turbo".localized + return "Short Range - Turbo".localized } } var name: String { @@ -318,8 +315,6 @@ enum ModemPresets: Int, CaseIterable, Identifiable { return "LongSlow" case .longModerate: return "LongModerate" - case .vLongSlow: - return "VLongFast" case .medSlow: return "MediumSlow" case .medFast: @@ -340,8 +335,6 @@ enum ModemPresets: Int, CaseIterable, Identifiable { return -7.5 case .longModerate: return -17.5 - case .vLongSlow: - return -20 case .medSlow: return -15 case .medFast: @@ -362,8 +355,6 @@ enum ModemPresets: Int, CaseIterable, Identifiable { return Config.LoRaConfig.ModemPreset.longSlow case .longModerate: return Config.LoRaConfig.ModemPreset.longModerate - case .vLongSlow: - return Config.LoRaConfig.ModemPreset.veryLongSlow case .medSlow: return Config.LoRaConfig.ModemPreset.mediumSlow case .medFast: diff --git a/Meshtastic/Enums/PositionConfigEnums.swift b/Meshtastic/Enums/PositionConfigEnums.swift index 5c24510b..24607df3 100644 --- a/Meshtastic/Enums/PositionConfigEnums.swift +++ b/Meshtastic/Enums/PositionConfigEnums.swift @@ -21,17 +21,17 @@ enum GpsFormats: Int, CaseIterable, Identifiable { var description: String { switch self { case .gpsFormatDec: - return "gpsformat.dec".localized + return "Decimal Degrees Format".localized case .gpsFormatDms: - return "gpsformat.dms".localized + return "Degrees Minutes Seconds".localized case .gpsFormatUtm: - return "gpsformat.utm".localized + return "Universal Transverse Mercator".localized case .gpsFormatMgrs: - return "gpsformat.mgrs".localized + return "Military Grid Reference System".localized case .gpsFormatOlc: - return "gpsformat.olc".localized + return "Open Location Code (aka Plus Codes)".localized case .gpsFormatOsgr: - return "gpsformat.osgr".localized + return "Ordnance Survey Grid Reference".localized } } func protoEnumValue() -> Config.DisplayConfig.GpsCoordinateFormat { diff --git a/Meshtastic/Enums/RouteEnums.swift b/Meshtastic/Enums/RouteEnums.swift index 052d0407..06876b4a 100644 --- a/Meshtastic/Enums/RouteEnums.swift +++ b/Meshtastic/Enums/RouteEnums.swift @@ -20,34 +20,34 @@ enum ActivityType: Int, CaseIterable, Identifiable { var description: String { switch self { case .walking: - return "routes.activitytype.walking".localized + return "Walking".localized case .hiking: - return "routes.activitytype.hiking".localized + return "Hiking".localized case .biking: - return "routes.activitytype.biking".localized + return "Biking".localized case .driving: - return "routes.activitytype.driving".localized + return "Driving".localized case .overlanding: - return "routes.activitytype.overlanding".localized + return "Overlanding".localized case .skiing: - return "routes.activitytype.skiing".localized + return "Skiing".localized } } var fileNameString: String { switch self { case .walking: - return "routes.activitytype.filename.walking".localized + return "walk".localized case .hiking: - return "routes.activitytype.filename.hiking".localized + return "hiking".localized case .biking: - return "routes.activitytype.filename.biking".localized + return "biking".localized case .driving: - return "routes.activitytype.filename.driving".localized + return "driving".localized case .overlanding: - return "routes.activitytype.filename.overlanding".localized + return "overlanding".localized case .skiing: - return "routes.activitytype.filename.skiing".localized + return "skiing".localized } } } diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 63a4cc68..5f54afd1 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -739,7 +739,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate let supportedVersion = connectedVersion == "0.0.0" || self.minimumVersion.compare(connectedVersion, options: .numeric) == .orderedAscending || minimumVersion.compare(connectedVersion, options: .numeric) == .orderedSame if !supportedVersion { invalidVersion = true - lastConnectionError = "🚨" + "update.firmware".localized + lastConnectionError = "🚨" + "Update Your Firmware".localized return } } diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index d8477ee2..01e29d47 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -863,7 +863,7 @@ func upsertSecurityConfigPacket(config: Config.SecurityConfig, nodeNum: Int64, s func upsertAmbientLightingModuleConfigPacket(config: ModuleConfig.AmbientLightingConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.ambientlighting.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("Ambient Lighting module config received: %@".localized, String(nodeNum)) Logger.data.info("🏮 \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() diff --git a/Meshtastic/Tips/ChannelTips.swift b/Meshtastic/Tips/ChannelTips.swift index 6b6a0301..f378c257 100644 --- a/Meshtastic/Tips/ChannelTips.swift +++ b/Meshtastic/Tips/ChannelTips.swift @@ -13,10 +13,10 @@ return "tip.channels.share" } var title: Text { - Text("tip.channels.share.title") + Text("Sharing Meshtastic Channels") } var message: Text? { - Text("tip.channels.share.message") + Text("A Meshtastic QR code contains the LoRa config and channel values needed for radios to communicate. You can share a complete channel configuration using the Replace Channels option, if you choose Add Channels your shared channels will be added to the channels on the receiving radio.") } var image: Image? { Image(systemName: "qrcode") @@ -29,10 +29,10 @@ struct CreateChannelsTip: Tip { return "tip.channels.create" } var title: Text { - Text("tip.channels.create.title") + Text("Manage Channels") } var message: Text? { - Text("tip.channels.create.message") + Text("Most data on your mesh is sent over the primary channel. You can set up secondary channels to create additional messaging groups secured by their own key. [Channel config tips](https://meshtastic.org/docs/configuration/tips/)") } var image: Image? { Image(systemName: "fibrechannel") diff --git a/Meshtastic/Views/Bluetooth/Connect.swift b/Meshtastic/Views/Bluetooth/Connect.swift index 8e04f857..4b3dd213 100644 --- a/Meshtastic/Views/Bluetooth/Connect.swift +++ b/Meshtastic/Views/Bluetooth/Connect.swift @@ -46,7 +46,7 @@ struct Connect: View { VStack { List { if bleManager.isSwitchedOn { - Section(header: Text("connected.radio").font(.title)) { + Section(header: Text("Connected Radio").font(.title)) { if let connectedPeripheral = bleManager.connectedPeripheral, connectedPeripheral.peripheral.state == .connected { TipView(BluetoothConnectionTip(), arrowEdge: .bottom) VStack(alignment: .leading) { @@ -139,7 +139,7 @@ struct Connect: View { NavigationLink { LoRaConfig(node: node) } label: { - Label("set.region", systemImage: "globe.americas.fill") + Label("Set LoRa Region", systemImage: "globe.americas.fill") .foregroundColor(.red) .font(.title) } @@ -156,7 +156,7 @@ struct Connect: View { .frame(width: 60, height: 60) .padding(.trailing) if bleManager.timeoutTimerCount == 0 { - Text("connecting") + Text("Connecting . .") .font(.title2) .foregroundColor(.orange) } else { diff --git a/Meshtastic/Views/Bluetooth/InvalidVersion.swift b/Meshtastic/Views/Bluetooth/InvalidVersion.swift index 6a82581b..5d475756 100644 --- a/Meshtastic/Views/Bluetooth/InvalidVersion.swift +++ b/Meshtastic/Views/Bluetooth/InvalidVersion.swift @@ -17,7 +17,7 @@ struct InvalidVersion: View { VStack { - Text("update.firmware") + Text("Update Your Firmware") .font(.largeTitle) .foregroundColor(.orange) diff --git a/Meshtastic/Views/Nodes/DeviceMetricsLog.swift b/Meshtastic/Views/Nodes/DeviceMetricsLog.swift index c958d1ae..6335bcb3 100644 --- a/Meshtastic/Views/Nodes/DeviceMetricsLog.swift +++ b/Meshtastic/Views/Nodes/DeviceMetricsLog.swift @@ -209,7 +209,7 @@ struct DeviceMetricsLog: View { isPresented: $isPresentingClearLogConfirm, titleVisibility: .visible ) { - Button("device.metrics.delete", role: .destructive) { + Button("Delete all device metrics?", role: .destructive) { if clearTelemetry(destNum: node.num, metricsType: 0, context: context) { Logger.data.notice("Cleared Device Metrics for \(node.num, privacy: .public)") } else { diff --git a/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift b/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift index c01d86de..2978ceab 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeListItem.swift @@ -75,7 +75,7 @@ struct NodeListItem: View { if connected { IconAndText(systemName: "antenna.radiowaves.left.and.right.circle.fill", imageColor: .green, - text: "connected".localized) + text: "Connected".localized) } if node.lastHeard?.timeIntervalSince1970 ?? 0 > 0 && node.lastHeard! < Calendar.current.date(byAdding: .year, value: 1, to: Date())! { IconAndText(systemName: node.isOnline ? "checkmark.circle.fill" : "moon.circle.fill", diff --git a/Meshtastic/Views/Settings/Channels.swift b/Meshtastic/Views/Settings/Channels.swift index bff2dbb7..0a24c8c5 100644 --- a/Meshtastic/Views/Settings/Channels.swift +++ b/Meshtastic/Views/Settings/Channels.swift @@ -379,6 +379,6 @@ enum PositionPrecision: Int, CaseIterable, Identifiable { var description: String { let distanceFormatter = MKDistanceFormatter() - return String.localizedStringWithFormat("position.precision %@".localized, String(distanceFormatter.string(fromDistance: precisionMeters))) + return String.localizedStringWithFormat("Within %@".localized, String(distanceFormatter.string(fromDistance: precisionMeters))) } } diff --git a/Meshtastic/Views/Settings/Config/LoRaConfig.swift b/Meshtastic/Views/Settings/Config/LoRaConfig.swift index 20371f31..4ff56e01 100644 --- a/Meshtastic/Views/Settings/Config/LoRaConfig.swift +++ b/Meshtastic/Views/Settings/Config/LoRaConfig.swift @@ -304,6 +304,9 @@ struct LoRaConfig: View { } } func setLoRaValues() { + if node?.loRaConfig?.modemPreset ?? 0 == 2 { + node?.loRaConfig?.modemPreset = 0 + } self.hopLimit = Int(node?.loRaConfig?.hopLimit ?? 3) self.region = Int(node?.loRaConfig?.regionCode ?? 0) self.usePreset = node?.loRaConfig?.usePreset ?? true diff --git a/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift b/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift index bdbffa39..ebe21b81 100644 --- a/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift @@ -130,7 +130,7 @@ struct DetectionSensorConfig: View { } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) } - Section(header: Text("update.interval")) { + Section(header: Text("Update Interval")) { Picker("Minimum time between detection broadcasts", selection: $minimumBroadcastSecs) { ForEach(UpdateIntervals.allCases) { ui in Text(ui.description).tag(ui.rawValue) diff --git a/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift b/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift index 3f7f0dcf..79bf05b2 100644 --- a/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift @@ -32,7 +32,7 @@ struct TelemetryConfig: View { Form { ConfigHeader(title: "Telemetry", config: \.telemetryConfig, node: node, onAppear: setTelemetryValues) - Section(header: Text("update.interval")) { + Section(header: Text("Update Interval")) { Picker("Device Metrics", selection: $deviceUpdateInterval ) { ForEach(UpdateIntervals.allCases) { ui in if ui.rawValue >= 900 { diff --git a/Meshtastic/Views/Settings/Config/NetworkConfig.swift b/Meshtastic/Views/Settings/Config/NetworkConfig.swift index 566bbbf5..ff199cff 100644 --- a/Meshtastic/Views/Settings/Config/NetworkConfig.swift +++ b/Meshtastic/Views/Settings/Config/NetworkConfig.swift @@ -42,8 +42,8 @@ struct NetworkConfig: View { .toggleStyle(SwitchToggleStyle(tint: .accentColor)) HStack { - Label("ssid", systemImage: "network") - TextField("ssid", text: $wifiSsid) + Label("SSID", systemImage: "network") + TextField("SSID", text: $wifiSsid) .foregroundColor(.gray) .autocapitalization(.none) .disableAutocorrection(true) diff --git a/Meshtastic/Views/Settings/Config/PowerConfig.swift b/Meshtastic/Views/Settings/Config/PowerConfig.swift index 5fde379c..d875cb2b 100644 --- a/Meshtastic/Views/Settings/Config/PowerConfig.swift +++ b/Meshtastic/Views/Settings/Config/PowerConfig.swift @@ -32,8 +32,8 @@ struct PowerConfig: View { Section { if (currentDevice?.architecture == .esp32 || currentDevice?.architecture == .esp32S3) || (currentDevice?.architecture == .nrf52840 && (node?.deviceConfig?.role ?? 0 == 5 || node?.deviceConfig?.role ?? 0 == 6)) { Toggle(isOn: $isPowerSaving) { - Label("config.power.saving", systemImage: "bolt") - Text("config.power.saving.description") + Label("Power Saving", systemImage: "bolt") + Text("Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button.") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) } From 8c15ab69610570d950b9da4ee60dab9179247bce Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Thu, 8 May 2025 14:50:22 -0700 Subject: [PATCH 87/93] Review updated translation keys --- Localizable.xcstrings | 175 +++++++++--------------------------------- 1 file changed, 37 insertions(+), 138 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 9061d29d..f0c48e6e 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -5258,12 +5258,6 @@ "value" : "Категорија" } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Category" - } - }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -7321,55 +7315,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Verbindung nach %d Versuchen zu %@ fehlgeschlagen. Evtl. hilft es, die Verbindung unter Einstellungen > Bluetooth manuell zu löschen." } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Connexion impossible après %d essais avec %@. Allez dans Réglages > Bluetooth et essayez de faire de faire > Oublier cet appareil." } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "התחברות נכשלה לאחר %d נסיונות להתחבר ל%@. יתכן ויש צורך 'לשכוח' את המכשיר בהגדרות מכשיר > בלוטוס." } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Connessione fallita dopo %d tentativi di connessione a %@. Potrebbe essere necessario disaccoppiare il tuo dispositivo in Impostazioni > Bluetooth." } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Połączenie nie powiodło się po %d próbach połączenia z %@. Zapomnij o urządzeniu w Ustawienia > Bluetooth." } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Anslutningen misslyckades efter %d försök att ansluta till %@. Du kan behöva glömma din enhet under Inställningar > Bluetooth." } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Веза није успела након %d покушаја да се повеже са %@. Можда ћете морати да заборавите уређај у Подешавања > Блутут." } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "尝试连接%d失败,你可能需要在系统设置的蓝牙选项中忽略该设备。" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "嘗試連接%d失敗,您可能需要在系统設定的藍芽選項中忽略該節點。" } } @@ -11559,12 +11553,6 @@ "value" : "Извоз" } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Export" - } - }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", @@ -16839,19 +16827,19 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Malesia 919MHz" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Малезија 919MHz" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "馬來西亞 919MHz" } } @@ -20928,19 +20916,19 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Nuova Zelanda 865MHz" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Нови зеланд 865MHz" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "紐西蘭 865MHz" } } @@ -23742,19 +23730,19 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Filippine 433MHz" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Филипини 433MHz" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "菲律賓 433MHz" } } @@ -23786,19 +23774,19 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Filippine 915MHz" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Филипини 915MHz" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "菲律賓 915MHz" } } @@ -30601,59 +30589,17 @@ }, "Subsystem" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Subsystem" - } - }, - "fr" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Subsystem" - } - }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Subsystem" - } - }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Sottosistema" } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Subsystem" - } - }, - "se" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Subsystem" - } - }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Подсистем" } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Subsystem" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Subsystem" - } } } }, @@ -33061,35 +33007,17 @@ }, "Tracker" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Tracker" - } - }, - "it" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Tracker" - } - }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Трекер" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "追踪器" } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Tracker" - } } } }, @@ -33581,19 +33509,19 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ucraina 433MHz" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Украјина 433MHz" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "烏克蘭 433MHz" } } @@ -34091,55 +34019,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Firmware aktualisieren" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Mettre à jour votre Firmware" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "עדכן קושחה" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Aggiornare il firmware" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Zaktualizuj firmware" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Uppdatera din firmware" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ажурирај твој фирмвер" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "更新你的固件" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "更新韌體" } } @@ -34809,35 +34737,6 @@ } } }, - "very.long.range.slow" : { - "extractionState" : "stale", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Very Long Range - Slow" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "A lunghissimo raggio - Lento" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Веома дугачки домет - Споро" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Very Long Range - Slow" - } - } - } - }, "Via Lora" : { "localizations" : { "de" : { From 219a84cd624f044d6682b293e54c7255333814f0 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Thu, 8 May 2025 15:18:36 -0700 Subject: [PATCH 88/93] More translation strings --- Localizable.xcstrings | 80 +++---------------- Meshtastic/Enums/AppSettingsEnums.swift | 2 +- Meshtastic/Persistence/UpdateCoreData.swift | 6 +- .../Config/Module/TelemetryConfig.swift | 2 +- Meshtastic/Views/Settings/Settings.swift | 10 +-- 5 files changed, 20 insertions(+), 80 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index f0c48e6e..ece3b65f 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -8879,7 +8879,7 @@ } } }, - "device" : { + "Device" : { "localizations" : { "de" : { "stringUnit" : { @@ -8887,12 +8887,6 @@ "value" : "Gerät" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -16237,7 +16231,7 @@ } } }, - "logging" : { + "Logging" : { "localizations" : { "de" : { "stringUnit" : { @@ -16245,12 +16239,6 @@ "value" : "Logging" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Logging" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -17331,7 +17319,7 @@ } } }, - "mesh.log.bluetooth.config %@" : { + "Bluetooth config received: %@" : { "localizations" : { "de" : { "stringUnit" : { @@ -17339,12 +17327,6 @@ "value" : "Bluetooth Konfiguration empfangen: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth config received: %@" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -17685,7 +17667,7 @@ } } }, - "mesh.log.device.config %@" : { + "Device config received: %@" : { "localizations" : { "de" : { "stringUnit" : { @@ -17693,12 +17675,6 @@ "value" : "Gerätekonfiguration empfangen: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device config received: %@" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -18917,7 +18893,7 @@ } } }, - "mesh.log.telemetry.config %@" : { + "Telemetry module config received: %@" : { "localizations" : { "de" : { "stringUnit" : { @@ -18925,12 +18901,6 @@ "value" : "Telemetrie Modul Konfiguration empfangen: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetry module config received: %@" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -20148,7 +20118,7 @@ } } }, - "module.configuration" : { + "Module Configuration" : { "localizations" : { "de" : { "stringUnit" : { @@ -20156,12 +20126,6 @@ "value" : "Modul Konfiguration" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Module Configuration" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -20656,7 +20620,7 @@ } } }, - "network" : { + "Network" : { "localizations" : { "de" : { "stringUnit" : { @@ -20664,12 +20628,6 @@ "value" : "Netzwerk" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Network" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -21668,7 +21626,7 @@ } } }, - "nodelist.filter.distance %@" : { + "up to %@ away" : { "localizations" : { "de" : { "stringUnit" : { @@ -21676,12 +21634,6 @@ "value" : "bis zu %@ entfernt" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "up to %@ away" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -30845,7 +30797,7 @@ } } }, - "telemetry" : { + "Telemetry" : { "localizations" : { "de" : { "stringUnit" : { @@ -30853,12 +30805,6 @@ "value" : "Telemetrie (Sensoren)" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetry (Sensors)" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -30909,7 +30855,7 @@ } } }, - "telemetry.config" : { + "Telemetry Config" : { "localizations" : { "de" : { "stringUnit" : { @@ -30917,12 +30863,6 @@ "value" : "Telemetrie Einstellungen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetry Config" - } - }, "fr" : { "stringUnit" : { "state" : "translated", diff --git a/Meshtastic/Enums/AppSettingsEnums.swift b/Meshtastic/Enums/AppSettingsEnums.swift index 0797a0df..8355c4b4 100644 --- a/Meshtastic/Enums/AppSettingsEnums.swift +++ b/Meshtastic/Enums/AppSettingsEnums.swift @@ -66,7 +66,7 @@ enum MeshMapDistances: Double, CaseIterable, Identifiable { var id: Double { self.rawValue } var description: String { let distanceFormatter = MKDistanceFormatter() - return String.localizedStringWithFormat("nodelist.filter.distance %@".localized, distanceFormatter.string(fromDistance: Double(self.rawValue))) + return String.localizedStringWithFormat("up to %@ away".localized, distanceFormatter.string(fromDistance: Double(self.rawValue))) } } diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index 01e29d47..431bf95d 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -406,7 +406,7 @@ func upsertPositionPacket (packet: MeshPacket, context: NSManagedObjectContext) func upsertBluetoothConfigPacket(config: Config.BluetoothConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.bluetooth.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("Bluetooth config received: %@".localized, String(nodeNum)) Logger.mesh.info("📶 \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() @@ -450,7 +450,7 @@ func upsertBluetoothConfigPacket(config: Config.BluetoothConfig, nodeNum: Int64, func upsertDeviceConfigPacket(config: Config.DeviceConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.device.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("Device config received: %@".localized, String(nodeNum)) Logger.mesh.info("📟 \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -1393,7 +1393,7 @@ func upsertStoreForwardModuleConfigPacket(config: ModuleConfig.StoreForwardConfi func upsertTelemetryModuleConfigPacket(config: ModuleConfig.TelemetryConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.telemetry.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("Telemetry module config received: %@".localized, String(nodeNum)) Logger.data.info("📈 \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() diff --git a/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift b/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift index 79bf05b2..0dfe7566 100644 --- a/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/TelemetryConfig.swift @@ -124,7 +124,7 @@ struct TelemetryConfig: View { } } } - .navigationTitle("telemetry.config") + .navigationTitle("Telemetry Config") .navigationBarItems( trailing: ZStack { ConnectedDevice( diff --git a/Meshtastic/Views/Settings/Settings.swift b/Meshtastic/Views/Settings/Settings.swift index 1e9ab8a7..fc40aa52 100644 --- a/Meshtastic/Views/Settings/Settings.swift +++ b/Meshtastic/Views/Settings/Settings.swift @@ -124,7 +124,7 @@ struct Settings: View { NavigationLink(value: SettingsNavigationState.device) { Label { - Text("device") + Text("Device") } icon: { Image(systemName: "flipphone") } @@ -140,7 +140,7 @@ struct Settings: View { NavigationLink(value: SettingsNavigationState.network) { Label { - Text("network") + Text("Network") } icon: { Image(systemName: "network") } @@ -269,7 +269,7 @@ struct Settings: View { if isModuleSupported(.telemetryConfig) { NavigationLink(value: SettingsNavigationState.telemetry) { Label { - Text("telemetry") + Text("Telemetry") } icon: { Image(systemName: "chart.xyaxis.line") } @@ -286,7 +286,7 @@ struct Settings: View { Text("This node does not support any configurable modules.") } } header: { - Text("module.configuration") + Text("Module Configuration") } footer: { if moduleOverride { Text("Currently showing modules that may not be supported by this node.") @@ -295,7 +295,7 @@ struct Settings: View { } var loggingSection: some View { - Section(header: Text("logging")) { + Section(header: Text("Logging")) { NavigationLink(value: SettingsNavigationState.debugLogs) { Label { Text("Logs") From ffb3296ddfce03a59cdc4bcacf69c0483d18c333 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Thu, 8 May 2025 20:34:25 -0700 Subject: [PATCH 89/93] 60 stupid keys remaining --- Localizable.xcstrings | 2123 ++++++++--------- Meshtastic/Enums/DisplayEnums.swift | 8 +- Meshtastic/Helpers/BLEManager.swift | 2 +- Meshtastic/Helpers/MeshPackets.swift | 6 +- Meshtastic/Persistence/UpdateCoreData.swift | 10 +- Meshtastic/Views/Messages/Messages.swift | 2 +- .../Views/Nodes/DetectionSensorLog.swift | 4 +- Meshtastic/Views/Nodes/DeviceMetricsLog.swift | 4 +- Meshtastic/Views/Nodes/PaxCounterLog.swift | 2 +- Meshtastic/Views/Settings/About.swift | 2 +- .../Views/Settings/Config/DeviceConfig.swift | 2 +- .../Config/Module/DetectionSensorConfig.swift | 2 +- .../Settings/Config/Module/SerialConfig.swift | 2 +- Meshtastic/Views/Settings/RouteRecorder.swift | 2 +- Meshtastic/Views/Settings/Settings.swift | 6 +- 15 files changed, 962 insertions(+), 1215 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index ece3b65f..e91ed98c 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -4540,6 +4540,64 @@ } } }, + "Bluetooth config received: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth Konfiguration empfangen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration Bluetooth reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות בלוטוס התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione Bluetooth ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otrzymano konfigurację Bluetooth: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth-konfiguration mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Примљена конфигурација блутута: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth config received: %@" + } + } + } + }, "Bluetooth is off" : { "localizations" : { "de" : { @@ -5066,6 +5124,58 @@ } } }, + "Canned Message module config received: %@" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration du module messages préformatés reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות מודולת תגובות שמורות התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo Canned Message ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otrzymano konfigurację modułu wiadomości gotowych: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguration för modulen med fördefinierade meddelanden mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација модула за унапред припремљене поруке примљена: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canned Message module config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canned Message module config received: %@" + } + } + } + }, "Canned Messages" : { "localizations" : { "de" : { @@ -5182,6 +5292,64 @@ } } }, + "Canned Messages Messages Received For: %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messages préformatés reçus pour : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הודעות עבור הודעות שמורות התקבלו מ-%@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi in scatola Messaggi ricevuti per: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otrzymano Wiadomości Gotowe Dla: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mottagna meddelanden för fördefinierade meddelanden För: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Примљене поруке за унапред припремљене поруке за: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canned Messages Messages Received For: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canned Messages Messages Received For: %@" + } + } + } + }, "Carousel Interval" : { "localizations" : { "it" : { @@ -8165,14 +8333,8 @@ } } }, - "default.128x64.screen.layout" : { + "Default 128x64 screen layout" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Default 128x64 screen layout" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -8395,6 +8557,34 @@ } } }, + "Delete all pax data?" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Cancellare tutti i dati dei passeggeri?" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Radera all paxdata?" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Избриши све PAX податке?" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "要刪除所有 PAX 資料嗎?" + } + } + } + }, "Delete all positions?" : { "localizations" : { "it" : { @@ -8633,57 +8823,8 @@ } } }, - "Detection Sensor Log" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Registro del sensore di rilevamento" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Логови сензора откривања" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "檢測感測器紀錄" - } - } - } - }, - "Detection sensor messages are received as text messages. If you enable notifications you will recieve a notification for each detection message received and a corresponding unread message badge." : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "I messaggi del sensore di rilevamento vengono ricevuti come messaggi di testo. Se si attivano le notifiche, si riceverà una notifica per ogni messaggio di rilevamento ricevuto e un badge per il messaggio non letto corrispondente." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Поруке сензора за откривање се примају као текстуалне поруке. Ако омогућите обавештења, добићете обавештење за сваку примљену поруку за откривање и одговарајућу значку непрочитане поруке." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "检测传感器信息以文本信息的形式接收。如果启用通知功能,则每收到一条检测信息都会收到一条通知,并显示相应的未读信息。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "偵測感測器的訊息會以文字訊息的形式接收。若啟用通知功能,每當接收到偵測訊息時,您將會收到一則通知,並顯示對應的未讀訊息標記。" - } - } - } - }, - "detection.sensor" : { + "Detection Sensor" : { + "extractionState" : "manual", "localizations" : { "de" : { "stringUnit" : { @@ -8691,12 +8832,6 @@ "value" : "Detection Sensor" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detection Sensor" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -8747,14 +8882,8 @@ } } }, - "detection.sensor.config" : { + "Detection Sensor Config" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detection Sensor Config" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -8799,54 +8928,104 @@ } } }, - "detection.sensor.log" : { + "Detection Sensor Log" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detection Sensor Log" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Journal du capteur de détection" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "יומן חיישן זיהוי" - } - }, "it" : { "stringUnit" : { "state" : "translated", "value" : "Registro del sensore di rilevamento" } }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Logg för Detektionssensor" - } - }, "sr" : { "stringUnit" : { "state" : "translated", "value" : "Логови сензора откривања" } }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "檢測感測器紀錄" + } + } + } + }, + "Detection sensor messages are received as text messages. If you enable notifications you will recieve a notification for each detection message received and a corresponding unread message badge." : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "I messaggi del sensore di rilevamento vengono ricevuti come messaggi di testo. Se si attivano le notifiche, si riceverà una notifica per ogni messaggio di rilevamento ricevuto e un badge per il messaggio non letto corrispondente." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Поруке сензора за откривање се примају као текстуалне поруке. Ако омогућите обавештења, добићете обавештење за сваку примљену поруку за откривање и одговарајућу значку непрочитане поруке." + } + }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "检测传感器日志" + "value" : "检测传感器信息以文本信息的形式接收。如果启用通知功能,则每收到一条检测信息都会收到一条通知,并显示相应的未读信息。" } }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "檢測感測器紀錄" + "value" : "偵測感測器的訊息會以文字訊息的形式接收。若啟用通知功能,每當接收到偵測訊息時,您將會收到一則通知,並顯示對應的未讀訊息標記。" + } + } + } + }, + "Detection Sensor module config received: %@" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration du module capteur de détection reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות מודולת חיישן זיהוי התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo sensore di rilevamento ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Detection Sensor module config received: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguration för detektionssensormodulen mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација модула за сензор детекције примљена: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Detection Sensor module config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Detection Sensor module config received: %@" } } } @@ -8937,6 +9116,122 @@ } } }, + "Device Config" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gerätekonfiguration" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration de l'appareil" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות מכשיר" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del dispositivo" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguracja urządzenia" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enhetskonfiguration" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подешавања уређаја" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设备配置" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "節點設定" + } + } + } + }, + "Device config received: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gerätekonfiguration empfangen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration de l'appareil reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות מכשיר התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione dispositivo ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otrzymano konfigurację urządzenia: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enhetskonfiguration mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Примљена конфигурација уређаја: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Device config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Device config received: %@" + } + } + } + }, "Device Configuration" : { "localizations" : { "de" : { @@ -9039,6 +9334,64 @@ } } }, + "Device Metadata received from: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Device Metadata empfangen von: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metadatas de l'appareil reçues de : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מטא-דאטה של מכשיר התקבל מ-%@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metadati del dispositivo ricevuti da: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otrzymano metadane urządzenia od: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Metadata för enhet mottagen från: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Метаподаци уређаја примљени од: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Device Metadata admin message received from: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Device Metadata received from: %@" + } + } + } + }, "Device Metrics" : { "localizations" : { "it" : { @@ -9301,134 +9654,6 @@ } } }, - "device.config" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerätekonfiguration" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device Config" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration de l'appareil" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות מכשיר" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione del dispositivo" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguracja urządzenia" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enhetskonfiguration" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подешавања уређаја" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "设备配置" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "節點設定" - } - } - } - }, - "device.metrics.log" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device Metrics Log" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device Metrics Log" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Journal des mesures de l'appareil" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "יומן מכשיר" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Registro delle metriche del dispositivo" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dziennik metryk urządzenia" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Logg för Enhetsmätvärden" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Логови метрике уређаја" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "设备指标日志" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "裝置指標紀錄檔" - } - } - } - }, "Dilution of precision (DOP) PDOP used by default" : { "localizations" : { "it" : { @@ -9513,6 +9738,64 @@ } } }, + "Direct Messages" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Direktnachrichten" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messages directs" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הודעה פרטית" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi diretti" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bezpośrednie Wiadomości" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Direktmeddelanden" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Директне поруке" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "私聊" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "私人訊息" + } + } + } + }, "Direct messages are using the new public key infrastructure for encryption. Requires firmware version 2.5 or greater." : { "localizations" : { "it" : { @@ -9569,70 +9852,6 @@ } } }, - "direct.messages" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Direktnachrichten" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Direct Messages" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messages directs" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הודעה פרטית" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messaggi diretti" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bezpośrednie Wiadomości" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Direktmeddelanden" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Директне поруке" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "私聊" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "私人訊息" - } - } - } - }, "Disabled" : { "localizations" : { "de" : { @@ -11555,7 +11774,7 @@ } } }, - "external.notification" : { + "External Notification" : { "localizations" : { "de" : { "stringUnit" : { @@ -11563,12 +11782,6 @@ "value" : "Externe Benachrichtigung" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "External Notification" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -11619,6 +11832,58 @@ } } }, + "External Notification module config received: %@" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration du module notification extérieure reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות מודולת נוטיפיקציה חיצונית התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo di notifica esterno ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otrzymano konfigurację modułu zewnętrznych powiadomień: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguration för modulen för externa notifikationer mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација модула за екстерне нотификације примљена: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "External Notification module config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "External Notification module config received: %@" + } + } + } + }, "external.notification.config" : { "localizations" : { "de" : { @@ -12315,70 +12580,6 @@ } } }, - "firmware.version.unsupported" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nicht unterstützte Firmware Version erkannt. Kann nicht verbinden." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unsupported Firmware Version Detected, unable to connect to device." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Version non supportée du firmware détectée, impossible de se connecter à l'appareil." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "גרסת קושחה אינה נתמכת, לא ניתן להתחבר למכשיר." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rilevata versione firmware non supportata, impossibile connettersi al dispositivo." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wykryto nieobsługiwany wersję oprogramowania, brak możliwości połączenia z urządzeniem." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Okänd Firmwareversion upptäckt, kan inte ansluta till enheten." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Откривена је неподржана верзија фирмвера, није могуће повезати са уређајем." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "检测到不支持的固件版本,无法连接到设备。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "檢測到不支援的韌體版本,無法連接到節點。" - } - } - } - }, "First heard" : { "localizations" : { "it" : { @@ -13841,27 +14042,21 @@ }, "Hazardous" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hazardous" - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Pericoloso" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Опасно" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "危險" } } @@ -15499,14 +15694,8 @@ } } }, - "inverted.top.bar.for.2.color.display" : { + "Inverted top bar for 2 Color display" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inverted top bar for 2 Color display" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -17319,122 +17508,6 @@ } } }, - "Bluetooth config received: %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth Konfiguration empfangen: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration Bluetooth reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות בלוטוס התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione Bluetooth ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otrzymano konfigurację Bluetooth: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth-konfiguration mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Примљена конфигурација блутута: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bluetooth config received: %@" - } - } - } - }, - "mesh.log.cannedmessage.config %@" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canned Message module config received: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration du module messages préformatés reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות מודולת תגובות שמורות התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione del modulo Canned Message ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otrzymano konfigurację modułu wiadomości gotowych: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguration för modulen med fördefinierade meddelanden mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација модула за унапред припремљене поруке примљена: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canned Message module config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canned Message module config received: %@" - } - } - } - }, "mesh.log.cannedmessages.messages.get %@" : { "localizations" : { "en" : { @@ -17493,64 +17566,6 @@ } } }, - "mesh.log.cannedmessages.messages.received %@" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canned Messages Messages Received For: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messages préformatés reçus pour : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הודעות עבור הודעות שמורות התקבלו מ-%@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messaggi in scatola Messaggi ricevuti per: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otrzymano Wiadomości Gotowe Dla: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mottagna meddelanden för fördefinierade meddelanden För: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Примљене поруке за унапред припремљене поруке за: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canned Messages Messages Received For: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canned Messages Messages Received For: %@" - } - } - } - }, "mesh.log.channel.sent %@ %d" : { "localizations" : { "en" : { @@ -17609,187 +17624,7 @@ } } }, - "mesh.log.detectionsensor.config %@" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detection Sensor module config received: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration du module capteur de détection reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות מודולת חיישן זיהוי התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione del modulo sensore di rilevamento ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detection Sensor module config received: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguration för detektionssensormodulen mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација модула за сензор детекције примљена: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detection Sensor module config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detection Sensor module config received: %@" - } - } - } - }, - "Device config received: %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerätekonfiguration empfangen: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration de l'appareil reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות מכשיר התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione dispositivo ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otrzymano konfigurację urządzenia: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enhetskonfiguration mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Примљена конфигурација уређаја: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device config received: %@" - } - } - } - }, - "mesh.log.device.metadata.received %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device Metadata empfangen von: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device Metadata received from: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Metadatas de l'appareil reçues de : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מטא-דאטה של מכשיר התקבל מ-%@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Metadati del dispositivo ricevuti da: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otrzymano metadane urządzenia od: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Metadata för enhet mottagen från: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Метаподаци уређаја примљени од: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device Metadata admin message received from: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Device Metadata received from: %@" - } - } - } - }, - "mesh.log.display.config %@" : { + "Display config received: %@" : { "localizations" : { "de" : { "stringUnit" : { @@ -17797,12 +17632,6 @@ "value" : "Display Konfiguration empfangen: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Display config received: %@" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -17853,64 +17682,6 @@ } } }, - "mesh.log.externalnotification.config %@" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "External Notification module config received: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration du module notification extérieure reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות מודולת נוטיפיקציה חיצונית התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione del modulo di notifica esterno ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otrzymano konfigurację modułu zewnętrznych powiadomień: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguration för modulen för externa notifikationer mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација модула за екстерне нотификације примљена: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "External Notification module config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "External Notification module config received: %@" - } - } - } - }, "mesh.log.lora.config %@" : { "localizations" : { "de" : { @@ -18835,122 +18606,6 @@ } } }, - "mesh.log.storeforward.config %@" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Store & Forward module config received: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration du module Stocker et Transmettre reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות מודולת שמירה ושליחה התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione del modulo Store & Forward ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Store & Forward module config received: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguration för Store & Forward-modulen mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација модула за чување и прослеђивање примљена: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Store & Forward module config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Store & Forward module config received: %@" - } - } - } - }, - "Telemetry module config received: %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetrie Modul Konfiguration empfangen: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration du module télémetrie reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות מודולת טלמטריה התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione del modulo di telemetria ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odebrano konfigurację modułu telemetrii: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetrimodulkonfiguration mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација модула телеметрије примљена: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetry module config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetry module config received: %@" - } - } - } - }, "mesh.log.telemetry.received %@" : { "localizations" : { "de" : { @@ -19393,70 +19048,6 @@ } } }, - "mesh.log.waypoint.received %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wegpunkt von Knoten empfangen: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Waypoint Packet received from node: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Paquet Waypoint reçu du noeud : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "נקודת ציון התקבלה מ-%@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pacchetto Waypoint ricevuto dal nodo: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odebrano pakiet punktu orientacyjnego od węzła: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vägpunktspaket mottaget från nod: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пакет са тачкама пута примљен од чвора: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Waypoint Packet received from node: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Waypoint Packet received from node: %@" - } - } - } - }, "mesh.log.waypoint.sent %@" : { "localizations" : { "de" : { @@ -21626,64 +21217,6 @@ } } }, - "up to %@ away" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "bis zu %@ entfernt" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "up to %@ away" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "up to %@ away" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "fino a %@ di distanza" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "up to %@ away" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "upp till %@ bort" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "удаљено до максималних %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "最远距离 %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "距離%@以內" - } - } - } - }, "nodes" : { "localizations" : { "de" : { @@ -22742,6 +22275,28 @@ } } }, + "Optimized for 2 color displays" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ottimizzato per i display a 2 colori" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Оптимизовано за двобојне дисплеје" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "為雙色螢幕最佳化" + } + } + } + }, "Optimized for ATAK system communication, reduces routine broadcasts." : { "localizations" : { "de" : { @@ -22800,34 +22355,6 @@ } } }, - "optimized.for.2.color.displays" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Optimized for 2 color displays" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ottimizzato per i display a 2 colori" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Оптимизовано за двобојне дисплеје" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "為雙色螢幕最佳化" - } - } - } - }, "Optional fields to include when assembling position messages. the more fields are included, the larger the message will be - leading to longer airtime and a higher risk of packet loss" : { "localizations" : { "it" : { @@ -23582,40 +23109,6 @@ } } }, - "paxcounter.delete" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete all pax data?" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancellare tutti i dati dei passeggeri?" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Radera all paxdata?" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Избриши све PAX податке?" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "要刪除所有 PAX 資料嗎?" - } - } - } - }, "paxcounter.log" : { "localizations" : { "en" : { @@ -25354,7 +24847,7 @@ } } }, - "range.test" : { + "Range Test" : { "localizations" : { "de" : { "stringUnit" : { @@ -25362,12 +24855,6 @@ "value" : "Entfernungstest" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Range Test" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -28629,6 +28116,64 @@ } } }, + "Serial Config" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serial Konfiguration" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration série" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "'הגדרות מודולה 'סיריאלי" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione seriale" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguracja seryjna" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seriekonfiguration" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подешавања серијске везе" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "串口配置" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "序列設定" + } + } + } + }, "Serial Console" : { "localizations" : { "de" : { @@ -28685,70 +28230,6 @@ } } }, - "serial.config" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Serial Konfiguration" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Serial Config" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration série" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "'הגדרות מודולה 'סיריאלי" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione seriale" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguracja seryjna" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seriekonfiguration" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подешавања серијске везе" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "串口配置" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "序列設定" - } - } - } - }, "Series" : { "localizations" : { "it" : { @@ -30283,7 +29764,7 @@ } } }, - "start" : { + "Start" : { "localizations" : { "de" : { "stringUnit" : { @@ -30291,12 +29772,6 @@ "value" : "Start" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Start" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -30425,6 +29900,58 @@ } } }, + "Store & Forward module config received: %@" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration du module Stocker et Transmettre reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות מודולת שמירה ושליחה התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo Store & Forward ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Store & Forward module config received: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguration för Store & Forward-modulen mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација модула за чување и прослеђивање примљена: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Store & Forward module config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Store & Forward module config received: %@" + } + } + } + }, "Store and forward servers require an ESP32 device with PSRAM or Linux Native." : { "localizations" : { "en" : { @@ -30913,6 +30440,64 @@ } } }, + "Telemetry module config received: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telemetrie Modul Konfiguration empfangen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration du module télémetrie reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות מודולת טלמטריה התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo di telemetria ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odebrano konfigurację modułu telemetrii: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telemetrimodulkonfiguration mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација модула телеметрије примљена: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telemetry module config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telemetry module config received: %@" + } + } + } + }, "Temp" : { "localizations" : { "de" : { @@ -31177,14 +30762,8 @@ } } }, - "tft.full.color.displays" : { + "TFT Full Color Displays" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "TFT Full Color Displays" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -33847,6 +33426,64 @@ } } }, + "Unsupported Firmware Version Detected, unable to connect to device." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nicht unterstützte Firmware Version erkannt. Kann nicht verbinden." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Version non supportée du firmware détectée, impossible de se connecter à l'appareil." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "גרסת קושחה אינה נתמכת, לא ניתן להתחבר למכשיר." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rilevata versione firmware non supportata, impossibile connettersi al dispositivo." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wykryto nieobsługiwany wersję oprogramowania, brak możliwości połączenia z urządzeniem." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Okänd Firmwareversion upptäckt, kan inte ansluta till enheten." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Откривена је неподржана верзија фирмвера, није могуће повезати са уређајем." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "检测到不支持的固件版本,无法连接到设备。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "檢測到不支援的韌體版本,無法連接到節點。" + } + } + } + }, "Up" : { "localizations" : { "de" : { @@ -33933,6 +33570,64 @@ } } }, + "up to %@ away" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "bis zu %@ entfernt" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "up to %@ away" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "up to %@ away" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "fino a %@ di distanza" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "up to %@ away" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "upp till %@ bort" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "удаљено до максималних %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "最远距离 %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "距離%@以內" + } + } + } + }, "Update Interval" : { "localizations" : { "it" : { @@ -34615,7 +34310,7 @@ } } }, - "Version: %@ (%@) " : { + "Version: %1$@ (%2$@)" : { "localizations" : { "de" : { "stringUnit" : { @@ -34623,12 +34318,6 @@ "value" : "Version: %1$@ (%2$@) " } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Version: %1$@ (%2$@) " - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -35045,6 +34734,64 @@ } } }, + "Waypoint Packet received from node: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wegpunkt von Knoten empfangen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paquet Waypoint reçu du noeud : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "נקודת ציון התקבלה מ-%@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pacchetto Waypoint ricevuto dal nodo: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odebrano pakiet punktu orientacyjnego od węzła: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vägpunktspaket mottaget från nod: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пакет са тачкама пута примљен од чвора: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Waypoint Packet received from node: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Waypoint Packet received from node: %@" + } + } + } + }, "Weather Conditions" : { "localizations" : { "de" : { diff --git a/Meshtastic/Enums/DisplayEnums.swift b/Meshtastic/Enums/DisplayEnums.swift index 089140f0..664d72a5 100644 --- a/Meshtastic/Enums/DisplayEnums.swift +++ b/Meshtastic/Enums/DisplayEnums.swift @@ -149,13 +149,13 @@ enum DisplayModes: Int, CaseIterable, Identifiable { var description: String { switch self { case .defaultMode: - return "default.128x64.screen.layout".localized + return "Default 128x64 screen layout".localized case .twoColor: - return "optimized.for.2.color.displays".localized + return "Optimized for 2 color displays".localized case .inverted: - return "inverted.top.bar.for.2.color.display".localized + return "Inverted top bar for 2 Color display".localized case .color: - return "tft.full.color.displays".localized + return "TFT Full Color Displays".localized } } func protoEnumValue() -> Config.DisplayConfig.DisplayMode { diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 5f54afd1..6c34d65c 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -498,7 +498,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate guard connectedPeripheral?.peripheral.state ?? CBPeripheralState.disconnected == CBPeripheralState.connected else { return } if FROMRADIO_characteristic == nil { - Logger.mesh.error("🚨 \("firmware.version.unsupported".localized, privacy: .public)") + Logger.mesh.error("🚨 \("Unsupported Firmware Version Detected, unable to connect to device.".localized, privacy: .public)") invalidVersion = true return } else { diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index bcc4659b..c208c525 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -209,7 +209,7 @@ func channelPacket (channel: Channel, fromNum: Int64, context: NSManagedObjectCo func deviceMetadataPacket (metadata: DeviceMetadata, fromNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { if metadata.isInitialized { - let logString = String.localizedStringWithFormat("mesh.log.device.metadata.received %@".localized, fromNum.toHex()) + let logString = String.localizedStringWithFormat("Device Metadata received from: %@".localized, fromNum.toHex()) Logger.mesh.info("🏷️ \(logString, privacy: .public)") let fetchedNodeRequest = NodeInfoEntity.fetchRequest() @@ -472,7 +472,7 @@ func adminAppPacket (packet: MeshPacket, context: NSManagedObjectContext) { if !cmmc.messages.isEmpty { - let logString = String.localizedStringWithFormat("mesh.log.cannedmessages.messages.received %@".localized, packet.from.toHex()) + let logString = String.localizedStringWithFormat("Canned Messages Messages Received For: %@".localized, packet.from.toHex()) Logger.mesh.info("🥫 \(logString, privacy: .public)") let fetchNodeRequest = NodeInfoEntity.fetchRequest() @@ -1037,7 +1037,7 @@ func textMessageAppPacket( func waypointPacket (packet: MeshPacket, context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.waypoint.received %@".localized, String(packet.from)) + let logString = String.localizedStringWithFormat("Waypoint Packet received from node: %@".localized, String(packet.from)) Logger.mesh.info("📍 \(logString, privacy: .public)") let fetchWaypointRequest = WaypointEntity.fetchRequest() diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index 431bf95d..7823272b 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -505,7 +505,7 @@ func upsertDeviceConfigPacket(config: Config.DeviceConfig, nodeNum: Int64, sessi func upsertDisplayConfigPacket(config: Config.DisplayConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.display.config %@".localized, nodeNum.toHex()) + let logString = String.localizedStringWithFormat("Display config received: %@".localized, nodeNum.toHex()) Logger.data.info("🖥️ \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() @@ -916,7 +916,7 @@ func upsertAmbientLightingModuleConfigPacket(config: ModuleConfig.AmbientLightin func upsertCannedMessagesModuleConfigPacket(config: ModuleConfig.CannedMessageConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.cannedmessage.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("Canned Message module config received: %@".localized, String(nodeNum)) Logger.data.info("🥫 \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() @@ -975,7 +975,7 @@ func upsertCannedMessagesModuleConfigPacket(config: ModuleConfig.CannedMessageCo func upsertDetectionSensorModuleConfigPacket(config: ModuleConfig.DetectionSensorConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.detectionsensor.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("Detection Sensor module config received: %@".localized, String(nodeNum)) Logger.data.info("🕵️ \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() @@ -1032,7 +1032,7 @@ func upsertDetectionSensorModuleConfigPacket(config: ModuleConfig.DetectionSenso func upsertExternalNotificationModuleConfigPacket(config: ModuleConfig.ExternalNotificationConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.externalnotification.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("External Notification module config received: %@".localized, String(nodeNum)) Logger.data.info("📣 \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() @@ -1344,7 +1344,7 @@ func upsertSerialModuleConfigPacket(config: ModuleConfig.SerialConfig, nodeNum: func upsertStoreForwardModuleConfigPacket(config: ModuleConfig.StoreForwardConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.storeforward.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("Store & Forward module config received: %@".localized, String(nodeNum)) Logger.data.info("📬 \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() diff --git a/Meshtastic/Views/Messages/Messages.swift b/Meshtastic/Views/Messages/Messages.swift index 7580079b..cb6947c0 100644 --- a/Meshtastic/Views/Messages/Messages.swift +++ b/Meshtastic/Views/Messages/Messages.swift @@ -50,7 +50,7 @@ struct Messages: View { } NavigationLink(value: MessagesNavigationState.directMessages()) { Label { - Text("direct.messages") + Text("Direct Messages") .badge(unreadDirectMessages) .font(.title2) .padding() diff --git a/Meshtastic/Views/Nodes/DetectionSensorLog.swift b/Meshtastic/Views/Nodes/DetectionSensorLog.swift index af07b9e7..e4c22e0d 100644 --- a/Meshtastic/Views/Nodes/DetectionSensorLog.swift +++ b/Meshtastic/Views/Nodes/DetectionSensorLog.swift @@ -118,7 +118,7 @@ struct DetectionSensorLog: View { .padding(.bottom) .padding(.trailing) } - .navigationTitle("detection.sensor.log") + .navigationTitle("Detection Sensor Log") .navigationBarTitleDisplayMode(.inline) .navigationBarItems(trailing: ZStack { @@ -128,7 +128,7 @@ struct DetectionSensorLog: View { isPresented: $isExporting, document: CsvDocument(emptyCsv: exportString), contentType: .commaSeparatedText, - defaultFilename: String("\(node.user?.longName ?? "Node") \("detection.sensor.log".localized)"), + defaultFilename: String("\(node.user?.longName ?? "Node") \("Detection Sensor Log".localized)"), onCompletion: { result in switch result { case .success: diff --git a/Meshtastic/Views/Nodes/DeviceMetricsLog.swift b/Meshtastic/Views/Nodes/DeviceMetricsLog.swift index 6335bcb3..e7b4c952 100644 --- a/Meshtastic/Views/Nodes/DeviceMetricsLog.swift +++ b/Meshtastic/Views/Nodes/DeviceMetricsLog.swift @@ -240,7 +240,7 @@ struct DeviceMetricsLog: View { ContentUnavailableView("No Device Metrics", systemImage: "slash.circle") } } - .navigationTitle("device.metrics.log") + .navigationTitle("Device Metrics Log") .navigationBarTitleDisplayMode(.inline) .navigationBarItems(trailing: ZStack { @@ -250,7 +250,7 @@ struct DeviceMetricsLog: View { isPresented: $isExporting, document: CsvDocument(emptyCsv: exportString), contentType: .commaSeparatedText, - defaultFilename: String("\(node.user?.longName ?? "Node") \("device.metrics.log".localized)"), + defaultFilename: String("\(node.user?.longName ?? "Node") \("Device Metrics Log".localized)"), onCompletion: { result in switch result { case .success: diff --git a/Meshtastic/Views/Nodes/PaxCounterLog.swift b/Meshtastic/Views/Nodes/PaxCounterLog.swift index ed5a87c8..a5ca0194 100644 --- a/Meshtastic/Views/Nodes/PaxCounterLog.swift +++ b/Meshtastic/Views/Nodes/PaxCounterLog.swift @@ -174,7 +174,7 @@ struct PaxCounterLog: View { isPresented: $isPresentingClearLogConfirm, titleVisibility: .visible ) { - Button("paxcounter.delete", role: .destructive) { + Button("Delete all pax data?", role: .destructive) { if clearPax(destNum: node.num, context: context) { Logger.services.info("Cleared Pax Counter for \(node.num, privacy: .public)") } else { diff --git a/Meshtastic/Views/Settings/About.swift b/Meshtastic/Views/Settings/About.swift index f6854bcb..e65a4c64 100644 --- a/Meshtastic/Views/Settings/About.swift +++ b/Meshtastic/Views/Settings/About.swift @@ -48,7 +48,7 @@ struct AboutMeshtastic: View { } .font(.title2) - Text("Version: \(Bundle.main.appVersionLong) (\(Bundle.main.appBuild)) ") + Text("Version: \(Bundle.main.appVersionLong) (\(Bundle.main.appBuild))") } Section(header: Text("Project information")) { diff --git a/Meshtastic/Views/Settings/Config/DeviceConfig.swift b/Meshtastic/Views/Settings/Config/DeviceConfig.swift index 89f50cc9..6539848a 100644 --- a/Meshtastic/Views/Settings/Config/DeviceConfig.swift +++ b/Meshtastic/Views/Settings/Config/DeviceConfig.swift @@ -247,7 +247,7 @@ struct DeviceConfig: View { } Spacer() } - .navigationTitle("device.config") + .navigationTitle("Device Config") .navigationBarItems( trailing: ZStack { ConnectedDevice( diff --git a/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift b/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift index ebe21b81..e042ca77 100644 --- a/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/DetectionSensorConfig.swift @@ -181,7 +181,7 @@ struct DetectionSensorConfig: View { } } } - .navigationTitle("detection.sensor.config") + .navigationTitle("Detection Sensor Config") .navigationBarItems( trailing: ZStack { ConnectedDevice( diff --git a/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift b/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift index 47dca015..0bbe9fbc 100644 --- a/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/SerialConfig.swift @@ -126,7 +126,7 @@ struct SerialConfig: View { } } } - .navigationTitle("serial.config") + .navigationTitle("Serial Config") .navigationBarItems( trailing: ZStack { ConnectedDevice( diff --git a/Meshtastic/Views/Settings/RouteRecorder.swift b/Meshtastic/Views/Settings/RouteRecorder.swift index 56c35163..3c7bd81a 100644 --- a/Meshtastic/Views/Settings/RouteRecorder.swift +++ b/Meshtastic/Views/Settings/RouteRecorder.swift @@ -191,7 +191,7 @@ struct RouteRecorder: View { Logger.data.error("Error Saving RouteEntity from the Route Recorder \(nsError, privacy: .public)") } } label: { - Label("start", systemImage: "play") + Label("Start", systemImage: "play") } .buttonStyle(.bordered) .buttonBorderShape(.capsule) diff --git a/Meshtastic/Views/Settings/Settings.swift b/Meshtastic/Views/Settings/Settings.swift index fc40aa52..d84d24cd 100644 --- a/Meshtastic/Views/Settings/Settings.swift +++ b/Meshtastic/Views/Settings/Settings.swift @@ -189,7 +189,7 @@ struct Settings: View { if isModuleSupported(.detectionsensorConfig) { NavigationLink(value: SettingsNavigationState.detectionSensor) { Label { - Text("detection.sensor") + Text("Detection Sensor") } icon: { Image(systemName: "sensor") } @@ -199,7 +199,7 @@ struct Settings: View { if isModuleSupported(.extnotifConfig) { NavigationLink(value: SettingsNavigationState.externalNotification) { Label { - Text("external.notification") + Text("External Notification") } icon: { Image(systemName: "megaphone") } @@ -219,7 +219,7 @@ struct Settings: View { if isModuleSupported(.rangetestConfig) { NavigationLink(value: SettingsNavigationState.rangeTest) { Label { - Text("range.test") + Text("Range Test") } icon: { Image(systemName: "point.3.connected.trianglepath.dotted") } From 70fa86ae327730e6c26f7b073604edd6ec004748 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Thu, 8 May 2025 22:50:44 -0700 Subject: [PATCH 90/93] Finish updating translation strings --- Localizable.xcstrings | 4658 ++++++++--------- Meshtastic/Helpers/BLEManager.swift | 20 +- Meshtastic/Helpers/MeshPackets.swift | 12 +- Meshtastic/Persistence/UpdateCoreData.swift | 20 +- Meshtastic/Views/Bluetooth/Connect.swift | 4 +- Meshtastic/Views/ContentView.swift | 4 +- .../Messages/MessageContextMenuItems.swift | 6 +- Meshtastic/Views/Nodes/NodeList.swift | 4 +- Meshtastic/Views/Nodes/PaxCounterLog.swift | 4 +- Meshtastic/Views/Nodes/PowerMetricsLog.swift | 2 +- Meshtastic/Views/Settings/AppData.swift | 2 +- .../Views/Settings/Config/LoRaConfig.swift | 2 +- .../Module/ExternalNotificationConfig.swift | 2 +- .../Settings/Config/Module/MQTTConfig.swift | 4 +- .../Config/Module/PaxCounterConfig.swift | 4 +- .../Config/Module/RangeTestConfig.swift | 2 +- .../Settings/Config/Module/RtttlConfig.swift | 10 +- .../Config/Module/StoreForwardConfig.swift | 2 +- .../Views/Settings/Config/NetworkConfig.swift | 2 +- .../Settings/Config/PositionConfig.swift | 2 +- .../Views/Settings/Config/PowerConfig.swift | 6 +- .../Settings/Config/SaveConfigButton.swift | 2 +- Meshtastic/Views/Settings/Settings.swift | 6 +- Meshtastic/Views/Settings/ShareChannels.swift | 2 +- 24 files changed, 2198 insertions(+), 2584 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index e91ed98c..7c0d5e8d 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -5294,12 +5294,6 @@ }, "Canned Messages Messages Received For: %@" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -6776,345 +6770,6 @@ } } }, - "config.module.paxcounter.title" : { - - }, - "config.module.paxcounter.updateinterval.description" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "How often we can send a message to the mesh when people are detected." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "How often we can send a message to the mesh when people are detected." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "How often we can send a message to the mesh when people are detected." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quanto spesso possiamo inviare un messaggio alla rete quando le persone vengono rilevate." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "How often we can send a message to the mesh when people are detected." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hur ofta vi kan skicka ett meddelande till mesh-nätverket när personer upptäcks." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Колико често можемо послати поруку мрежи када се открију људи." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "检测到人员时,我们可以隔多久发送一条消息到 Mesh" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "當檢測到人員時,我們可以多久發送一次訊息到網狀網路。" - } - } - } - }, - "config.power.shutdown.on.power.loss" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Herunterfahren bei Stromunterbruch" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Shutdown on Power Loss" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Shutdown on Power Loss" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Spegnimento in caso di perdita di alimentazione" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Shutdown on Power Loss" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stäng av vid Strömförlust" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Искључи уређај при губитку напајања" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "断电时关机" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "斷電自動關機" - } - } - } - }, - "config.power.title" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stromkonfiguration" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Power Config" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Power Config" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione dell'alimentazione" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Power Config" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Strömkonfiguration" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подешавања напајња" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "电源配置" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電源設定" - } - } - } - }, - "config.ringtone.description" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringtone Transfer Language(RTTTL) Stringa di suoneria utilizzata dai cicalini supportati nelle notifiche esterne." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringsignalöverföringsspråk (RTTTL) Ringsignalsträng som används av stödda buzzers i externa notifikationer." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Језик преноса мелдоије звона (RTTTL) Стринг мелодије звона који користе подржани звучни сигнали у спољним обавештењима." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "支持外部通知中使用的铃声传输语言 (RTTTL) 铃声字符串。" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL 鈴聲字串(Ringtone Transfer Language)被用於外部通知中支援的蜂鳴器。" - } - } - } - }, - "config.ringtone.label" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringtone Transfer Language" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringtone Transfer Language" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lingua di trasferimento della suoneria" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringtone Transfer Language" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Språk för Överföring av Ringsignal" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Језик преноса мелодије звона" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "铃声传输语言" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "鈴聲傳輸語言(RTTTL)" - } - } - } - }, - "config.ringtone.title" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Klingelton Konfiguration" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringtone Config" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringtone Config" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione della suoneria" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringtone Config" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ringsignalskonfiguration" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација звона" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "铃声配置" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "鈴聲" - } - } - } - }, "Configuration for: %@" : { "localizations" : { "de" : { @@ -10136,6 +9791,64 @@ } } }, + "Display config received: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Display Konfiguration empfangen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration de l'écran reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות תצוגה התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Visualizzazione della configurazione ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otrzymano konfigurację wyświetlacza: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skärmkonfiguration mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Примљена конфигурација приказа: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Display config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Display config received: %@" + } + } + } + }, "Display Fahrenheit" : { "localizations" : { "it" : { @@ -11832,59 +11545,7 @@ } } }, - "External Notification module config received: %@" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration du module notification extérieure reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות מודולת נוטיפיקציה חיצונית התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione del modulo di notifica esterno ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otrzymano konfigurację modułu zewnętrznych powiadomień: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguration för modulen för externa notifikationer mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација модула за екстерне нотификације примљена: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "External Notification module config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "External Notification module config received: %@" - } - } - } - }, - "external.notification.config" : { + "External Notification Config" : { "localizations" : { "de" : { "stringUnit" : { @@ -11892,12 +11553,6 @@ "value" : "Einstellungen der externen Benachrichtigung" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "External Notification Config" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -11948,6 +11603,58 @@ } } }, + "External Notification module config received: %@" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration du module notification extérieure reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות מודולת נוטיפיקציה חיצונית התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo di notifica esterno ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otrzymano konfigurację modułu zewnętrznych powiadomień: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguration för modulen för externa notifikationer mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација модула за екстерне нотификације примљена: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "External Notification module config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "External Notification module config received: %@" + } + } + } + }, "Factory Reset" : { "localizations" : { "de" : { @@ -13446,7 +13153,7 @@ } } }, - "generate.qr.code" : { + "Generate QR Code" : { "localizations" : { "de" : { "stringUnit" : { @@ -13454,12 +13161,6 @@ "value" : "QR Code Erzeugen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Generate QR Code" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -14776,6 +14477,58 @@ } } }, + "How often we can send a message to the mesh when people are detected." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "How often we can send a message to the mesh when people are detected." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "How often we can send a message to the mesh when people are detected." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quanto spesso possiamo inviare un messaggio alla rete quando le persone vengono rilevate." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "How often we can send a message to the mesh when people are detected." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hur ofta vi kan skicka ett meddelande till mesh-nätverket när personer upptäcks." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Колико често можемо послати поруку мрежи када се открију људи." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "检测到人员时,我们可以隔多久发送一条消息到 Mesh" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "當檢測到人員時,我們可以多久發送一次訊息到網狀網路。" + } + } + } + }, "How to update Firmware" : { "localizations" : { "de" : { @@ -15722,6 +15475,58 @@ } } }, + "Issuing Want Config to %@" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Envoi d'un Want Config à %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שולח בקשת הגדרות ל-%@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Emissione di Want Config a %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wydawanie Want Config to %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utfärdar Want Config till %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Издавање захтева за конфигурацију на: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Issuing Want Config to %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Issuing Want Config to %@" + } + } + } + }, "Japan" : { "localizations" : { "it" : { @@ -16730,7 +16535,7 @@ } } }, - "lora" : { + "LoRa" : { "localizations" : { "de" : { "stringUnit" : { @@ -16738,12 +16543,6 @@ "value" : "LoRa" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "LoRa" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -16794,7 +16593,7 @@ } } }, - "lora.config" : { + "LoRa Config" : { "localizations" : { "de" : { "stringUnit" : { @@ -16802,12 +16601,6 @@ "value" : "LoRa Einstellungen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "LoRa Config" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -16858,6 +16651,64 @@ } } }, + "LoRa config received: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "LoRa config empfangen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration LoRa reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות לורה התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione LoRa ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otrzymano konfigurację LoRa: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "LoRa-konfiguration mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација LoRA примљена: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "LoRa config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "LoRa config received: %@" + } + } + } + }, "Lost and Found" : { "localizations" : { "de" : { @@ -16918,61 +16769,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "M5 Stack Card KB / RAK Tastenfeld" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "M5 Stack Card KB / RAK Keypad" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Clavier M5 Stack Card KB / RAK" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "M5 Stack Card KB / RAK Keypad" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "M5 Stack Card KB / Tastiera RAK" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "M5 Stack Card KB / RAK Keypad" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "M5 Stack Card KB / RAK Keypad" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "M5 стек картица KB / RAK тастатура" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "M5 Stack 卡片键盘 / RAK 键盘" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "M5Stack 卡片鍵盤 / RAK 鍵盤" } } @@ -17166,70 +17011,6 @@ } } }, - "map" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mesh Karte" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mesh Map" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Carte de maillage" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מפת מש" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mappa della mesh" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mapa Sieci" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mesh Karta" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Мапа меша" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mesh 地图" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mesh 地圖" - } - } - } - }, "Map Options" : { "localizations" : { "de" : { @@ -17444,7 +17225,7 @@ } } }, - "mesh.live.activity" : { + "Mesh Live Activity" : { "localizations" : { "de" : { "stringUnit" : { @@ -17452,12 +17233,6 @@ "value" : "Mesh Live Aktivität" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mesh Live Activity" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -17508,565 +17283,65 @@ } } }, - "mesh.log.cannedmessages.messages.get %@" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requested Canned Messages Module Messages for node: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messages du module messages préformatés demandés pour le noeud : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "התבקשו הודעות מודולת הודעות שמורות עבור מכשיר: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messaggi in scatola richiesti Messaggi del modulo per il nodo: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zażądano Wiadomości z Modułu Wiadomości Gotowych dla węzła: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Begärda meddelanden för modulen med fördefinierade meddelanden för nod: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Захтеване поруке модула за унапред припремљене поруке за чвор: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requested Canned Messages Module Messages for node: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requested Canned Messages Module Messages for node: %@" - } - } - } - }, - "mesh.log.channel.sent %@ %d" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a Channel for: %@ Channel Index %d" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Canal envoyé pour : %@ Canal index %d" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "נשלח ערוץ עבור: %@ אינדקס ערוצים %d" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inviato un canale per: %@ Canale Indice %d" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wysłano kanał dla: %@ Indeks kanału %d" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Skickade en kanal för: %@ Kanalindex %d" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Послат је канал за: %@ Индекс канала %d" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a Channel for: %@ Channel Index %d" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a Channel for: %@ Channel Index %d" - } - } - } - }, - "Display config received: %@" : { + "Mesh Map" : { "localizations" : { "de" : { "stringUnit" : { "state" : "translated", - "value" : "Display Konfiguration empfangen: %@" + "value" : "Mesh Karte" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Configuration de l'écran reçue : %@" + "value" : "Carte de maillage" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הגדרות תצוגה התקבלו: %@" + "value" : "מפת מש" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Visualizzazione della configurazione ricevuta: %@" + "value" : "Mappa della mesh" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Otrzymano konfigurację wyświetlacza: %@" + "value" : "Mapa Sieci" } }, "se" : { "stringUnit" : { "state" : "translated", - "value" : "Skärmkonfiguration mottagen: %@" + "value" : "Mesh Karta" } }, "sr" : { "stringUnit" : { "state" : "translated", - "value" : "Примљена конфигурација приказа: %@" + "value" : "Мапа меша" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Display config received: %@" + "value" : "Mesh 地图" } }, "zh-Hant-TW" : { "stringUnit" : { "state" : "translated", - "value" : "Display config received: %@" + "value" : "Mesh 地圖" } } } }, - "mesh.log.lora.config %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "LoRa config empfangen: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "LoRa config received: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration LoRa reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות לורה התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione LoRa ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otrzymano konfigurację LoRa: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "LoRa-konfiguration mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација LoRA примљена: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "LoRa config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "LoRa config received: %@" - } - } - } - }, - "mesh.log.lora.config.sent %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "LoRa.Config gesendet für: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a LoRa.Config for: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration LoRa envoyée à : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "נשלחו הגדרות לורה עבור: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inviato un LoRa.Config per: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wysłano konfigurację LoRa dla: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Skickade en LoRa.Konfiguration för: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Послата LoRA конфигурација за: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a LoRa.Config for: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a LoRa.Config for: %@" - } - } - } - }, - "mesh.log.mqtt.config %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT Modulkonfiguration empfangen: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT module config received: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration du module MQTT reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות מודולת MQTT התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione del modulo MQTT ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otrzymano konfigurację modułu MQTT: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT-modulkonfiguration mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација MQTT модула примљена: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到 MQTT 模块配置:%@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT module config received: %@" - } - } - } - }, - "mesh.log.myinfo %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "MyInfo empfangen: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "MyInfo received: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "MesInfos reçues : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "MyInfo התקבל: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "MyInfo ricevuto: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otrzymano Moje Informacje: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Min info mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Моје информације примљене: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "MyInfo received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "MyInfo received: %@" - } - } - } - }, - "mesh.log.network.config %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Netzwerkkonfiguration empfangen: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Network config received: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration du réseau reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות רשת התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione di rete ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odebrano konfigurację sieci: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nätverkskonfiguration mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација мреже примљена: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Network config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Network config received: %@" - } - } - } - }, - "mesh.log.nodeinfo.received %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Knoteninformation empfangen für: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Node info received for: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Information du noeud reçue pour : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מידע אודות מכשיר התקבל: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ricevute informazioni sul nodo per: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odebrano informacje o węźle dla: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nodinformation mottagen för: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Информације о чвору примљене за: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Node info received for: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Node info received for: %@" - } - } - } - }, - "mesh.log.paxcounter %@" : { + "PAX Counter message received from: %@" : { "localizations" : { "de" : { "stringUnit" : { @@ -18074,12 +17349,6 @@ "value" : "PAX Counter message received for: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter message received from: %@" - } - }, "he" : { "stringUnit" : { "state" : "translated", @@ -18124,71 +17393,7 @@ } } }, - "mesh.log.position.config %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Positionskonfiguration empfangen: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Positon config received: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration de la position reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות מיקום התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione della posizione ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odebrano konfigurację pozycji: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Positionskonfiguration mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација позиције примљена: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Positon config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Positon config received: %@" - } - } - } - }, - "mesh.log.position.received %@" : { + "Position Packet received from node: %@" : { "localizations" : { "de" : { "stringUnit" : { @@ -18196,12 +17401,6 @@ "value" : "Position empfangen von Knoten: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Position Packet received from node: %@" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -18252,866 +17451,6 @@ } } }, - "mesh.log.power.config %@" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Power config received: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione dell'alimentazione ricevuta: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Strömkonfiguration mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација напајања примљена: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Power config received: %@" - } - } - } - }, - "mesh.log.rangetest.config %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Range Test Modul konfiguration empfangen: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Range Test module config received: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration du module test deportée reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות מודולת בדיקת טווח התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione del modulo Range Test ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odebrano konfigurację modułu testu zasięgu: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguration för räckviddstestmodulen mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација модула теста домета примљена: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "收到范围测试模块配置: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Range Test module config received: %@" - } - } - } - }, - "mesh.log.ringtone.config %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Klingeltonkonfiguration empfangen: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Ringtone config received: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration de la sonnerie RTTTL reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות RTTTL רינגטון התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Configurazione suoneria ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odebrano konfigurację dzwonka RTTTL: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguration för RTTTL-ringsignal mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација RTTTL мелодије примљена: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Ringtone config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "RTTTL Ringtone config received: %@" - } - } - } - }, - "mesh.log.routing.message %@ %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Routing empfangen für RequestID: %@ Ack Status: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Routing received for RequestID: %@ Ack Status: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Routage reçu pour la demande numéro : %@ Status de l'accusé de réception : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "התקבל מסלול עבור בקשה: %@ מצב שליחה: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Routing ricevuto per RequestID: %@ Ack Status: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odebrano trasowanie dla RequestID: %@ Ack Status: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Routing mottagen för RequestID: %@ Ack Status: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Рутирање примљено за ИД захтева: %@ Статус потврде: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Routing received for RequestID: %@ Ack Status: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Routing received for RequestID: %@ Ack Status: %@" - } - } - } - }, - "mesh.log.serial.config %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Serial Modul Konfiguration empfangen: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Serial module config received: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration du module série reçue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות מודולת תקשורת סיריאלית התקבלו: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione modulo seriale ricevuta: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odebrano konfigurację modułu szeregowego: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seriekonfigurationsmodul mottagen: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација серијског модула примљена: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Serial module config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Serial module config received: %@" - } - } - } - }, - "mesh.log.sharelocation %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Position von Apple Gerät an Knoten gesendet: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a Position Packet from the Apple device GPS to node: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Paquet envoyé avec la position GPS de l'appareil Apple vers le noeud : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "נשלח מיקום ממכשיר האפל למכשיר המשטסטיק: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inviato un pacchetto di posizione dal GPS del dispositivo Apple al nodo: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wysłano pakiet pozycji z GPS urządzenia Apple do węzła: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Skickade ett positionspaket från Apple-enhetens GPS till nod: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Позициони пакет послат са Епл уређаја на чвор: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a Position Packet from the Apple device GPS to node: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a Position Packet from the Apple device GPS to node: %@" - } - } - } - }, - "mesh.log.telemetry.received %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetrie empfangen für: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetry received for: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Télémetrie reçue pour : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "התקבל טלמטריה עבור: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetria ricevuta per: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetria odebrana dla: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetri mottagen för: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Телеметрија примљена за: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetry received for: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telemetry received for: %@" - } - } - } - }, - "mesh.log.textmessage.received" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nachricht von der Textnachricht-App empfangen." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message received from the text message app." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message reçu depuis l'application de messagerie texte." - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הודעת טקסט התקבלה." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messaggio ricevuto dall'app messaggi di testo." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wiadomość odebrana z aplikacji do wysyłania wiadomości tekstowych." - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Meddelande mottaget från textmeddelandeappen." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Порука примљена из апликације за текстуалне поруке." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message received from the text message app." - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message received from the text message app." - } - } - } - }, - "mesh.log.textmessage.send.failed %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nachricht senden fehlgeschlagen. Nicht korrekt verbunden zu %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message Send Failed, not properly connected to %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erreur d'envoi du message, mauvaise connexion à %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שליחת הודעה נכשלה, אין חיבוריות ל-%@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Invio messaggio fallito, connessione non corretta a %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nieudane wysłanie wiadomości, brak prawidłowego połączenia z %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Misslyckades med att skicka meddelande, inte korrekt ansluten till %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Слање поруке није успело, није правилно повезано са: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message Send Failed, not properly connected to %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message Send Failed, not properly connected to %@" - } - } - } - }, - "mesh.log.textmessage.sent %@ %@ %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sende Nachricht %@ von %@ an %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent message %@ from %@ to %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Envoi du message %@ de %@ à %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "נשלחה הודעה %@ מ-%@ ל-%@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inviato messaggio %@ da %@ a %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wysłano wiadomość %@ od %@ do %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Skickade meddelande %@ från %@ till %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Порука послата %@ са %@ на %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent message %@ from %@ to %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent message %@ from %@ to %@" - } - } - } - }, - "mesh.log.traceroute.received.route %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Traceroute Ergebnis: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trace Route request returned: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La demande de Trace Route est revenue : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "בקשת בדיקת מסלול הצליחה: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Traccia Richiesta di rotta restituita: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Żądanie śledzenia trasy zwrócone: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Spårruttförfrågan returnerade: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Захтев за тражење путања враћен: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trace Route request returned: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trace Route request returned: %@" - } - } - } - }, - "mesh.log.traceroute.sent %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sende Traceroute Anforderung zu Knoten: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a Trace Route Request to node: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Envoi d'une demande de Trace Route au noeud : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "נשלחה בקשת בדיקת מסלול למכשיר: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ha inviato una richiesta di tracciamento della rotta al nodo: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wysłano żądanie śledzenia trasy do węzła: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Skickade en spårruttförfrågan till nod: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Захтев за тражење путања послат на чвор: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a Trace Route Request to node: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a Trace Route Request to node: %@" - } - } - } - }, - "mesh.log.wantconfig %@" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Issuing Want Config to %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Envoi d'un Want Config à %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שולח בקשת הגדרות ל-%@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Emissione di Want Config a %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wydawanie Want Config to %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Utfärdar Want Config till %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Издавање захтева за конфигурацију на: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Issuing Want Config to %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Issuing Want Config to %@" - } - } - } - }, - "mesh.log.waypoint.sent %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wegpunkt gesendet von: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a Waypoint Packet from: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Paquet Waypoint envoyé depuis : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "נשלחה נקודת ציון מ-%@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inviato un pacchetto Waypoint da: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wysłano pakiet punktu orientacyjnego z: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Skickade en vägpunktspaket från: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пакет са тачкама пута послат од: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a Waypoint Packet from: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sent a Waypoint Packet from: %@" - } - } - } - }, "Meshtastic Node %@ has shared channels with you" : { "localizations" : { "de" : { @@ -19221,29 +17560,7 @@ } } }, - "Message Status Options" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Opzioni di stato del messaggio" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Опције статуса поруке" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "訊息狀態選項" - } - } - } - }, - "message.details" : { + "Message Details" : { "localizations" : { "de" : { "stringUnit" : { @@ -19251,12 +17568,6 @@ "value" : "Nachrichtendetails" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message Details" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -19307,6 +17618,144 @@ } } }, + "Message received from the text message app." : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nachricht von der Textnachricht-App empfangen." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Message reçu depuis l'application de messagerie texte." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הודעת טקסט התקבלה." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio ricevuto dall'app messaggi di testo." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wiadomość odebrana z aplikacji do wysyłania wiadomości tekstowych." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meddelande mottaget från textmeddelandeappen." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Порука примљена из апликације за текстуалне поруке." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Message received from the text message app." + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Message received from the text message app." + } + } + } + }, + "Message Send Failed, not properly connected to %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nachricht senden fehlgeschlagen. Nicht korrekt verbunden zu %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erreur d'envoi du message, mauvaise connexion à %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שליחת הודעה נכשלה, אין חיבוריות ל-%@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invio messaggio fallito, connessione non corretta a %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nieudane wysłanie wiadomości, brak prawidłowego połączenia z %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Misslyckades med att skicka meddelande, inte korrekt ansluten till %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Слање поруке није успело, није правилно повезано са: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Message Send Failed, not properly connected to %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Message Send Failed, not properly connected to %@" + } + } + } + }, + "Message Status Options" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opzioni di stato del messaggio" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Опције статуса поруке" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "訊息狀態選項" + } + } + } + }, "Messages" : { "localizations" : { "de" : { @@ -19881,7 +18330,7 @@ } } }, - "mqtt.clientproxy" : { + "MQTT Client Proxy" : { "localizations" : { "de" : { "stringUnit" : { @@ -19889,12 +18338,6 @@ "value" : "MQTT Client Proxy" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT Client Proxy" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -19945,7 +18388,7 @@ } } }, - "mqtt.config" : { + "MQTT Config" : { "localizations" : { "de" : { "stringUnit" : { @@ -19953,12 +18396,6 @@ "value" : "MQTT Konfiguration" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT Config" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -20009,6 +18446,64 @@ } } }, + "MQTT module config received: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "MQTT Modulkonfiguration empfangen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration du module MQTT reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות מודולת MQTT התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo MQTT ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otrzymano konfigurację modułu MQTT: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "MQTT-modulkonfiguration mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација MQTT модула примљена: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "收到 MQTT 模块配置:%@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "MQTT module config received: %@" + } + } + } + }, "Multiplier" : { "localizations" : { "de" : { @@ -20077,6 +18572,64 @@ } } }, + "MyInfo received: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "MyInfo empfangen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "MesInfos reçues : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "MyInfo התקבל: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "MyInfo ricevuto: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otrzymano Moje Informacje: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Min info mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Моје информације примљене: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "MyInfo received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "MyInfo received: %@" + } + } + } + }, "Nag timeout" : { "localizations" : { "it" : { @@ -20269,6 +18822,122 @@ } } }, + "Network Config" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Netzwerkeinstellungen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration du réseau" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות רשת" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della rete" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguracja sieci" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nätverkskonfiguration" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација мреже" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "网络配置" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "網路設定" + } + } + } + }, + "Network config received: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Netzwerkkonfiguration empfangen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration du réseau reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות רשת התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione di rete ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odebrano konfigurację sieci: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nätverkskonfiguration mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација мреже примљена: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Network config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Network config received: %@" + } + } + } + }, "Network Status Orange" : { "localizations" : { "it" : { @@ -20325,70 +18994,6 @@ } } }, - "network.config" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Netzwerkeinstellungen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Network Config" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration du réseau" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות רשת" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione della rete" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguracja sieci" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nätverkskonfiguration" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Конфигурација мреже" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "网络配置" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "網路設定" - } - } - } - }, "Never" : { "localizations" : { "de" : { @@ -20689,6 +19294,64 @@ } } }, + "No device connected" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kein Gerät verbunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aucun appareil connecté" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אין מכשיר מחובר" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun dispositivo collegato" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Brak podłączonych urządzeń" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingen enhet ansluten" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Нема повезаних уређаја" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设备未连接" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "未連接到節點" + } + } + } + }, "No Device Metrics" : { "localizations" : { "it" : { @@ -20797,6 +19460,34 @@ } } }, + "No PAX Counter Logs" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessun registro del contatore PAX" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inga loggar för PAX-räknare" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Нема логова PAX бројача" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "沒有 PAX 計數器日誌" + } + } + } + }, "No PIN (Just Works)" : { "localizations" : { "de" : { @@ -21161,6 +19852,64 @@ } } }, + "Node info received for: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Knoteninformation empfangen für: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Information du noeud reçue pour : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מידע אודות מכשיר התקבל: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ricevute informazioni sul nodo per: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odebrano informacje o węźle dla: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nodinformation mottagen för: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Информације о чвору примљене за: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Node info received for: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Node info received for: %@" + } + } + } + }, "Node Map" : { "localizations" : { "de" : { @@ -21217,7 +19966,7 @@ } } }, - "nodes" : { + "Nodes" : { "localizations" : { "de" : { "stringUnit" : { @@ -21225,12 +19974,6 @@ "value" : "Knoten" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nodes" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -21275,7 +20018,7 @@ } } }, - "nodes %@" : { + "Nodes (%@)" : { "localizations" : { "de" : { "stringUnit" : { @@ -21283,12 +20026,6 @@ "value" : "Knoten (%@)" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nodes (%@)" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -21523,70 +20260,6 @@ } } }, - "not.connected" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kein Gerät verbunden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No device connected" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucun appareil connecté" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אין מכשיר מחובר" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessun dispositivo collegato" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Brak podłączonych urządzeń" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ingen enhet ansluten" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Нема повезаних уређаја" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "设备未连接" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "未連接到節點" - } - } - } - }, "Notes" : { "localizations" : { "de" : { @@ -23075,48 +21748,8 @@ } } }, - "paxcounter.content.unavailable" : { + "PAX Counter Log" : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No PAX Counter Logs" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessun registro del contatore PAX" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inga loggar för PAX-räknare" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Нема логова PAX бројача" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "沒有 PAX 計數器日誌" - } - } - } - }, - "paxcounter.log" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter Log" - } - }, "it" : { "stringUnit" : { "state" : "translated", @@ -23142,6 +21775,9 @@ } } } + }, + "paxcounter.log" : { + }, "Perform a factory reset on the node you are connected to" : { "localizations" : { @@ -23237,7 +21873,7 @@ } } }, - "phone.gps" : { + "Phone GPS" : { "localizations" : { "de" : { "stringUnit" : { @@ -23245,12 +21881,6 @@ "value" : "Telefon GPS" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Phone GPS" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -23581,6 +22211,64 @@ } } }, + "Position Config" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Positionseinstellungen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration de la position" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות מיקום" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della posizione" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguracja pozycji" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Positionskonfiguration" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подешавања позиције" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "定位配置" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "定位設定" + } + } + } + }, "Position Exchange Failed" : { "localizations" : { "it" : { @@ -23741,70 +22429,6 @@ } } }, - "position.config" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Positionseinstellungen" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Position Config" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration de la position" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הגדרות מיקום" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurazione della posizione" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfiguracja pozycji" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Positionskonfiguration" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подешавања позиције" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "定位配置" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "定位設定" - } - } - } - }, "Positions Enabled" : { "localizations" : { "it" : { @@ -23861,6 +22485,64 @@ } } }, + "Positon config received: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Positionskonfiguration empfangen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Configuration de la position reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "הגדרות מיקום התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Configurazione della posizione ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Odebrano konfigurację pozycji: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Positionskonfiguration mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Конфигурација позиције примљена: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Positon config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Positon config received: %@" + } + } + } + }, "Power" : { "localizations" : { "de" : { @@ -23913,6 +22595,86 @@ } } }, + "Power Config" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stromkonfiguration" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Power Config" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione dell'alimentazione" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Power Config" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Strömkonfiguration" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подешавања напајња" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "电源配置" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "電源設定" + } + } + } + }, + "Power config received: %@" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione dell'alimentazione ricevuta: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Strömkonfiguration mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација напајања примљена: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Power config received: %@" + } + } + } + }, "Power Metrics" : { "localizations" : { "it" : { @@ -24075,34 +22837,6 @@ } } }, - "power.metrics.log" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Power Metrics Log" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Registro delle metriche di potenza" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Логови метрике снаге" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "電源指標紀錄" - } - } - } - }, "Powered" : { "localizations" : { "de" : { @@ -24703,29 +23437,7 @@ } } }, - "Radio Disconnected" : { - "localizations" : { - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Radio scollegata" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Радио веза је прекинута" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "已斷線" - } - } - } - }, - "radio.configuration" : { + "Radio Configuration" : { "localizations" : { "de" : { "stringUnit" : { @@ -24733,12 +23445,6 @@ "value" : "Geräteeinstellungen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Radio Configuration" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -24789,6 +23495,28 @@ } } }, + "Radio Disconnected" : { + "localizations" : { + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radio scollegata" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Радио веза је прекинута" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "已斷線" + } + } + } + }, "RAK Rotary Encoder" : { "localizations" : { "de" : { @@ -24905,7 +23633,7 @@ } } }, - "range.test.config" : { + "Range Test Config" : { "localizations" : { "de" : { "stringUnit" : { @@ -24913,12 +23641,6 @@ "value" : "Entfernungstest Konfiguration" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Range Test Config" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -24969,6 +23691,64 @@ } } }, + "Range Test module config received: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Range Test Modul konfiguration empfangen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration du module test deportée reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות מודולת בדיקת טווח התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione del modulo Range Test ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odebrano konfigurację modułu testu zasięgu: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguration för räckviddstestmodulen mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација модула теста домета примљена: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "收到范围测试模块配置: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Range Test module config received: %@" + } + } + } + }, "Reboot" : { "localizations" : { "de" : { @@ -25149,67 +23929,61 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Negative Empfangsbestätigung empfangen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Received a negative acknowledgment" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Accusé de réception négatif reçu" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "התקבל אישור מסירה שלילי" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Ricevuto un riscontro negativo" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Otrzymano negatywne potwierdzenie" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Mottog ett negativt kvitto" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Примљено негативно признање" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "收到否认" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "收到 NACK(否定確認)" } } } }, - "received.ack" : { + "Received Ack" : { "localizations" : { "de" : { "stringUnit" : { @@ -25217,12 +23991,6 @@ "value" : "Empfangsbestätigung" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Received Ack" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -25273,7 +24041,7 @@ } } }, - "received.ack.real" : { + "Recipient Ack" : { "localizations" : { "de" : { "stringUnit" : { @@ -25281,12 +24049,6 @@ "value" : "Recipient Ack" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Recipient Ack" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -25425,61 +24187,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Regionale Einschaltdauergrenze erreicht" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Regional Duty Cycle Limit Reached" - } - }, "fr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Limite du cycle de service régional atteinte" } }, "he" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "הגיע למקסימום שימוש אזורי לשעה זו" } }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Raggiunto il limite del ciclo di lavoro regionale" } }, "pl" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Osiągnięto regionalny limit cyklu pracy" } }, "se" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Regionala sändningsgränsen nådd" } }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Достигнут регионални лимит радног циклуса" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "已达到当前区域循环周期发射上限" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "已達到頻道占用循環週期發射上限" } } @@ -25818,6 +24574,58 @@ } } }, + "Requested Canned Messages Module Messages for node: %@" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messages du module messages préformatés demandés pour le noeud : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "התבקשו הודעות מודולת הודעות שמורות עבור מכשיר: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggi in scatola richiesti Messaggi del modulo per il nodo: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zażądano Wiadomości z Modułu Wiadomości Gotowych dla węzła: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Begärda meddelanden för modulen med fördefinierade meddelanden för nod: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Захтеване поруке модула за унапред припремљене поруке за чвор: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Requested Canned Messages Module Messages for node: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Requested Canned Messages Module Messages for node: %@" + } + } + } + }, "Requires that there be an accelerometer on your device." : { "localizations" : { "it" : { @@ -26107,9 +24915,6 @@ } } } - }, - "ringtone" : { - }, "Ringtone" : { "localizations" : { @@ -26169,6 +24974,150 @@ } } }, + "Ringtone Config" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klingelton Konfiguration" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ringtone Config" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione della suoneria" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ringtone Config" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ringsignalskonfiguration" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација звона" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "铃声配置" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "鈴聲" + } + } + } + }, + "Ringtone Transfer Language" : { + "localizations" : { + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ringtone Transfer Language" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Lingua di trasferimento della suoneria" + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Ringtone Transfer Language" + } + }, + "se" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Språk för Överföring av Ringsignal" + } + }, + "sr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Језик преноса мелодије звона" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "铃声传输语言" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "鈴聲傳輸語言(RTTTL)" + } + } + } + }, + "Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications." : { + "localizations" : { + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ringtone Transfer Language(RTTTL) Stringa di suoneria utilizzata dai cicalini supportati nelle notifiche esterne." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications." + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ringsignalöverföringsspråk (RTTTL) Ringsignalsträng som används av stödda buzzers i externa notifikationer." + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Језик преноса мелдоије звона (RTTTL) Стринг мелодије звона који користе подржани звучни сигнали у спољним обавештењима." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "支持外部通知中使用的铃声传输语言 (RTTTL) 铃声字符串。" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "RTTTL 鈴聲字串(Ringtone Transfer Language)被用於外部通知中支援的蜂鳴器。" + } + } + } + }, "Role" : { "localizations" : { "de" : { @@ -26503,6 +25452,64 @@ } } }, + "Routing received for RequestID: %@ Ack Status: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Routing empfangen für RequestID: %@ Ack Status: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Routage reçu pour la demande numéro : %@ Status de l'accusé de réception : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "התקבל מסלול עבור בקשה: %@ מצב שליחה: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Routing ricevuto per RequestID: %@ Ack Status: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odebrano trasowanie dla RequestID: %@ Ack Status: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Routing mottagen för RequestID: %@ Ack Status: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Рутирање примљено за ИД захтева: %@ Статус потврде: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Routing received for RequestID: %@ Ack Status: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Routing received for RequestID: %@ Ack Status: %@" + } + } + } + }, "RSSI %@ dBm" : { "localizations" : { "it" : { @@ -26569,6 +25576,64 @@ } } }, + "RTTTL Ringtone config received: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "RTTTL Klingeltonkonfiguration empfangen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration de la sonnerie RTTTL reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות RTTTL רינגטון התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "RTTTL Configurazione suoneria ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odebrano konfigurację dzwonka RTTTL: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguration för RTTTL-ringsignal mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација RTTTL мелодије примљена: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "RTTTL Ringtone config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "RTTTL Ringtone config received: %@" + } + } + } + }, "Russia" : { "localizations" : { "sr" : { @@ -26879,41 +25944,7 @@ } } }, - "Save User Config to %@?" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Benutzerkonfiguration nach %@ speichern?" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Salvare la configurazione utente in %@?" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Сачувати корисничу конфигурацију за %@?" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "保存用户配置到 %@?" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "將使用者設定儲存到 %@?" - } - } - } - }, - "save.config %@" : { + "Save Config for %@" : { "localizations" : { "de" : { "stringUnit" : { @@ -26921,12 +25952,6 @@ "value" : "Speichere Konfiguration für %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Save Config for %@" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -26977,6 +26002,40 @@ } } }, + "Save User Config to %@?" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Benutzerkonfiguration nach %@ speichern?" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Salvare la configurazione utente in %@?" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Сачувати корисничу конфигурацију за %@?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "保存用户配置到 %@?" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "將使用者設定儲存到 %@?" + } + } + } + }, "Saves a CSV with the range test message details, currently only available on ESP32 devices with a web server." : { "localizations" : { "it" : { @@ -27448,7 +26507,7 @@ } } }, - "select.node" : { + "Select Node" : { "localizations" : { "de" : { "stringUnit" : { @@ -27456,12 +26515,6 @@ "value" : "Knoten auswählen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select a Node" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -27846,6 +26899,64 @@ } } }, + "Send Heartbeat" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Herzschlag senden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Envoyer une impulsion" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שלח דופק" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviare il battito cardiaco" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Send Heartbeat" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skicka hjärtslag" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пошаљи откуцај срца" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "发送心跳包" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "發送心跳訊號(Heartbeat)" + } + } + } + }, "Send Reboot OTA" : { "localizations" : { "it" : { @@ -27980,6 +27091,349 @@ } } }, + "Sent a Channel for: %@ Channel Index %d" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Canal envoyé pour : %@ Canal index %d" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "נשלח ערוץ עבור: %@ אינדקס ערוצים %d" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato un canale per: %@ Canale Indice %d" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wysłano kanał dla: %@ Indeks kanału %d" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skickade en kanal för: %@ Kanalindex %d" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Послат је канал за: %@ Индекс канала %d" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sent a Channel for: %@ Channel Index %d" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sent a Channel for: %@ Channel Index %d" + } + } + } + }, + "Sent a LoRa.Config for: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "LoRa.Config gesendet für: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration LoRa envoyée à : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "נשלחו הגדרות לורה עבור: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato un LoRa.Config per: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wysłano konfigurację LoRa dla: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skickade en LoRa.Konfiguration för: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Послата LoRA конфигурација за: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sent a LoRa.Config for: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sent a LoRa.Config for: %@" + } + } + } + }, + "Sent a Position Packet from the Apple device GPS to node: %@@" : { + "extractionState" : "manual", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Position von Apple Gerät an Knoten gesendet: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paquet envoyé avec la position GPS de l'appareil Apple vers le noeud : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "נשלח מיקום ממכשיר האפל למכשיר המשטסטיק: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato un pacchetto di posizione dal GPS del dispositivo Apple al nodo: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wysłano pakiet pozycji z GPS urządzenia Apple do węzła: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skickade ett positionspaket från Apple-enhetens GPS till nod: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Позициони пакет послат са Епл уређаја на чвор: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sent a Position Packet from the Apple device GPS to node: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sent a Position Packet from the Apple device GPS to node: %@" + } + } + } + }, + "Sent a Trace Route Request to node: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sende Traceroute Anforderung zu Knoten: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Envoi d'une demande de Trace Route au noeud : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "נשלחה בקשת בדיקת מסלול למכשיר: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ha inviato una richiesta di tracciamento della rotta al nodo: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wysłano żądanie śledzenia trasy do węzła: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skickade en spårruttförfrågan till nod: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Захтев за тражење путања послат на чвор: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sent a Trace Route Request to node: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sent a Trace Route Request to node: %@" + } + } + } + }, + "Sent a Waypoint Packet from: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wegpunkt gesendet von: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paquet Waypoint envoyé depuis : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "נשלחה נקודת ציון מ-%@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato un pacchetto Waypoint da: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wysłano pakiet punktu orientacyjnego z: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skickade en vägpunktspaket från: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пакет са тачкама пута послат од: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sent a Waypoint Packet from: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sent a Waypoint Packet from: %@" + } + } + } + }, + "Sent message %@ from %@ to %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sende Nachricht %@ von %@ an %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Envoi du message %@ de %@ à %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "נשלחה הודעה %@ מ-%@ ל-%@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inviato messaggio %@ da %@ a %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wysłano wiadomość %@ od %@ do %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skickade meddelande %@ från %@ till %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Порука послата %@ са %@ на %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sent message %@ from %@ to %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sent message %@ from %@ to %@" + } + } + } + }, "Sent out to other nodes on the mesh to allow them to compute a shared secret key." : { "localizations" : { "de" : { @@ -28230,6 +27684,64 @@ } } }, + "Serial module config received: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serial Modul Konfiguration empfangen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration du module série reçue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרות מודולת תקשורת סיריאלית התקבלו: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione modulo seriale ricevuta: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odebrano konfigurację modułu szeregowego: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seriekonfigurationsmodul mottagen: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурација серијског модула примљена: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serial module config received: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serial module config received: %@" + } + } + } + }, "Series" : { "localizations" : { "it" : { @@ -28564,35 +28076,7 @@ } } }, - "Share QR Code & Link" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "QR Code & Link teilen" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Condividi il codice QR e il link" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Дели QR код и линк" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "分享 QR Code 及連結" - } - } - } - }, - "share.channels" : { + "Share QR Code" : { "localizations" : { "de" : { "stringUnit" : { @@ -28600,12 +28084,6 @@ "value" : "Kanal QR Code teilen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Share QR Code" - } - }, "fr" : { "stringUnit" : { "state" : "translated", @@ -28656,6 +28134,34 @@ } } }, + "Share QR Code & Link" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "QR Code & Link teilen" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Condividi il codice QR e il link" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дели QR код и линк" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "分享 QR Code 及連結" + } + } + } + }, "Shared Key" : { "localizations" : { "de" : { @@ -29144,6 +28650,58 @@ } } }, + "Shutdown on Power Loss" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Herunterfahren bei Stromunterbruch" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Shutdown on Power Loss" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spegnimento in caso di perdita di alimentazione" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Shutdown on Power Loss" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stäng av vid Strömförlust" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Искључи уређај при губитку напајања" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "断电时关机" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "斷電自動關機" + } + } + } + }, "Signal %@" : { "localizations" : { "it" : { @@ -29954,90 +29512,20 @@ }, "Store and forward servers require an ESP32 device with PSRAM or Linux Native." : { "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Store and forward servers require an ESP32 device with PSRAM or Linux Native." - } - }, "it" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "I server Store and Forward richiedono un dispositivo ESP32 con PSRAM o Linux Native." } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "儲存與轉送伺服器需要使用具有 PSRAM 的 ESP32 裝置或是原生 Linux 系統。" } } } }, - "storeforward.heartbeat" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Herzschlag senden" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Send Heartbeat" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Envoyer une impulsion" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "שלח דופק" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inviare il battito cardiaco" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Send Heartbeat" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Skicka hjärtslag" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пошаљи откуцај срца" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "发送心跳包" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "發送心跳訊號(Heartbeat)" - } - } - } - }, "Subscribed" : { "localizations" : { "he" : { @@ -30498,6 +29986,64 @@ } } }, + "Telemetry received for: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telemetrie empfangen für: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Télémetrie reçue pour : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "התקבל טלמטריה עבור: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telemetria ricevuta per: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telemetria odebrana dla: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telemetri mottagen för: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Телеметрија примљена за: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telemetry received for: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Telemetry received for: %@" + } + } + } + }, "Temp" : { "localizations" : { "de" : { @@ -32436,6 +31982,64 @@ } } }, + "Trace Route request returned: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Traceroute Ergebnis: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "La demande de Trace Route est revenue : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בקשת בדיקת מסלול הצליחה: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Traccia Richiesta di rotta restituita: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Żądanie śledzenia trasy zwrócone: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spårruttförfrågan returnerade: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Захтев за тражење путања враћен: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trace Route request returned: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trace Route request returned: %@" + } + } + } + }, "Trace Route Sent" : { "localizations" : { "it" : { @@ -34310,6 +33914,16 @@ } } }, + "Version: %@ (%@)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Version: %1$@ (%2$@)" + } + } + } + }, "Version: %1$@ (%2$@)" : { "localizations" : { "de" : { diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 6c34d65c..ba65f66a 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -484,7 +484,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate Logger.data.error("Error Updating Core Data BluetoothConfigEntity: \(nsError, privacy: .public)") } - let logString = String.localizedStringWithFormat("mesh.log.traceroute.sent %@".localized, destNum.toHex()) + let logString = String.localizedStringWithFormat("Sent a Trace Route Request to node: %@".localized, destNum.toHex()) Logger.mesh.info("🪧 \(logString, privacy: .public)") } catch { @@ -504,7 +504,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } else { let nodeName = connectedPeripheral?.peripheral.name ?? "Unknown".localized - let logString = String.localizedStringWithFormat("mesh.log.wantconfig %@".localized, nodeName) + let logString = String.localizedStringWithFormat("Issuing Want Config to %@".localized, nodeName) Logger.mesh.info("🛎️ \(logString, privacy: .public)") // BLE Characteristics discovered, issue wantConfig var toRadio: ToRadio = ToRadio() @@ -954,7 +954,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate let nsError = error as NSError Logger.data.error("Error Updating Core Data TraceRouteHop: \(nsError, privacy: .public)") } - let logString = String.localizedStringWithFormat("mesh.log.traceroute.received.route %@".localized, routeString) + let logString = String.localizedStringWithFormat("Trace Route request returned: %@".localized, routeString) Logger.mesh.info("🪧 \(logString, privacy: .public)") } case .neighborinfoApp: @@ -1058,7 +1058,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate connectTo(peripheral: preferredPeripheral!.peripheral) } let nodeName = connectedPeripheral?.peripheral.name ?? "Unknown".localized - let logString = String.localizedStringWithFormat("mesh.log.textmessage.send.failed %@".localized, nodeName) + let logString = String.localizedStringWithFormat("Message Send Failed, not properly connected to %@".localized, nodeName) Logger.mesh.info("🚫 \(logString, privacy: .public)") success = false @@ -1144,7 +1144,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } if connectedPeripheral?.peripheral.state ?? CBPeripheralState.disconnected == CBPeripheralState.connected { connectedPeripheral.peripheral.writeValue(binaryData, for: TORADIO_characteristic, type: .withResponse) - let logString = String.localizedStringWithFormat("mesh.log.textmessage.sent %@ %@ %@".localized, String(newMessage.messageId), fromUserNum.toHex(), toUserNum.toHex()) + let logString = String.localizedStringWithFormat("Sent message %@ from %@ to %@".localized, String(newMessage.messageId), fromUserNum.toHex(), toUserNum.toHex()) Logger.mesh.info("💬 \(logString, privacy: .public)") do { @@ -1192,7 +1192,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate guard let binaryData: Data = try? toRadio.serializedData() else { return false } - let logString = String.localizedStringWithFormat("mesh.log.waypoint.sent %@".localized, String(fromNodeNum)) + let logString = String.localizedStringWithFormat("Sent a Waypoint Packet from: %@".localized, String(fromNodeNum)) Logger.mesh.info("📍 \(logString, privacy: .public)") if connectedPeripheral?.peripheral.state ?? CBPeripheralState.disconnected == CBPeripheralState.connected { connectedPeripheral.peripheral.writeValue(binaryData, for: TORADIO_characteristic, type: .withResponse) @@ -1356,7 +1356,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } if connectedPeripheral?.peripheral.state ?? CBPeripheralState.disconnected == CBPeripheralState.connected { connectedPeripheral.peripheral.writeValue(binaryData, for: TORADIO_characteristic, type: .withResponse) - let logString = String.localizedStringWithFormat("mesh.log.sharelocation %@".localized, String(fromNodeNum)) + let logString = String.localizedStringWithFormat("Sent a Position Packet from the Apple device GPS to node: %@".localized, String(fromNodeNum)) Logger.services.debug("📍 \(logString, privacy: .public)") return true } else { @@ -1711,7 +1711,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } if connectedPeripheral?.peripheral.state ?? CBPeripheralState.disconnected == CBPeripheralState.connected { self.connectedPeripheral.peripheral.writeValue(binaryData, for: self.TORADIO_characteristic, type: .withResponse) - let logString = String.localizedStringWithFormat("mesh.log.channel.sent %@ %d".localized, String(connectedPeripheral.num), chan.index) + let logString = String.localizedStringWithFormat("Sent a Channel for: %@ Channel Index %d".localized, String(connectedPeripheral.num), chan.index) Logger.mesh.info("🎛️ \(logString, privacy: .public)") } } @@ -1740,7 +1740,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } if connectedPeripheral?.peripheral.state ?? CBPeripheralState.disconnected == CBPeripheralState.connected { self.connectedPeripheral.peripheral.writeValue(binaryData, for: self.TORADIO_characteristic, type: .withResponse) - let logString = String.localizedStringWithFormat("mesh.log.lora.config.sent %@".localized, String(connectedPeripheral.num)) + let logString = String.localizedStringWithFormat("Sent a LoRa.Config for: %@".localized, String(connectedPeripheral.num)) Logger.mesh.info("📻 \(logString, privacy: .public)") } @@ -2660,7 +2660,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate if connectedPeripheral?.peripheral.state ?? CBPeripheralState.disconnected == CBPeripheralState.connected { connectedPeripheral.peripheral.writeValue(binaryData, for: TORADIO_characteristic, type: .withResponse) - let logString = String.localizedStringWithFormat("mesh.log.cannedmessages.messages.get %@".localized, String(connectedPeripheral.num)) + let logString = String.localizedStringWithFormat("Requested Canned Messages Module Messages for node: %@".localized, String(connectedPeripheral.num)) Logger.mesh.info("🥫 \(logString, privacy: .public)") return true } diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index c208c525..f5a7bda9 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -103,7 +103,7 @@ func moduleConfig (config: ModuleConfig, context: NSManagedObjectContext, nodeNu func myInfoPacket (myInfo: MyNodeInfo, peripheralId: String, context: NSManagedObjectContext) -> MyInfoEntity? { - let logString = String.localizedStringWithFormat("mesh.log.myinfo %@".localized, String(myInfo.myNodeNum)) + let logString = String.localizedStringWithFormat("MyInfo received: %@".localized, String(myInfo.myNodeNum)) Logger.mesh.info("ℹ️ \(logString, privacy: .public)") let fetchMyInfoRequest = MyInfoEntity.fetchRequest() @@ -261,7 +261,7 @@ func deviceMetadataPacket (metadata: DeviceMetadata, fromNum: Int64, sessionPass func nodeInfoPacket (nodeInfo: NodeInfo, channel: UInt32, context: NSManagedObjectContext) -> NodeInfoEntity? { - let logString = String.localizedStringWithFormat("mesh.log.nodeinfo.received %@".localized, String(nodeInfo.num)) + let logString = String.localizedStringWithFormat("Node info received for: %@".localized, String(nodeInfo.num)) Logger.mesh.info("📟 \(logString, privacy: .public)") guard nodeInfo.num > 0 else { return nil } @@ -582,7 +582,7 @@ func adminResponseAck (packet: MeshPacket, context: NSManagedObjectContext) { } func paxCounterPacket (packet: MeshPacket, context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.paxcounter %@".localized, String(packet.from)) + let logString = String.localizedStringWithFormat("PAX Counter message received from: %@".localized, String(packet.from)) Logger.mesh.info("🧑‍🤝‍🧑 \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() @@ -626,7 +626,7 @@ func routingPacket (packet: MeshPacket, connectedNodeNum: Int64, context: NSMana let routingError = RoutingError(rawValue: routingMessage.errorReason.rawValue) let routingErrorString = routingError?.display ?? "Unknown".localized - let logString = String.localizedStringWithFormat("mesh.log.routing.message %@ %@".localized, String(packet.decoded.requestID), routingErrorString) + let logString = String.localizedStringWithFormat("Routing received for RequestID: %@ Ack Status: %@".localized, String(packet.decoded.requestID), routingErrorString) Logger.mesh.info("🕸️ \(logString, privacy: .public)") let fetchMessageRequest = MessageEntity.fetchRequest() @@ -686,7 +686,7 @@ func routingPacket (packet: MeshPacket, connectedNodeNum: Int64, context: NSMana func telemetryPacket(packet: MeshPacket, connectedNode: Int64, context: NSManagedObjectContext) { if let telemetryMessage = try? Telemetry(serializedBytes: packet.decoded.payload) { - let logString = String.localizedStringWithFormat("mesh.log.telemetry.received %@".localized, String(packet.from)) + let logString = String.localizedStringWithFormat("Telemetry received for: %@".localized, String(packet.from)) Logger.mesh.info("📈 \(logString, privacy: .public)") if telemetryMessage.variant != Telemetry.OneOf_Variant.deviceMetrics(telemetryMessage.deviceMetrics) && telemetryMessage.variant != Telemetry.OneOf_Variant.environmentMetrics(telemetryMessage.environmentMetrics) && telemetryMessage.variant != Telemetry.OneOf_Variant.localStats(telemetryMessage.localStats) && telemetryMessage.variant != Telemetry.OneOf_Variant.powerMetrics(telemetryMessage.powerMetrics) { /// Other unhandled telemetry packets @@ -875,7 +875,7 @@ func textMessageAppPacket( } if messageText?.count ?? 0 > 0 { - Logger.mesh.info("💬 \("mesh.log.textmessage.received".localized, privacy: .public)") + Logger.mesh.info("💬 \("Message received from the text message app.".localized, privacy: .public)") let messageUsers = UserEntity.fetchRequest() messageUsers.predicate = NSPredicate(format: "num IN %@", [packet.to, packet.from]) do { diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index 7823272b..b1892fa9 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -129,7 +129,7 @@ public func clearCoreDataDatabase(context: NSManagedObjectContext, includeRoutes func upsertNodeInfoPacket (packet: MeshPacket, context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.nodeinfo.received %@".localized, packet.from.toHex()) + let logString = String.localizedStringWithFormat("Node info received for: %@".localized, packet.from.toHex()) Logger.mesh.info("📟 \(logString, privacy: .public)") guard packet.from > 0 else { return } @@ -312,7 +312,7 @@ func upsertNodeInfoPacket (packet: MeshPacket, context: NSManagedObjectContext) func upsertPositionPacket (packet: MeshPacket, context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.position.received %@".localized, String(packet.from)) + let logString = String.localizedStringWithFormat("Position Packet received from node: %@".localized, String(packet.from)) Logger.mesh.info("📍 \(logString, privacy: .public)") let fetchNodePositionRequest = NodeInfoEntity.fetchRequest() @@ -567,7 +567,7 @@ func upsertDisplayConfigPacket(config: Config.DisplayConfig, nodeNum: Int64, ses func upsertLoRaConfigPacket(config: Config.LoRaConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.lora.config %@".localized, nodeNum.toHex()) + let logString = String.localizedStringWithFormat("LoRa config received: %@".localized, nodeNum.toHex()) Logger.data.info("📻 \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() @@ -638,7 +638,7 @@ func upsertLoRaConfigPacket(config: Config.LoRaConfig, nodeNum: Int64, sessionPa func upsertNetworkConfigPacket(config: Config.NetworkConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.network.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("Network config received: %@".localized, String(nodeNum)) Logger.data.info("🌐 \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() @@ -687,7 +687,7 @@ func upsertNetworkConfigPacket(config: Config.NetworkConfig, nodeNum: Int64, ses func upsertPositionConfigPacket(config: Config.PositionConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.position.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("Positon config received: %@".localized, String(nodeNum)) Logger.data.info("🗺️ \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() @@ -750,7 +750,7 @@ func upsertPositionConfigPacket(config: Config.PositionConfig, nodeNum: Int64, s } func upsertPowerConfigPacket(config: Config.PowerConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.power.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("Power config received: %@".localized, String(nodeNum)) Logger.data.info("🗺️ \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() @@ -1143,7 +1143,7 @@ func upsertPaxCounterModuleConfigPacket(config: ModuleConfig.PaxcounterConfig, n func upsertRtttlConfigPacket(ringtone: String, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.ringtone.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("RTTTL Ringtone config received: %@".localized, String(nodeNum)) Logger.data.info("⛰️ \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() @@ -1183,7 +1183,7 @@ func upsertRtttlConfigPacket(ringtone: String, nodeNum: Int64, sessionPasskey: D func upsertMqttModuleConfigPacket(config: ModuleConfig.MQTTConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.mqtt.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("MQTT module config received: %@".localized, String(nodeNum)) Logger.data.info("🌉 \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() @@ -1245,7 +1245,7 @@ func upsertMqttModuleConfigPacket(config: ModuleConfig.MQTTConfig, nodeNum: Int6 func upsertRangeTestModuleConfigPacket(config: ModuleConfig.RangeTestConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.rangetest.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("Range Test module config received: %@".localized, String(nodeNum)) Logger.data.info("⛰️ \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() @@ -1289,7 +1289,7 @@ func upsertRangeTestModuleConfigPacket(config: ModuleConfig.RangeTestConfig, nod func upsertSerialModuleConfigPacket(config: ModuleConfig.SerialConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("mesh.log.serial.config %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("Serial module config received: %@".localized, String(nodeNum)) Logger.data.info("🤖 \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() diff --git a/Meshtastic/Views/Bluetooth/Connect.swift b/Meshtastic/Views/Bluetooth/Connect.swift index 4b3dd213..5e9dd834 100644 --- a/Meshtastic/Views/Bluetooth/Connect.swift +++ b/Meshtastic/Views/Bluetooth/Connect.swift @@ -116,7 +116,7 @@ struct Connect: View { #endif } } label: { - Label("mesh.live.activity", systemImage: liveActivityStarted ? "stop" : "play") + Label("Mesh Live Activity", systemImage: liveActivityStarted ? "stop" : "play") } #endif Text("Num: \(String(node!.num))") @@ -189,7 +189,7 @@ struct Connect: View { .foregroundColor(.red) .frame(width: 60, height: 60) .padding(.trailing) - Text("not.connected").font(.title3) + Text("No device connected").font(.title3) } .padding() } diff --git a/Meshtastic/Views/ContentView.swift b/Meshtastic/Views/ContentView.swift index 1c8a395d..9eb1ce56 100644 --- a/Meshtastic/Views/ContentView.swift +++ b/Meshtastic/Views/ContentView.swift @@ -40,13 +40,13 @@ struct ContentView: View { router: appState.router ) .tabItem { - Label("nodes", systemImage: "flipphone") + Label("Nodes", systemImage: "flipphone") } .tag(NavigationState.Tab.nodes) MeshMap(router: appState.router) .tabItem { - Label("map", systemImage: "map") + Label("Mesh Map", systemImage: "map") } .tag(NavigationState.Tab.map) diff --git a/Meshtastic/Views/Messages/MessageContextMenuItems.swift b/Meshtastic/Views/Messages/MessageContextMenuItems.swift index dc55a8ce..ca80f80e 100644 --- a/Meshtastic/Views/Messages/MessageContextMenuItems.swift +++ b/Meshtastic/Views/Messages/MessageContextMenuItems.swift @@ -51,7 +51,7 @@ struct MessageContextMenuItems: View { Image(systemName: "doc.on.doc") } - Menu("message.details") { + Menu("Message Details") { VStack { let messageDate = Date(timeIntervalSince1970: TimeInterval(message.messageTimestamp)) Text("\(messageDate.formattedDate(format: MessageText.dateFormatString))").foregroundColor(.gray) @@ -69,8 +69,8 @@ struct MessageContextMenuItems: View { } if isCurrentUser && message.receivedACK { VStack { - Text("received.ack") + Text(": \(message.receivedACK ? "✔️" : "")") - Text("received.ack.real") + Text(": \(message.realACK ? "✔️" : "")") + Text("Received Ack") + Text(": \(message.receivedACK ? "✔️" : "")") + Text("Recipient Ack") + Text(": \(message.realACK ? "✔️" : "")") } } else if isCurrentUser && message.ackError == 0 { // Empty Error diff --git a/Meshtastic/Views/Nodes/NodeList.swift b/Meshtastic/Views/Nodes/NodeList.swift index b4713dbd..1e823020 100644 --- a/Meshtastic/Views/Nodes/NodeList.swift +++ b/Meshtastic/Views/Nodes/NodeList.swift @@ -192,7 +192,7 @@ struct NodeList: View { .searchable(text: $searchText, placement: .automatic, prompt: "Find a node") .disableAutocorrection(true) .scrollDismissesKeyboard(.immediately) - .navigationTitle(String.localizedStringWithFormat("nodes %@".localized, String(nodes.count))) + .navigationTitle(String.localizedStringWithFormat("Nodes (%@)".localized, String(nodes.count))) .listStyle(.plain) .alert( "Position Exchange Requested", @@ -272,7 +272,7 @@ struct NodeList: View { ) } } else { - ContentUnavailableView("select.node", systemImage: "flipphone") + ContentUnavailableView("Select Node", systemImage: "flipphone") } } detail: { ContentUnavailableView("", systemImage: "line.3.horizontal") diff --git a/Meshtastic/Views/Nodes/PaxCounterLog.swift b/Meshtastic/Views/Nodes/PaxCounterLog.swift index a5ca0194..5be9db56 100644 --- a/Meshtastic/Views/Nodes/PaxCounterLog.swift +++ b/Meshtastic/Views/Nodes/PaxCounterLog.swift @@ -196,10 +196,10 @@ struct PaxCounterLog: View { .padding(.trailing) } } else { - ContentUnavailableView("paxcounter.content.unavailable", systemImage: "slash.circle") + ContentUnavailableView("No PAX Counter Logs", systemImage: "slash.circle") } } - .navigationTitle("paxcounter.log") + .navigationTitle("PAX Counter Log") .navigationBarTitleDisplayMode(.inline) .navigationBarItems(trailing: ZStack { diff --git a/Meshtastic/Views/Nodes/PowerMetricsLog.swift b/Meshtastic/Views/Nodes/PowerMetricsLog.swift index c24a8bca..b0afd67c 100644 --- a/Meshtastic/Views/Nodes/PowerMetricsLog.swift +++ b/Meshtastic/Views/Nodes/PowerMetricsLog.swift @@ -282,7 +282,7 @@ struct PowerMetricsLog: View { isPresented: $isExporting, document: CsvDocument(emptyCsv: exportString), contentType: .commaSeparatedText, - defaultFilename: String("\(node.user?.longName ?? "Node") \("power.metrics.log".localized)"), + defaultFilename: String("\(node.user?.longName ?? "Node") \("Power Metrics Log".localized)"), onCompletion: { result in switch result { case .success: diff --git a/Meshtastic/Views/Settings/AppData.swift b/Meshtastic/Views/Settings/AppData.swift index e5535c2c..e5ff252c 100644 --- a/Meshtastic/Views/Settings/AppData.swift +++ b/Meshtastic/Views/Settings/AppData.swift @@ -21,7 +21,7 @@ struct AppData: View { VStack { - Section(header: Text("phone.gps")) { + Section(header: Text("Phone GPS")) { GPSStatus() } Divider() diff --git a/Meshtastic/Views/Settings/Config/LoRaConfig.swift b/Meshtastic/Views/Settings/Config/LoRaConfig.swift index 4ff56e01..196f6ffb 100644 --- a/Meshtastic/Views/Settings/Config/LoRaConfig.swift +++ b/Meshtastic/Views/Settings/Config/LoRaConfig.swift @@ -228,7 +228,7 @@ struct LoRaConfig: View { } } } - .navigationTitle("lora.config") + .navigationTitle("LoRa Config") .navigationBarItems( trailing: ZStack { ConnectedDevice( diff --git a/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift b/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift index fc1835fb..e9959b41 100644 --- a/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/ExternalNotificationConfig.swift @@ -189,7 +189,7 @@ struct ExternalNotificationConfig: View { } } } - .navigationTitle("external.notification.config") + .navigationTitle("External Notification Config") .navigationBarItems( trailing: ZStack { ConnectedDevice( diff --git a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift index 217205cd..6967a2ab 100644 --- a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift @@ -60,7 +60,7 @@ struct MQTTConfig: View { Toggle(isOn: $proxyToClientEnabled) { - Label("mqtt.clientproxy", systemImage: "iphone.radiowaves.left.and.right") + Label("MQTT Client Proxy", systemImage: "iphone.radiowaves.left.and.right") Text("Utilizes the network connection on your phone to connect to MQTT.") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) @@ -340,7 +340,7 @@ struct MQTTConfig: View { if newMapPublishIntervalSecs != node?.mqttConfig?.mapPublishIntervalSecs ?? -1 { hasChanges = true } } } - .navigationTitle("mqtt.config") + .navigationTitle("MQTT Config") .navigationBarItems( trailing: ZStack { ConnectedDevice( diff --git a/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift b/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift index 480f4b94..6d71f7a7 100644 --- a/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/PaxCounterConfig.swift @@ -41,7 +41,7 @@ struct PaxCounterConfig: View { } .pickerStyle(DefaultPickerStyle()) .listRowSeparator(.hidden) - Text("config.module.paxcounter.updateinterval.description") + Text("How often we can send a message to the mesh when people are detected.") .foregroundColor(.gray) .font(.callout) } @@ -50,7 +50,7 @@ struct PaxCounterConfig: View { } } .disabled(self.bleManager.connectedPeripheral == nil || node?.powerConfig == nil) - .navigationTitle("config.module.paxcounter.title") + .navigationTitle("PAX Counter Config") .navigationBarItems(trailing: ZStack { ConnectedDevice( bluetoothOn: bleManager.isSwitchedOn, diff --git a/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift b/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift index f1f56e1a..cc323170 100644 --- a/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/RangeTestConfig.swift @@ -71,7 +71,7 @@ struct RangeTestConfig: View { } } } - .navigationTitle("range.test.config") + .navigationTitle("Range Test Config") .navigationBarItems( trailing: ZStack { ConnectedDevice( diff --git a/Meshtastic/Views/Settings/Config/Module/RtttlConfig.swift b/Meshtastic/Views/Settings/Config/Module/RtttlConfig.swift index 669add34..71452615 100644 --- a/Meshtastic/Views/Settings/Config/Module/RtttlConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/RtttlConfig.swift @@ -22,12 +22,12 @@ struct RtttlConfig: View { var body: some View { VStack { Form { - ConfigHeader(title: "ringtone", config: \.rtttlConfig, node: node, onAppear: setRtttLConfigValue) + ConfigHeader(title: "Ringtone", config: \.rtttlConfig, node: node, onAppear: setRtttLConfigValue) Section(header: Text("Options")) { HStack { - Label("ringtone", systemImage: "music.quarternote.3") - TextField("config.ringtone.label", text: $ringtone, axis: .vertical) + Label("Ringtone", systemImage: "music.quarternote.3") + TextField("Ringtone Transfer Language", text: $ringtone, axis: .vertical) .foregroundColor(.gray) .autocapitalization(.none) .disableAutocorrection(true) @@ -43,7 +43,7 @@ struct RtttlConfig: View { } .keyboardType(.default) .listRowSeparator(.hidden) - Text("config.ringtone.description") + Text("Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications.") .foregroundColor(.gray) .font(.callout) } @@ -62,7 +62,7 @@ struct RtttlConfig: View { } } } - .navigationTitle("config.ringtone.title") + .navigationTitle("Ringtone Config") .navigationBarItems( trailing: ZStack { ConnectedDevice( diff --git a/Meshtastic/Views/Settings/Config/Module/StoreForwardConfig.swift b/Meshtastic/Views/Settings/Config/Module/StoreForwardConfig.swift index d3bbf314..e9fc429f 100644 --- a/Meshtastic/Views/Settings/Config/Module/StoreForwardConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/StoreForwardConfig.swift @@ -46,7 +46,7 @@ struct StoreForwardConfig: View { if enabled { Section(header: Text("Settings")) { Toggle(isOn: $heartbeat) { - Label("storeforward.heartbeat", systemImage: "waveform.path.ecg") + Label("Send Heartbeat", systemImage: "waveform.path.ecg") Text("Send a heartbeat to advertise the server's presence.") } Picker("Number of records", selection: $records) { diff --git a/Meshtastic/Views/Settings/Config/NetworkConfig.swift b/Meshtastic/Views/Settings/Config/NetworkConfig.swift index ff199cff..35e25660 100644 --- a/Meshtastic/Views/Settings/Config/NetworkConfig.swift +++ b/Meshtastic/Views/Settings/Config/NetworkConfig.swift @@ -123,7 +123,7 @@ struct NetworkConfig: View { } } } - .navigationTitle("network.config") + .navigationTitle("Network Config") .navigationBarItems( trailing: ZStack { ConnectedDevice( diff --git a/Meshtastic/Views/Settings/Config/PositionConfig.swift b/Meshtastic/Views/Settings/Config/PositionConfig.swift index 136d52bd..8fbd9d14 100644 --- a/Meshtastic/Views/Settings/Config/PositionConfig.swift +++ b/Meshtastic/Views/Settings/Config/PositionConfig.swift @@ -394,7 +394,7 @@ struct PositionConfig: View { } saveButton } - .navigationTitle("position.config") + .navigationTitle("Position Config") .navigationBarItems( trailing: ZStack { ConnectedDevice(bluetoothOn: bleManager.isSwitchedOn, deviceConnected: bleManager.connectedPeripheral != nil, name: bleManager.connectedPeripheral?.shortName ?? "?") diff --git a/Meshtastic/Views/Settings/Config/PowerConfig.swift b/Meshtastic/Views/Settings/Config/PowerConfig.swift index d875cb2b..e3c26ffb 100644 --- a/Meshtastic/Views/Settings/Config/PowerConfig.swift +++ b/Meshtastic/Views/Settings/Config/PowerConfig.swift @@ -27,7 +27,7 @@ struct PowerConfig: View { var body: some View { Form { - ConfigHeader(title: "config.power.title", config: \.powerConfig, node: node, onAppear: setPowerValues) + ConfigHeader(title: "Power Config", config: \.powerConfig, node: node, onAppear: setPowerValues) Section { if (currentDevice?.architecture == .esp32 || currentDevice?.architecture == .esp32S3) || (currentDevice?.architecture == .nrf52840 && (node?.deviceConfig?.role ?? 0 == 5 || node?.deviceConfig?.role ?? 0 == 6)) { @@ -38,7 +38,7 @@ struct PowerConfig: View { .toggleStyle(SwitchToggleStyle(tint: .accentColor)) } Toggle(isOn: $shutdownOnPowerLoss) { - Label("config.power.shutdown.on.power.loss", systemImage: "power") + Label("Shutdown on Power Loss", systemImage: "power") } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) if shutdownOnPowerLoss { @@ -101,7 +101,7 @@ struct PowerConfig: View { } } .disabled(self.bleManager.connectedPeripheral == nil || node?.powerConfig == nil) - .navigationTitle("config.power.title") + .navigationTitle("Power Config") .navigationBarItems(trailing: ZStack { ConnectedDevice( bluetoothOn: bleManager.isSwitchedOn, diff --git a/Meshtastic/Views/Settings/Config/SaveConfigButton.swift b/Meshtastic/Views/Settings/Config/SaveConfigButton.swift index 6cba6785..8e0c8701 100644 --- a/Meshtastic/Views/Settings/Config/SaveConfigButton.swift +++ b/Meshtastic/Views/Settings/Config/SaveConfigButton.swift @@ -25,7 +25,7 @@ struct SaveConfigButton: View { titleVisibility: .visible ) { let nodeName = node?.user?.longName ?? "Unknown".localized - let buttonText = String.localizedStringWithFormat("save.config %@".localized, nodeName) + let buttonText = String.localizedStringWithFormat("Save Config for %@".localized, nodeName) Button(buttonText) { onConfirmation() } diff --git a/Meshtastic/Views/Settings/Settings.swift b/Meshtastic/Views/Settings/Settings.swift index d84d24cd..2dec1530 100644 --- a/Meshtastic/Views/Settings/Settings.swift +++ b/Meshtastic/Views/Settings/Settings.swift @@ -44,7 +44,7 @@ struct Settings: View { // MARK: Views var radioConfigurationSection: some View { - Section("radio.configuration") { + Section("Radio Configuration") { let node = nodes.first(where: { $0.num == preferredNodeNum }) if let node, let loRaConfig = node.loRaConfig, @@ -69,7 +69,7 @@ struct Settings: View { NavigationLink(value: SettingsNavigationState.lora) { Label { - Text("lora") + Text("LoRa") } icon: { Image(systemName: "dot.radiowaves.left.and.right") .rotationEffect(.degrees(-90)) @@ -95,7 +95,7 @@ struct Settings: View { NavigationLink(value: SettingsNavigationState.shareQRCode) { Label { - Text("share.channels") + Text("Share QR Code") } icon: { Image(systemName: "qrcode") } diff --git a/Meshtastic/Views/Settings/ShareChannels.swift b/Meshtastic/Views/Settings/ShareChannels.swift index 71707792..fa0e6370 100644 --- a/Meshtastic/Views/Settings/ShareChannels.swift +++ b/Meshtastic/Views/Settings/ShareChannels.swift @@ -226,7 +226,7 @@ struct ShareChannels: View { } } } - .navigationTitle("generate.qr.code") + .navigationTitle("Generate QR Code") .navigationBarTitleDisplayMode(.inline) .navigationBarItems(trailing: ZStack { From aea3a96bc7239f5660f783f611b8a17526ccae35 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Thu, 8 May 2025 22:54:51 -0700 Subject: [PATCH 91/93] Review updated translation keys --- Localizable.xcstrings | 352 +++++++++++++++++++----------------------- 1 file changed, 155 insertions(+), 197 deletions(-) diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 7c0d5e8d..aa5cbd4c 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -8216,25 +8216,25 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Cancellare tutti i dati dei passeggeri?" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Radera all paxdata?" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Избриши све PAX податке?" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "要刪除所有 PAX 資料嗎?" } } @@ -13745,19 +13745,19 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Pericoloso" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Опасно" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "危險" } } @@ -16769,55 +16769,37 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "M5 Stack Card KB / RAK Tastenfeld" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Clavier M5 Stack Card KB / RAK" } }, - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "M5 Stack Card KB / RAK Keypad" - } - }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "M5 Stack Card KB / Tastiera RAK" } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "M5 Stack Card KB / RAK Keypad" - } - }, - "se" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "M5 Stack Card KB / RAK Keypad" - } - }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "M5 стек картица KB / RAK тастатура" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "M5 Stack 卡片键盘 / RAK 键盘" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "M5Stack 卡片鍵盤 / RAK 鍵盤" } } @@ -17341,116 +17323,6 @@ } } }, - "PAX Counter message received from: %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter message received for: %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter packet received for: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messaggio del contatore PAX ricevuto da: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter packet received for: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX-räknarmeddelande mottaget från: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Порука PAX бројача примљена од: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter message received for: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "PAX Counter message received from: %@" - } - } - } - }, - "Position Packet received from node: %@" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Position empfangen von Knoten: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Paquet de la position reçu du noeud : %@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "הודעת מיקום התקבלו מ-%@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Posizione Pacchetto ricevuto dal nodo: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odebrano pakiet pozycji od węzła: %@" - } - }, - "se" : { - "stringUnit" : { - "state" : "translated", - "value" : "Positionspaket mottaget från nod: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пакет позиције примљен од чвора: %@" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "Position Packet received from node: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "translated", - "value" : "Position Packet received from node: %@" - } - } - } - }, "Meshtastic Node %@ has shared channels with you" : { "localizations" : { "de" : { @@ -21776,6 +21648,58 @@ } } }, + "PAX Counter message received from: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX Counter message received for: %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX Counter packet received for: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messaggio del contatore PAX ricevuto da: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX Counter packet received for: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX-räknarmeddelande mottaget från: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Порука PAX бројача примљена од: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX Counter message received for: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "PAX Counter message received from: %@" + } + } + } + }, "paxcounter.log" : { }, @@ -22401,6 +22325,64 @@ } } }, + "Position Packet received from node: %@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Position empfangen von Knoten: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paquet de la position reçu du noeud : %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הודעת מיקום התקבלו מ-%@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posizione Pacchetto ricevuto dal nodo: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odebrano pakiet pozycji od węzła: %@" + } + }, + "se" : { + "stringUnit" : { + "state" : "translated", + "value" : "Positionspaket mottaget från nod: %@" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пакет позиције примљен од чвора: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Position Packet received from node: %@" + } + }, + "zh-Hant-TW" : { + "stringUnit" : { + "state" : "translated", + "value" : "Position Packet received from node: %@" + } + } + } + }, "Position Sent" : { "localizations" : { "de" : { @@ -22489,57 +22471,45 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Positionskonfiguration empfangen: %@" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Configuration de la position reçue : %@" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "הגדרות מיקום התקבלו: %@" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Configurazione della posizione ricevuta: %@" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Odebrano konfigurację pozycji: %@" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Positionskonfiguration mottagen: %@" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Конфигурација позиције примљена: %@" } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Positon config received: %@" - } - }, - "zh-Hant-TW" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Positon config received: %@" - } } } }, @@ -23929,55 +23899,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Negative Empfangsbestätigung empfangen" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Accusé de réception négatif reçu" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "התקבל אישור מסירה שלילי" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Ricevuto un riscontro negativo" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Otrzymano negatywne potwierdzenie" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Mottog ett negativt kvitto" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Примљено негативно признање" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "收到否认" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "收到 NACK(否定確認)" } } @@ -24187,55 +24157,55 @@ "localizations" : { "de" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Regionale Einschaltdauergrenze erreicht" } }, "fr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Limite du cycle de service régional atteinte" } }, "he" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "הגיע למקסימום שימוש אזורי לשעה זו" } }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Raggiunto il limite del ciclo di lavoro regionale" } }, "pl" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Osiągnięto regionalny limit cyklu pracy" } }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Regionala sändningsgränsen nådd" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Достигнут регионални лимит радног циклуса" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "已达到当前区域循环周期发射上限" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "已達到頻道占用循環週期發射上限" } } @@ -25028,45 +24998,33 @@ }, "Ringtone Transfer Language" : { "localizations" : { - "he" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Ringtone Transfer Language" - } - }, "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Lingua di trasferimento della suoneria" } }, - "pl" : { - "stringUnit" : { - "state" : "needs_review", - "value" : "Ringtone Transfer Language" - } - }, "se" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Språk för Överföring av Ringsignal" } }, "sr" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "Језик преноса мелодије звона" } }, "zh-Hans" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "铃声传输语言" } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "鈴聲傳輸語言(RTTTL)" } } @@ -29514,13 +29472,13 @@ "localizations" : { "it" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "I server Store and Forward richiedono un dispositivo ESP32 con PSRAM o Linux Native." } }, "zh-Hant-TW" : { "stringUnit" : { - "state" : "needs_review", + "state" : "translated", "value" : "儲存與轉送伺服器需要使用具有 PSRAM 的 ESP32 裝置或是原生 Linux 系統。" } } From de05811f14d10bb808b46adc5d14eb6012b26f52 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Thu, 8 May 2025 23:01:16 -0700 Subject: [PATCH 92/93] Fix fifteen second label --- Meshtastic/Enums/SerialConfigEnums.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Meshtastic/Enums/SerialConfigEnums.swift b/Meshtastic/Enums/SerialConfigEnums.swift index 681ef89e..131b3d26 100644 --- a/Meshtastic/Enums/SerialConfigEnums.swift +++ b/Meshtastic/Enums/SerialConfigEnums.swift @@ -174,7 +174,7 @@ enum SerialTimeoutIntervals: Int, CaseIterable, Identifiable { case .tenSeconds: return "Ten Seconds".localized case .fifteenSeconds: - return "Thirty Seconds".localized + return "Fifteen Seconds".localized case .thirtySeconds: return "Thirty Seconds".localized case .oneMinute: From 20845f77fa26857bcce0c663089b4bb5c55a1ffb Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Thu, 8 May 2025 23:03:06 -0700 Subject: [PATCH 93/93] Update Meshtastic/Persistence/UpdateCoreData.swift Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Meshtastic/Persistence/UpdateCoreData.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index b1892fa9..00916edb 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -687,7 +687,7 @@ func upsertNetworkConfigPacket(config: Config.NetworkConfig, nodeNum: Int64, ses func upsertPositionConfigPacket(config: Config.PositionConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { - let logString = String.localizedStringWithFormat("Positon config received: %@".localized, String(nodeNum)) + let logString = String.localizedStringWithFormat("Position config received: %@".localized, String(nodeNum)) Logger.data.info("🗺️ \(logString, privacy: .public)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest()