diff --git a/App/Modules/AppleSync/AppleCalendarExport.swift b/App/Modules/AppleSync/AppleCalendarExport.swift index d62a2d642..327a311c3 100644 --- a/App/Modules/AppleSync/AppleCalendarExport.swift +++ b/App/Modules/AppleSync/AppleCalendarExport.swift @@ -156,7 +156,7 @@ private class AppleCalendarExportService { event.startDate = timestamp event.endDate = timestamp + durationMinutes * 60 - if withAlarm || true { + if withAlarm { let alarm = EKAlarm(relativeOffset: 0) event.alarms = [alarm] } diff --git a/App/Modules/BellmanAlarm/BellmanAlarm.swift b/App/Modules/BellmanAlarm/BellmanAlarm.swift index 2b0598693..131cb36f7 100644 --- a/App/Modules/BellmanAlarm/BellmanAlarm.swift +++ b/App/Modules/BellmanAlarm/BellmanAlarm.swift @@ -42,10 +42,10 @@ private func bellmanAlarmMiddelware(service: LazyService, s let alarm = state.isAlarm(glucoseValue: glucose.glucoseValue) DirectLog.info("alarm: \(alarm)") - + let isSnoozed = state.isSnoozed(alarm: alarm) DirectLog.info("isSnoozed: \(isSnoozed)") - + guard !isSnoozed else { break } @@ -108,7 +108,7 @@ private class BellmanAlarmService: NSObject, CBCentralManagerDelegate, CBPeriphe setStayConnected(stayConnected: false) managerQueue.sync { - self.disconnect() + disconnect() } } @@ -124,13 +124,13 @@ private class BellmanAlarmService: NSObject, CBCentralManagerDelegate, CBPeriphe return } - managerQueue.sync { + managerQueue.async { self.notify(type: .withoutResponse) } } func centralManagerDidUpdateState(_ central: CBCentralManager) { - guard manager != nil else { + guard let manager else { DirectLog.error("Guard: manager is nil") return } @@ -167,8 +167,6 @@ private class BellmanAlarmService: NSObject, CBCentralManagerDelegate, CBPeriphe } func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) { - DirectLog.info("DidFailToConnect peripheral: \(peripheral)") - if let error = error { DirectLog.error("DidFailToConnect error: \(error)") } @@ -183,8 +181,6 @@ private class BellmanAlarmService: NSObject, CBCentralManagerDelegate, CBPeriphe } func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { - DirectLog.info("DidDisconnectPeripheral peripheral: \(peripheral)") - if let error = error { DirectLog.error("DidDisconnectPeripheral error: \(error)") } @@ -199,15 +195,11 @@ private class BellmanAlarmService: NSObject, CBCentralManagerDelegate, CBPeriphe } func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { - DirectLog.info("DidConnect peripheral: \(peripheral)") - setConnectionState(connectionState: .connected) peripheral.discoverServices([commandServiceUUID, deviceServiceUUID]) } func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) { - DirectLog.info("DidDiscoverServices peripheral: \(peripheral)") - if let error = error { DirectLog.error("DidDiscoverServices error: \(error)") } @@ -223,8 +215,6 @@ private class BellmanAlarmService: NSObject, CBCentralManagerDelegate, CBPeriphe } func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { - DirectLog.info("DidDiscoverCharacteristicsFor peripheral: \(peripheral)") - if let error = error { DirectLog.error("DidDiscoverCharacteristicsFor error: \(error)") } @@ -263,8 +253,6 @@ private class BellmanAlarmService: NSObject, CBCentralManagerDelegate, CBPeriphe } func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: Error?) { - DirectLog.info("DidUpdateNotificationStateFor peripheral: \(peripheral)") - if let error = error { DirectLog.error("DidUpdateNotificationStateFor error: \(error)") } @@ -283,8 +271,6 @@ private class BellmanAlarmService: NSObject, CBCentralManagerDelegate, CBPeriphe } func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) { - DirectLog.info("DidWriteValueFor peripheral: \(peripheral)") - if let error = error { DirectLog.error("DidWriteValueFor error: \(error)") } @@ -299,8 +285,6 @@ private class BellmanAlarmService: NSObject, CBCentralManagerDelegate, CBPeriphe } func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { - DirectLog.info("DidUpdateValueFor peripheral: \(peripheral)") - if let error = error { DirectLog.error("DidUpdateValueFor error: \(error)") } @@ -314,18 +298,6 @@ private class BellmanAlarmService: NSObject, CBCentralManagerDelegate, CBPeriphe DirectLog.info("DidUpdateValueFor data.count: \(data.count)") } - func connect() { - DirectLog.info("Connect") - - setConnectionState(connectionState: .connecting) - - if let peripheral = peripheral { - connect(peripheral) - } else { - find() - } - } - // MARK: Private private weak var subject: PassthroughSubject? @@ -397,8 +369,6 @@ private class BellmanAlarmService: NSObject, CBCentralManagerDelegate, CBPeriphe } private func find() { - DirectLog.info("Find") - guard manager.state == .poweredOn else { DirectLog.error("Guard: manager.state \(manager.state.rawValue) is not .poweredOn") return @@ -422,17 +392,23 @@ private class BellmanAlarmService: NSObject, CBCentralManagerDelegate, CBPeriphe } } } + + private func connect() { + setConnectionState(connectionState: .connecting) - private func connect(_ peripheral: CBPeripheral) { - DirectLog.info("Connect: \(peripheral)") + if let peripheral = peripheral { + connect(peripheral) + } else { + find() + } + } + private func connect(_ peripheral: CBPeripheral) { self.peripheral = peripheral manager.connect(peripheral, options: nil) } private func disconnect() { - DirectLog.info("Disconnect") - if manager.isScanning { manager.stopScan() } @@ -446,8 +422,6 @@ private class BellmanAlarmService: NSObject, CBCentralManagerDelegate, CBPeriphe } private func notify(type: CBCharacteristicWriteType) { - DirectLog.info("Notify") - setShouldNotify(shouldNotify: false) if let peripheral = peripheral, let writeCharacteristic = writeCharacteristic { diff --git a/App/Modules/SensorConnector/BubbleConnection/BubbleConnection.swift b/App/Modules/SensorConnector/BubbleConnection/BubbleConnection.swift index 9e01d15c6..43c78716b 100644 --- a/App/Modules/SensorConnector/BubbleConnection/BubbleConnection.swift +++ b/App/Modules/SensorConnector/BubbleConnection/BubbleConnection.swift @@ -32,8 +32,6 @@ class BubbleConnection: SensorBluetoothConnection, IsTransmitter { } func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) { - DirectLog.info("Peripheral: \(peripheral)") - sendUpdate(error: error) if let services = peripheral.services { @@ -46,8 +44,6 @@ class BubbleConnection: SensorBluetoothConnection, IsTransmitter { } func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { - DirectLog.info("Peripheral: \(peripheral)") - sendUpdate(error: error) if let characteristics = service.characteristics { @@ -67,8 +63,6 @@ class BubbleConnection: SensorBluetoothConnection, IsTransmitter { } func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: Error?) { - DirectLog.info("Peripheral: \(peripheral)") - sendUpdate(error: error) guard let writeCharacteristic = writeCharacteristic else { @@ -79,8 +73,6 @@ class BubbleConnection: SensorBluetoothConnection, IsTransmitter { } func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { - DirectLog.info("Peripheral: \(peripheral)") - guard let value = characteristic.value else { return } diff --git a/App/Modules/SensorConnector/LibreConnection/Libre2Connection.swift b/App/Modules/SensorConnector/LibreConnection/Libre2Connection.swift index 2e16f828b..361ba52d0 100644 --- a/App/Modules/SensorConnector/LibreConnection/Libre2Connection.swift +++ b/App/Modules/SensorConnector/LibreConnection/Libre2Connection.swift @@ -45,7 +45,7 @@ class Libre2Connection: SensorBluetoothConnection, IsSensor { override func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber) { DirectLog.info("Found peripheral: \(peripheral.name ?? "-")") - guard manager != nil else { + guard let manager else { DirectLog.error("Guard: manager is nil") return } @@ -69,8 +69,6 @@ class Libre2Connection: SensorBluetoothConnection, IsSensor { } func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) { - DirectLog.info("Peripheral: \(peripheral)") - sendUpdate(error: error) if let services = peripheral.services { @@ -83,8 +81,6 @@ class Libre2Connection: SensorBluetoothConnection, IsSensor { } func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { - DirectLog.info("Peripheral: \(peripheral)") - sendUpdate(error: error) if let characteristics = service.characteristics { @@ -111,8 +107,6 @@ class Libre2Connection: SensorBluetoothConnection, IsSensor { } func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { - DirectLog.info("Peripheral: \(peripheral)") - sendUpdate(error: error) guard let value = characteristic.value else { @@ -155,7 +149,7 @@ class Libre2Connection: SensorBluetoothConnection, IsSensor { } } - DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2)) { + managerQueue.asyncAfter(deadline: .now() + .seconds(2)) { self.resetBuffer() } } diff --git a/App/Modules/SensorConnector/LibreConnection/LibreLinkConnection.swift b/App/Modules/SensorConnector/LibreConnection/LibreLinkConnection.swift index 2b580b496..e5550386b 100644 --- a/App/Modules/SensorConnector/LibreConnection/LibreLinkConnection.swift +++ b/App/Modules/SensorConnector/LibreConnection/LibreLinkConnection.swift @@ -50,12 +50,15 @@ class LibreLinkConnection: Libre2Connection { } override func find() { - DirectLog.info("Find") - - guard manager != nil else { + guard let manager else { DirectLog.error("Guard: manager is nil") return } + + guard let serviceUUID else { + DirectLog.error("Guard: serviceUUID is nil") + return + } guard manager.state == .poweredOn else { DirectLog.error("Guard: manager.state \(manager.state.rawValue) is not .poweredOn") @@ -71,7 +74,7 @@ class LibreLinkConnection: Libre2Connection { connect(connectedPeripheral) } else { - DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(5)) { + managerQueue.asyncAfter(deadline: .now() + .seconds(5)) { self.find() } } diff --git a/App/Modules/SensorConnector/LibreConnection/LibreLinkUpConnection.swift b/App/Modules/SensorConnector/LibreConnection/LibreLinkUpConnection.swift index db4f9e078..446acc836 100644 --- a/App/Modules/SensorConnector/LibreConnection/LibreLinkUpConnection.swift +++ b/App/Modules/SensorConnector/LibreConnection/LibreLinkUpConnection.swift @@ -6,6 +6,7 @@ import Combine import CoreBluetooth import Foundation +import SwiftThrottle import SwiftUI // MARK: - LibreLinkUpConnection @@ -30,46 +31,58 @@ class LibreLinkUpConnection: SensorBluetoothConnection, IsSensor { } override func pairConnection() { - Task { - do { - lastLogin = nil - try await processLogin() - } catch { - sendUpdate(error: error) + workThrottle?.throttle { + Task { + do { + self.lastLogin = nil + + try await self.processLogin() + } catch { + self.sendUpdate(error: error) + } } } } override func connectConnection(sensor: Sensor, sensorInterval: Int) { DirectLog.info("ConnectSensor: \(sensor)") - + DirectLog.info("ConnectSensor, throttleDelay: \(throttleDelay)") + self.sensor = sensor self.sensorInterval = sensorInterval + + workThrottle = Throttle(minimumDelay: throttleDelay) setStayConnected(stayConnected: true) - Task { - do { - lastLogin = nil - try await processLogin() + workThrottle?.throttle { + Task { + do { + self.lastLogin = nil - managerQueue.async { - self.find() + try await self.processLogin() + + self.managerQueue.async { + self.find() + } + } catch { + self.sendUpdate(error: error) } - } catch { - sendUpdate(error: error) } } } override func find() { - DirectLog.info("Find") - - guard manager != nil else { + guard let manager else { DirectLog.error("Guard: manager is nil") return } + guard let serviceUUID else { + DirectLog.error("Guard: serviceUUID is nil") + return + } + guard manager.state == .poweredOn else { DirectLog.error("Guard: manager.state \(manager.state.rawValue) is not .poweredOn") return @@ -82,15 +95,13 @@ class LibreLinkUpConnection: SensorBluetoothConnection, IsSensor { connect(connectedPeripheral) } else { - DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(5)) { + managerQueue.asyncAfter(deadline: .now() + .seconds(5)) { self.find() } } } func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) { - DirectLog.info("Peripheral: \(peripheral)") - sendUpdate(error: error) if let services = peripheral.services { @@ -103,8 +114,6 @@ class LibreLinkUpConnection: SensorBluetoothConnection, IsSensor { } func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { - DirectLog.info("Peripheral: \(peripheral)") - sendUpdate(error: error) if let characteristics = service.characteristics { @@ -121,11 +130,13 @@ class LibreLinkUpConnection: SensorBluetoothConnection, IsSensor { peripheral.setNotifyValue(true, for: characteristic) } - Task { - do { - try await processFetch() - } catch { - sendUpdate(error: error) + workThrottle?.throttle { + Task { + do { + try await self.processFetch() + } catch { + DirectLog.error("Error: \(error)") + } } } } @@ -141,12 +152,15 @@ class LibreLinkUpConnection: SensorBluetoothConnection, IsSensor { return } - Task { - do { - try await Task.sleep(nanoseconds: 1_000_000_000 * 30) - try await processFetch() - } catch { - sendUpdate(error: error) + managerQueue.asyncAfter(deadline: .now() + .seconds(30)) { + self.workThrottle?.throttle { + Task { + do { + try await self.processFetch() + } catch { + DirectLog.error("Error: \(error)") + } + } } } } @@ -166,7 +180,11 @@ class LibreLinkUpConnection: SensorBluetoothConnection, IsSensor { // MARK: Private - private var workingSince: Date? + private var workThrottle: Throttle? + private var throttleDelay: Double { + (Double(sensorInterval) / 1.5) * 60 + } + private var lastLogin: LibreLinkLogin? private let oneMinuteReadingUUID = CBUUID(string: "0898177A-EF89-11E9-81B4-2A2AE2DBCCE4") private var oneMinuteReadingCharacteristic: CBCharacteristic? @@ -197,18 +215,8 @@ class LibreLinkUpConnection: SensorBluetoothConnection, IsSensor { private func processLogin(apiRegion: String? = nil) async throws { if lastLogin == nil || lastLogin!.authExpires <= Date() { - if let workingSince = workingSince, workingSince.addingTimeInterval(30) > Date() { - return - } - DirectLog.info("LibreLinkUp processLogin, starts working, \(Date().debugDescription)") - workingSince = Date() - - defer { - workingSince = nil - } - let loginResponse = try await login(apiRegion: apiRegion) if let redirect = loginResponse.data?.redirect, let region = loginResponse.data?.region, redirect, !region.isEmpty { @@ -247,22 +255,12 @@ class LibreLinkUpConnection: SensorBluetoothConnection, IsSensor { } private func processFetch() async throws { - try await processLogin() - - if let workingSince = workingSince, workingSince.addingTimeInterval(30) > Date() { - return - } - DirectLog.info("LibreLinkUp processFetch, starts working, \(Date().debugDescription)") - workingSince = Date() - - defer { - workingSince = nil - } + try await processLogin() let fetchResponse = try await fetch() - + if let sensorAge = fetchResponse.data?.activeSensors?.first?.sensor?.age ?? fetchResponse.data?.connection?.sensor?.age, let sensorSerial = fetchResponse.data?.activeSensors?.first?.sensor?.serial ?? fetchResponse.data?.connection?.sensor?.serial, let sensor = sensor diff --git a/App/Modules/SensorConnector/SensorBluetoothConnection.swift b/App/Modules/SensorConnector/SensorBluetoothConnection.swift index a5d2c7ce6..7c5002f93 100644 --- a/App/Modules/SensorConnector/SensorBluetoothConnection.swift +++ b/App/Modules/SensorConnector/SensorBluetoothConnection.swift @@ -41,8 +41,8 @@ class SensorBluetoothConnection: NSObject, SensorConnectionProtocol, CBCentralMa // MARK: Internal - var serviceUUID: CBUUID! - var manager: CBCentralManager! + var serviceUUID: CBUUID? + var manager: CBCentralManager? let managerQueue = DispatchQueue(label: "libre-direct.sensor-ble-connection.queue") weak var subject: PassthroughSubject? @@ -66,7 +66,7 @@ class SensorBluetoothConnection: NSObject, SensorConnectionProtocol, CBCentralMa } } } - + func getConfiguration(sensor: Sensor) -> [SensorConnectionConfigurationOption] { return [] } @@ -99,19 +99,22 @@ class SensorBluetoothConnection: NSObject, SensorConnectionProtocol, CBCentralMa setStayConnected(stayConnected: false) - managerQueue.sync { + managerQueue.async { self.disconnect() } } func find() { - DirectLog.info("Find") - - guard manager != nil else { + guard let manager else { DirectLog.error("Guard: manager is nil") return } + guard let serviceUUID else { + DirectLog.error("Guard: serviceUUID is nil") + return + } + guard manager.state == .poweredOn else { DirectLog.error("Guard: manager.state \(manager.state.rawValue) is not .poweredOn") return @@ -143,21 +146,22 @@ class SensorBluetoothConnection: NSObject, SensorConnectionProtocol, CBCentralMa } func scan() { - DirectLog.info("scan") - - guard manager != nil else { + guard let manager else { DirectLog.error("Guard: manager is nil") return } + guard let serviceUUID else { + DirectLog.error("Guard: serviceUUID is nil") + return + } + sendUpdate(connectionState: .scanning) manager.scanForPeripherals(withServices: [serviceUUID], options: nil) } func disconnect() { - DirectLog.info("Disconnect") - - guard manager != nil else { + guard let manager else { DirectLog.error("Guard: manager is nil") return } @@ -176,9 +180,7 @@ class SensorBluetoothConnection: NSObject, SensorConnectionProtocol, CBCentralMa } func connect(_ peripheral: CBPeripheral) { - DirectLog.info("Connect: \(peripheral)") - - guard manager != nil else { + guard let manager else { DirectLog.error("Guard: manager is nil") return } @@ -194,7 +196,6 @@ class SensorBluetoothConnection: NSObject, SensorConnectionProtocol, CBCentralMa } func setStayConnected(stayConnected: Bool) { - DirectLog.info("StayConnected: \(stayConnected.description)") self.stayConnected = stayConnected } @@ -203,34 +204,30 @@ class SensorBluetoothConnection: NSObject, SensorConnectionProtocol, CBCentralMa } func centralManagerDidUpdateState(_ central: CBCentralManager) { - guard manager != nil else { + guard let manager else { DirectLog.error("Guard: manager is nil") return } - if let manager = manager { - switch manager.state { - case .poweredOff: - sendUpdate(connectionState: .powerOff) - - case .poweredOn: - sendUpdate(connectionState: .disconnected) + switch manager.state { + case .poweredOff: + sendUpdate(connectionState: .powerOff) - guard stayConnected else { - break - } + case .poweredOn: + sendUpdate(connectionState: .disconnected) - find() - default: - sendUpdate(connectionState: .unknown) + guard stayConnected else { + break } + + find() + default: + sendUpdate(connectionState: .unknown) } } func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber) { - DirectLog.info("Peripheral: \(peripheral)") - - guard manager != nil else { + guard let manager else { DirectLog.error("Guard: manager is nil") return } @@ -244,8 +241,6 @@ class SensorBluetoothConnection: NSObject, SensorConnectionProtocol, CBCentralMa } func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) { - DirectLog.info("Peripheral: \(peripheral), didFailToConnect") - sendUpdate(connectionState: .disconnected) sendUpdate(error: error) @@ -257,8 +252,6 @@ class SensorBluetoothConnection: NSObject, SensorConnectionProtocol, CBCentralMa } func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { - DirectLog.info("Peripheral: \(peripheral), didDisconnectPeripheral") - sendUpdate(connectionState: .disconnected) sendUpdate(error: error) @@ -270,10 +263,13 @@ class SensorBluetoothConnection: NSObject, SensorConnectionProtocol, CBCentralMa } func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { - DirectLog.info("Peripheral: \(peripheral)") - resetBuffer() + guard let serviceUUID else { + DirectLog.error("Guard: serviceUUID is nil") + return + } + sendUpdate(connectionState: .connected) peripheral.discoverServices([serviceUUID]) } diff --git a/App/Views/ContentView.swift b/App/Views/ContentView.swift index 7c405aad9..b6ea8b602 100644 --- a/App/Views/ContentView.swift +++ b/App/Views/ContentView.swift @@ -58,7 +58,7 @@ struct ContentView: View { apparence.configureWithOpaqueBackground() UITabBar.appearance().scrollEdgeAppearance = apparence - }.animation(.default, value: store.state.selectedView) + } } } diff --git a/App/Views/Overview/ChartView.swift b/App/Views/Overview/ChartView.swift index e0440a1a3..7b4c3f67c 100644 --- a/App/Views/Overview/ChartView.swift +++ b/App/Views/Overview/ChartView.swift @@ -379,6 +379,7 @@ struct ChartView: View { }.onChange(of: store.state.selectedDate) { _ in selectedSmoothSensorPoint = nil + selectedRawSensorPoint = nil selectedBloodPoint = nil }.onReceive(NotificationCenter.default.publisher(for: UIDevice.orientationDidChangeNotification)) { _ in diff --git a/App/Views/Settings/SensorConnectorSettingsView.swift b/App/Views/Settings/SensorConnectorSettingsView.swift index b6640a4a9..20eeb38f6 100644 --- a/App/Views/Settings/SensorConnectorSettingsView.swift +++ b/App/Views/Settings/SensorConnectorSettingsView.swift @@ -44,7 +44,7 @@ struct SensorConnectorSettingsView: View { // MARK: Private - private let intervals: [Int] = [1, 5, 15] + private let intervals: [Int] = [1, 2, 5, 15] private var selectedConnectionID: Binding { Binding( diff --git a/App/es.lproj/InfoPlist.strings b/App/es.lproj/InfoPlist.strings index e16243ac9..fd1dd89c1 100644 --- a/App/es.lproj/InfoPlist.strings +++ b/App/es.lproj/InfoPlist.strings @@ -1,8 +1,8 @@ /* Bundle display name */ -"CFBundleDisplayName" = "Glucosa directa"; +"CFBundleDisplayName" = "Glucose Direct"; /* Bundle name */ -"CFBundleName" = "Glucosa directa"; +"CFBundleName" = "Glucose Direct"; /* Privacy - NFC Scan Usage Description */ "NFCReaderUsageDescription" = "The NFC function is required to read out all connection settings before a Bluetooth connection."; @@ -17,7 +17,7 @@ "NSCalendarsUsageDescription" = "El acceso al calendario es necesario para mostrar los valores de glucosa actualizados en el Apple Watch."; /* Privacy - Health Share Usage Description */ -"NSHealthShareUsageDescription" = "Es necesario acceder a Apple Health si se quieren exportar los datos de glucosa."; +"NSHealthShareUsageDescription" = "Es necesario acceder a la app Salud si se quieren exportar los datos de glucosa."; /* Privacy - Health Update Usage Description */ -"NSHealthUpdateUsageDescription" = "Es necesario acceder a Apple Health si se quieren exportar los datos de glucosa."; +"NSHealthUpdateUsageDescription" = "Es necesario acceder a la app Salud si se quieren exportar los datos de glucosa."; diff --git a/App/pl.lproj/InfoPlist.strings b/App/pl.lproj/InfoPlist.strings index 00a7ee535..bc6ddfeee 100644 --- a/App/pl.lproj/InfoPlist.strings +++ b/App/pl.lproj/InfoPlist.strings @@ -8,16 +8,16 @@ "NFCReaderUsageDescription" = "Funkcja NFC jest wymagana do odczytania wszystkich ustawień połączenia przed połączeniem Bluetooth."; /* Privacy - Bluetooth Always Usage Description */ -"NSBluetoothAlwaysUsageDescription" = "Do połączenia z obsługiwanymi urządzeniami potrzebna jest funkcja Bluetooth."; +"NSBluetoothAlwaysUsageDescription" = "Do połączenia z obsługiwanymi urządzeniami wymagana jest funkcja Bluetooth."; /* Privacy - Bluetooth Peripheral Usage Description */ -"NSBluetoothPeripheralUsageDescription" = "Do połączenia z obsługiwanymi urządzeniami potrzebna jest funkcja Bluetooth."; +"NSBluetoothPeripheralUsageDescription" = "Do połączenia z obsługiwanymi urządzeniami wymagana jest funkcja Bluetooth."; /* Privacy - Calendars Usage Description */ -"NSCalendarsUsageDescription" = "Dostęp do kalendarza jest wymagany do wyświetlania aktualnych wartości glukozy na Apple Watch."; +"NSCalendarsUsageDescription" = "Dostęp do aplikacji Kalendarz jest wymagany, żeby wyświetlić aktualne wartości glukozy na Apple Watch."; /* Privacy - Health Share Usage Description */ -"NSHealthShareUsageDescription" = "Dostęp do Apple Health jest wymagany, jeśli dane dotyczące glukozy mają być eksportowane."; +"NSHealthShareUsageDescription" = "Dostęp do aplikacji Zdrowie jest wymagany, jeśli dane dotyczące glukozy mają być eksportowane."; /* Privacy - Health Update Usage Description */ -"NSHealthUpdateUsageDescription" = "Dostęp do Apple Health jest wymagany, jeśli dane dotyczące glukozy mają być eksportowane."; +"NSHealthUpdateUsageDescription" = "Dostęp do aplikacji Zdrowie jest wymagany, jeśli dane dotyczące glukozy mają być eksportowane."; diff --git a/GlucoseDirect.xcodeproj/project.pbxproj b/GlucoseDirect.xcodeproj/project.pbxproj index 264b28664..56e432743 100644 --- a/GlucoseDirect.xcodeproj/project.pbxproj +++ b/GlucoseDirect.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 1055974F2990DEAF008187B4 /* SwiftThrottle in Frameworks */ = {isa = PBXBuildFile; productRef = 1055974E2990DEAF008187B4 /* SwiftThrottle */; }; 107FA9CB2975C6780002A9F4 /* AdditionalSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 107FA9CA2975C6780002A9F4 /* AdditionalSettingsView.swift */; }; 107FA9CD2975C6F90002A9F4 /* Float.swift in Sources */ = {isa = PBXBuildFile; fileRef = 107FA9CC2975C6F90002A9F4 /* Float.swift */; }; 10B3B0CE2972D65F00B70CE4 /* Alarm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10B3B0CD2972D65F00B70CE4 /* Alarm.swift */; }; @@ -241,6 +242,9 @@ 1074ABAB29510094008A375D /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = ""; }; 107FA9CA2975C6780002A9F4 /* AdditionalSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdditionalSettingsView.swift; sourceTree = ""; }; 107FA9CC2975C6F90002A9F4 /* Float.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Float.swift; sourceTree = ""; }; + 10808D50299105FD007257DA /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/InfoPlist.strings; sourceTree = ""; }; + 10808D5129910605007257DA /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = ""; }; + 10808D522991060B007257DA /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/InfoPlist.strings; sourceTree = ""; }; 10B3B0CD2972D65F00B70CE4 /* Alarm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Alarm.swift; sourceTree = ""; }; 10DD12FD296A146800C900EA /* StatisticsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatisticsView.swift; sourceTree = ""; }; 10DD1300296A15B900C900EA /* AddCalibrationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddCalibrationView.swift; sourceTree = ""; }; @@ -443,6 +447,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1055974F2990DEAF008187B4 /* SwiftThrottle in Frameworks */, E2D57349291B8E96009C37BD /* GRDB in Frameworks */, E251653E28D7BFE900922898 /* ActivityKit.framework in Frameworks */, E27BBA8027AD7DDA00A6B8EE /* HealthKit.framework in Frameworks */, @@ -925,6 +930,7 @@ name = GlucoseDirectApp; packageProductDependencies = ( E2D57348291B8E96009C37BD /* GRDB */, + 1055974E2990DEAF008187B4 /* SwiftThrottle */, ); productName = GlucoseDirect; productReference = E20B853A266F4A9800AA4224 /* GlucoseDirectApp.app */; @@ -991,6 +997,7 @@ mainGroup = E20B8531266F4A9800AA4224; packageReferences = ( E2D57347291B8E96009C37BD /* XCRemoteSwiftPackageReference "GRDB" */, + 1055974D2990DEAF008187B4 /* XCRemoteSwiftPackageReference "SwiftThrottle" */, ); productRefGroup = E20B853B266F4A9800AA4224 /* Products */; projectDirPath = ""; @@ -1255,6 +1262,7 @@ E2E4797C28BD6A0F006665EA /* uk */, 105EC00A294E6E7B008EE77B /* pl */, 1074ABA929510094008A375D /* ar */, + 10808D50299105FD007257DA /* bg */, ); name = InfoPlist.strings; sourceTree = ""; @@ -1278,6 +1286,7 @@ E2E4797D28BD6A0F006665EA /* uk */, 105EC00B294E6E7B008EE77B /* pl */, 1074ABAA29510094008A375D /* ar */, + 10808D522991060B007257DA /* bg */, ); name = InfoPlist.strings; sourceTree = ""; @@ -1301,6 +1310,7 @@ E2E4797E28BD6A0F006665EA /* uk */, 105EC00C294E6E7B008EE77B /* pl */, 1074ABAB29510094008A375D /* ar */, + 10808D5129910605007257DA /* bg */, ); name = Localizable.strings; sourceTree = ""; @@ -1452,6 +1462,9 @@ MARKETING_VERSION = "${APP_VERSION}"; PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_BUNDLE_IDENTIFIER}"; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1481,6 +1494,9 @@ MARKETING_VERSION = "${APP_VERSION}"; PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_BUNDLE_IDENTIFIER}"; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1585,6 +1601,14 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ + 1055974D2990DEAF008187B4 /* XCRemoteSwiftPackageReference "SwiftThrottle" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/Lakr233/SwiftThrottle"; + requirement = { + kind = exactVersion; + version = 1.0.2; + }; + }; E2D57347291B8E96009C37BD /* XCRemoteSwiftPackageReference "GRDB" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/groue/GRDB.swift"; @@ -1596,6 +1620,11 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ + 1055974E2990DEAF008187B4 /* SwiftThrottle */ = { + isa = XCSwiftPackageProductDependency; + package = 1055974D2990DEAF008187B4 /* XCRemoteSwiftPackageReference "SwiftThrottle" */; + productName = SwiftThrottle; + }; E2D57348291B8E96009C37BD /* GRDB */ = { isa = XCSwiftPackageProductDependency; package = E2D57347291B8E96009C37BD /* XCRemoteSwiftPackageReference "GRDB" */; diff --git a/GlucoseDirect.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/GlucoseDirect.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 3dbe23631..fd197feb3 100644 --- a/GlucoseDirect.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/GlucoseDirect.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -8,6 +8,15 @@ "revision" : "5ff2ad9e71693477547f311cd72aea2f87f0a2ff", "version" : "6.3.0" } + }, + { + "identity" : "swiftthrottle", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Lakr233/SwiftThrottle", + "state" : { + "revision" : "8df5f0f890a388355be70b0cfd962d2cd2da0ce8", + "version" : "1.0.2" + } } ], "version" : 2 diff --git a/Library/DirectConfig.swift b/Library/DirectConfig.swift index 16dfdec43..e8b8a1a59 100644 --- a/Library/DirectConfig.swift +++ b/Library/DirectConfig.swift @@ -27,7 +27,7 @@ enum DirectConfig { static let overviewViewTag = 1 static let projectName = "GlucoseDirect" static let settingsViewTag = 4 - static let smoothThresholdSeconds: Double = 180 * 60 + static let smoothThresholdSeconds: Double = 15 * 60 static let timegroupRounding = 15 static let virtualID = "virtual" static let widgetName = "\(appName) Widget" diff --git a/Library/es.lproj/Localizable.strings b/Library/es.lproj/Localizable.strings index 115e8cab1..4e934c67d 100644 --- a/Library/es.lproj/Localizable.strings +++ b/Library/es.lproj/Localizable.strings @@ -38,7 +38,7 @@ "Alert, low blood glucose" = "Alerta: glucosa en sangre baja"; /* (No Comment) */ -"Alarm, loss of signal" = "Alarma, pérdida de señal"; +"Alarm, loss of signal" = "Alarma: pérdida de señal"; /* (No Comment) */ "Alert, sensor expired" = "Alerta: sensor caducado"; @@ -65,7 +65,7 @@ "App support mail" = "Soporte"; /* (No Comment) */ -"App translation" = "Translation"; +"App translation" = "Traducción"; /* (No Comment) */ "App version" = "Versión"; diff --git a/Library/fr.lproj/Localizable.strings b/Library/fr.lproj/Localizable.strings index 956aa0a2f..6c7e41bea 100644 --- a/Library/fr.lproj/Localizable.strings +++ b/Library/fr.lproj/Localizable.strings @@ -593,10 +593,10 @@ "Show insulin input" = " Afficher l'entrée de l'insuline "; /* (No Comment) */ -"Help" = "Help"; +"Help" = "Aide"; /* (No Comment) */ -"Alarm volume" = "Alarm volume"; +"Alarm volume" = "Volume de l'alarme"; /* (No Comment) */ -"Coefficient of variation (CV) is defined as the ratio of the standard deviation to the mean. Generally speaking, most experts like to see a CV of 33% or lower, which is considered a marker of “stable” glucose levels. But take note, very young patients with diabetes tend to have higher variability than adults." = "Coefficient of variation (CV) is defined as the ratio of the standard deviation to the mean. Generally speaking, most experts like to see a CV of 33% or lower, which is considered a marker of “stable” glucose levels. But take note, very young patients with diabetes tend to have higher variability than adults."; +"Coefficient of variation (CV) is defined as the ratio of the standard deviation to the mean. Generally speaking, most experts like to see a CV of 33% or lower, which is considered a marker of “stable” glucose levels. But take note, very young patients with diabetes tend to have higher variability than adults." = "Le coefficient de variation (CV) est défini comme le rapport de l'écart type à la moyenne. De manière générale, la plupart des experts aiment voir un CV de 33 % ou moins, ce qui est considéré comme un marqueur de taux de glucose « stable ». Mais notez que les très jeunes patients atteints de diabète ont tendance à avoir une variabilité plus élevée que les adultes."; diff --git a/Library/pl.lproj/Localizable.strings b/Library/pl.lproj/Localizable.strings index 242f5da18..eaa5dff34 100644 --- a/Library/pl.lproj/Localizable.strings +++ b/Library/pl.lproj/Localizable.strings @@ -8,10 +8,10 @@ "%1$@d %2$@h %3$@min" = "%1$@d %2$@h %3$@min"; /* (No Comment) */ -"%@ Entries" = "%@ Wpisy"; +"%@ Entries" = "%@ wpisy"; /* (No Comment) */ -"%@ Entry" = "%@ Wejście"; +"%@ Entry" = "%@ wpis"; /* (No Comment) */ "About %@" = "O %@"; @@ -20,7 +20,7 @@ "Add" = "Dodaj"; /* (No Comment) */ -"Add blood glucose" = "Glukoza z glukometru"; +"Add blood glucose" = "Pomiar z glukometru"; /* (No Comment) */ "Add calibration" = "Dodaj kalibrację"; @@ -32,19 +32,19 @@ "Alarm settings" = "Ustawienia alarmu"; /* (No Comment) */ -"Alert, high glucose" = "Wysoka glukoza !"; +"Alert, high glucose" = "Wysoka glukoza!"; /* (No Comment) */ -"Alert, low blood glucose" = "Niska glukoza !!!"; +"Alert, low blood glucose" = "Niska glukoza!"; /* (No Comment) */ -"Alarm, loss of signal" = "Alarm, utrata sygnału"; +"Alarm, loss of signal" = "Utracono sygnał z sensorem"; /* (No Comment) */ "Alert, sensor expired" = "Koniec działania sensora"; /* (No Comment) */ -"Alert, sensor expiring soon" = "Sensor wkrótce wygaśnie!"; +"Alert, sensor expiring soon" = "Sensor wkrótce przestanie działać"; /* (No Comment) */ "App author" = "Autor"; @@ -65,7 +65,7 @@ "App support mail" = "Pomoc"; /* (No Comment) */ -"App translation" = "Tłumaczenie aplikacji"; +"App translation" = "Tłumaczenie"; /* (No Comment) */ "App version" = "Wersja"; @@ -80,22 +80,22 @@ "Are you sure you want to disconnect the sensor?" = "Czy na pewno chcesz odłączyć sensor?"; /* (No Comment) */ -"At least %@ days of data are required." = "Wymagane są dane z co najmniej %@ dni."; +"At least %@ days of data are required." = "Wymagane są dane z co najmniej %@ dni"; /* (No Comment) */ -"Attention, the sensor sends faulty values. Please wait 10 minutes." = "Uwaga, sensor wysyła błędne wartości. Proszę czekać 10 minut."; +"Attention, the sensor sends faulty values. Please wait 10 minutes." = "Uwaga, sensor wysyła błędne wartości. Proszę poczekać 10 minut."; /* (No Comment) */ -"Average (AVG) is an overall measure of blood sugars over a period of time, offering a single high-level view of where glucose has been." = "Średnia (AVG) to ogólna miara poziomu cukru we krwi w pewnym okresie czasu, oferująca pojedynczy ogólny widok poziomu glukozy."; +"Average (AVG) is an overall measure of blood sugars over a period of time, offering a single high-level view of where glucose has been." = "Średnia (AVG) to miara poziomu glikemii w pewnym okresie czasu, określająca pojedynczą ogólną wartość poziomu glukozy."; /* (No Comment) */ -"Bellman alarm" = "Alarm Belmana"; +"Bellman alarm" = "Alarm Bellmana"; /* (No Comment) */ "Bellman test alarm" = "Alarm testowy Bellmana"; /* (No Comment) */ -"Blood glucose values" = "Wartości glukozy we krwi"; +"Blood glucose values" = "Pomiary z glukometru"; /* (No Comment) */ "Blood glucose: %1$@" = "Glukoza we krwi: %1$@"; @@ -107,7 +107,7 @@ "Calibration view" = "Kalibracja"; /* (No Comment) */ -"Cancel" = "anulować"; +"Cancel" = "Anuluj"; /* (No Comment) */ "Chart" = "Wykres"; @@ -131,13 +131,13 @@ "Connection error" = "Błąd połączenia"; /* (No Comment) */ -"Connection error timestamp" = "Czas błędu połączenia"; +"Connection error timestamp" = "Czas"; /* (No Comment) */ -"Connection settings" = "Ustawienia połączenia"; +"Connection settings" = "Integracja z LibreLink"; /* (No Comment) */ -"Connection state" = "Stan połączenia"; +"Connection state" = "Stan"; /* (No Comment) */ "Custom calibration intercept" = "Wartość kalibracji"; @@ -149,7 +149,7 @@ "Delete all" = "Usuń wszystko"; /* (No Comment) */ -"Disconnect" = "Rozłączyć się"; +"Disconnect" = "Rozłącz"; /* (No Comment) */ "Disconnect sensor" = "Odłącz sensor"; @@ -158,13 +158,13 @@ "Disconnect transmitter" = "Odłącz transmiter"; /* (No Comment) */ -"Disconnected" = "Utracono połączenie"; +"Disconnected" = "Rozłączono"; /* (No Comment) */ -"Export to Apple Calendar" = "Eksportuj do kalendarza Apple"; +"Export to Apple Calendar" = "Eksportuj do aplikacji Kalendarz"; /* (No Comment) */ -"Export to Apple Health" = "Eksportuj do Apple Health"; +"Export to Apple Health" = "Eksportuj do aplikacji Zdrowie"; /* (No Comment) */ "Find transmitter" = "Wyszukaj transmiter"; @@ -176,7 +176,7 @@ "Glucose list view" = "Historia odczytów"; /* (No Comment) */ -"Glucose Live Activity" = "Glukoza na ekranie blokady"; +"Glucose Live Activity" = "Wyświetlaj na ekranie blokady"; /* (No Comment) */ "Glucose Management Indicator (GMI) is an replacement for \"estimated HbA1c\" for patients using continuous glucose monitoring." = "Wskaźnik zarządzania glukozą (GMI) zastępuje „szacowaną HbA1c” dla pacjentów korzystających z ciągłego monitorowania glikemii."; @@ -185,10 +185,10 @@ "Glucose notification" = "Powiadomienie o poziomie glukozy"; /* (No Comment) */ -"Glucose overview" = "Panel odczytów"; +"Glucose overview" = "Odczyty"; /* (No Comment) */ -"Glucose read aloud" = "Odczytaj glukozę"; +"Glucose read aloud" = "Przeczytaj poziom glukozy"; /* (No Comment) */ "Glucose settings" = "Ustawienia glukozy"; @@ -200,7 +200,7 @@ "Glucose widget" = "Glukoza"; /* (No Comment) */ -"Glucose widget description" = "Opis widżetu glukozy"; +"Glucose widget description" = "Wyświetlaj ostatnią wartość glukozy."; /* (No Comment) */ "High glucose alarm" = "Alarm o wysokim poziomie glukozy"; @@ -215,10 +215,10 @@ "LibreLink transmitter" = "Transmiter LibreLink"; /* (No Comment) */ -"LibreLinkUp email" = "LibreLinkUp E-Mail"; +"LibreLinkUp email" = "Email LibreLinkUp"; /* (No Comment) */ -"LibreLinkUp password" = "LibreLinkUp Password"; +"LibreLinkUp password" = "Hasło LibreLinkUp"; /* (No Comment) */ "Line" = "Linie"; @@ -233,10 +233,10 @@ "Nightscout API-Secret" = "API Secret"; /* (No Comment) */ -"Nightscout settings" = "Ustawienia Nightscout"; +"Nightscout settings" = "Integracja Nightscout"; /* (No Comment) */ -"Nightscout upload enabled" = "Przesyłaj dane do Nightscout"; +"Nightscout upload enabled" = "Przesyłaj dane do chmury"; /* (No Comment) */ "Nightscout url" = "Adres Nightscout"; @@ -287,16 +287,16 @@ "Readable miligram" = "miligramy"; /* (No Comment) */ -"Readable milimol" = "milimoll"; +"Readable milimol" = "milimol"; /* (No Comment) */ -"Readable rapidly falling" = "spada szybko"; +"Readable rapidly falling" = "szybko spada"; /* (No Comment) */ "Readable rapidly rising" = "szybko rośnie"; /* (No Comment) */ -"Readable rising" = "rosnący"; +"Readable rising" = "rośnie"; /* (No Comment) */ "Rescan the sensor" = "Ponownie zeskanuj sensor"; @@ -308,7 +308,7 @@ "Retrieval interval, every %@ minutes" = "%@ minut"; /* (No Comment) */ -"Retrieval interval, every minute" = "1 min :-)"; +"Retrieval interval, every minute" = "1 minutę"; /* (No Comment) */ "Retry pairing" = "Ponów parowanie"; @@ -401,7 +401,7 @@ "Sensor starting date" = "Data uruchomienia sensora"; /* (No Comment) */ -"Sensor state" = "Stan połączenia"; +"Sensor state" = "Stan"; /* (No Comment) */ "Sensor type" = "Typ"; @@ -416,10 +416,10 @@ "Snooze until" = "Pdłuż do/Sen"; /* (No Comment) */ -"Standard Deviation (SD) is a measure of the spread in glucose readings around the average - bouncing between highs and lows results in a larger SD. The goal is the lowest SD possible, which would reflect a steady glucose level with minimal swings." = "Odchylenie standardowe (SD) jest miarą rozpiętości odczytów poziomu glukozy wokół średniej — przeskakiwanie między wysokimi i niskimi wartościami skutkuje większym odchyleniem standardowym. Celem jest najniższe możliwe SD, które odzwierciedlałoby stały poziom glukozy przy minimalnych wahaniach.."; +"Standard Deviation (SD) is a measure of the spread in glucose readings around the average - bouncing between highs and lows results in a larger SD. The goal is the lowest SD possible, which would reflect a steady glucose level with minimal swings." = "Odchylenie standardowe (SD) jest miarą rozpiętości odczytów poziomu glukozy wokół średniej — przeskakiwanie między wysokimi i niskimi wartościami skutkuje większym odchyleniem standardowym. Celem jest najniższe możliwe SD, które odzwierciedlałoby stały poziom glukozy przy minimalnych wahaniach."; /* (No Comment) */ -"Statistics (%@ days)" = "Statystyka (%@ Tage)"; +"Statistics (%@ days)" = "Statystyka (%@ dni)"; /* (No Comment) */ "StatisticsPeriod" = "Okres"; @@ -428,7 +428,7 @@ "No more data is received from the sensor. The cause may be that the Bluetooth connection to the sensor has been interrupted or that the LibreLinkUp is no longer providing data." = "Z sensora nie są już odbierane żadne dane. Przyczyną może być przerwanie połączenia Bluetooth z sensorem lub brak przesyłania danych przez LibreLinkUp."; /* (No Comment) */ -"Time" = "Czas błędu połączenia"; +"Time" = "Czas"; /* (No Comment) */ "Time above Range (TAR) or the percentage of time spent above the target glucose of %@." = "Czas powyżej zakresu (TAR) lub procent czasu spędzonego powyżej docelowego poziomu glukozy %@."; @@ -473,7 +473,7 @@ "Upper limit" = "Wysoki"; /* (No Comment) */ -"Use LibreLink to start the sensor" = "Użyj LibreLink, aby uruchomić sensor"; +"Use LibreLink to start the sensor" = "Użyj aplikacji LibreLink, aby uruchomić sensor"; /* (No Comment) */ "Vibration" = "Wibracja"; @@ -491,7 +491,7 @@ "Without transmitter" = "Bez transmitera"; /* (No Comment) */ -"Your current glucose is %1$@ (%2$@)." = "Twoja aktualna glukoza to %1$@ (%2$@)."; +"Your current glucose is %1$@ (%2$@)." = "Twój aktualny poziom glukozy to %1$@ (%2$@)."; /* (No Comment) */ "Your glucose %1$@ (%2$@) is dangerously high and needs to be treated." = "Twoja glukoza, %1$@ (%2$@), jest niebezpiecznie wysoka."; @@ -521,7 +521,7 @@ "Export for Tidepool" = "Eksportuj do Tidepool"; /* (No Comment) */ -"%@ hours" = "%@ Godziny"; +"%@ hours" = "%@ godziny"; /* (No Comment) */ "Reopen app in" = "Otwórz GD w ciągu"; @@ -542,7 +542,7 @@ "%1$@ minutes" = "%1$@ minuty"; /* (No Comment) */ -"Meal Bolus" = "Bolus Posiłkowy"; +"Meal Bolus" = "Bolus posiłkowy"; /* (No Comment) */ "Snack Bolus" = "Bolus przekąskowy"; @@ -566,7 +566,7 @@ "Blood glucose" = "Glukoza we krwi"; /* (No Comment) */ -"Add insulin" = "Dodaj insulinę"; +"Add insulin" = "Podanie insuliny"; /* (No Comment) */ "Calibration" = "Kalibracja"; @@ -590,7 +590,7 @@ "Show smoothed glucose" = "Pokaż wyrównaną glukozę "; /* (No Comment) */ -"Show insulin input" = "Pokaż wprowadzanie insuliny"; +"Show insulin input" = "Pokaż podanie insuliny"; /* (No Comment) */ "Help" = "Pomoc"; @@ -599,4 +599,4 @@ "Alarm volume" = "Głośność alarmu"; /* (No Comment) */ -"Coefficient of variation (CV) is defined as the ratio of the standard deviation to the mean. Generally speaking, most experts like to see a CV of 33% or lower, which is considered a marker of “stable” glucose levels. But take note, very young patients with diabetes tend to have higher variability than adults." = "Współczynnik zmienności (CV) jest definiowany jako stosunek odchylenia standardowego do średniej. Ogólnie rzecz biorąc, większość ekspertów lubi widzieć CV na poziomie 33% lub niższym, co jest uważane za marker \"stabilnego\" poziomu glukozy. Ale uwaga, bardzo młodzi pacjenci z cukrzycą mają tendencję do większej zmienności niż dorośli."; +"Coefficient of variation (CV) is defined as the ratio of the standard deviation to the mean. Generally speaking, most experts like to see a CV of 33% or lower, which is considered a marker of “stable” glucose levels. But take note, very young patients with diabetes tend to have higher variability than adults." = "Współczynnik zmienności (CV) jest definiowany jako stosunek odchylenia standardowego do średniej. Wartość CV na poziomie 33% lub niższym jest uważana za marker \"stabilnego\" poziomu glukozy. Uwaga: bardzo młodzi pacjenci z cukrzycą mają tendencję do większej zmienności niż dorośli.";