Sfoglia il codice sorgente

Release 2.2.0 (#122)

1. Refactored the new bolus calculator. Now just using one formula (using two was utterly confusing). Removed many of the restrictions and replaced those with warnings and alerts instead, making it possible to get a recommendation for a more normal bolus amount, even when for instance the BG is falling or the glucose predicted to temporarily dropping down below target glucose. The Eventual BG still needs to be over target for a recommendation. This limit is not removed. Added logging and error strings from oref0 to iAPS. Added localisations for oref0 strings and calculator.  Created a New bolus pop-up and new bolus alerts.

2, Add manual glucose. Add/Delete glucose (also to/from CoreData). For when between sensors or when sensor errors etc.

2. Add euglycemic range also to laying grouped glucose in laying TIR chart in stat view.

3  New Libre 2 versions. Support for patchInfo starting with "c5" (#104). Ported from the xdripswift repo

4.  Bug fix for adding insulin without blousing.

5. Changed xDrip name to xDrip4iOS in settings (#118), by @MikePlante1 

6. Configuration cgm to cgm configuration (#1) (#119), by @MikePlante1 

7.  ISSUE-110 | Sync arrow position with Digital Crown orientation (#111), by @bashjs 

8. New localizations and new Crowdin translations, thank you all Crowdin translators!

9. Other bug fixes.

10.  Version update
Jon B Mårtensson 2 anni fa
parent
commit
2ccfe6e3e4
55 ha cambiato i file con 1864 aggiunte e 413 eliminazioni
  1. 1 1
      Config.xcconfig
  2. 2 1
      Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents
  3. 2 2
      Dependencies/CGMBLEKit/CGMBLEKit/sv.lproj/Localizable.strings
  4. 1 1
      Dependencies/CGMBLEKit/CGMBLEKitUI/it.lproj/Localizable.strings
  5. 1 1
      Dependencies/CGMBLEKit/CGMBLEKitUI/sv.lproj/Localizable.strings
  6. 4 4
      Dependencies/CGMBLEKit/CGMBLEKitUI/sv.lproj/TransmitterManagerSetup.strings
  7. 17 17
      Dependencies/G7SensorKit/sv.lproj/Localizable.strings
  8. 3 2
      Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/LibreTransmitterMetadata.swift
  9. 2 2
      Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/PreLibre2.swift
  10. 2 2
      Dependencies/MinimedKit/MinimedKit/Resources/sv.lproj/Localizable.strings
  11. 7 7
      Dependencies/MinimedKit/MinimedKitUI/Resources/sv.lproj/Localizable.strings
  12. 15 15
      Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings
  13. 10 10
      Dependencies/OmniKit/OmniKit/Resources/sv.lproj/Localizable.strings
  14. 2 2
      Dependencies/OmniKit/OmniKit/Resources/uk.lproj/Localizable.strings
  15. 5 5
      Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings
  16. 80 80
      Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings
  17. 1 1
      Dependencies/rileylink_ios/RileyLinkKitUI/sv.lproj/Localizable.strings
  18. 1 1
      Dependencies/rileylink_ios/RileyLinkKitUI/uk.lproj/Localizable.strings
  19. 1 2
      FreeAPS/Resources/javascript/bundle/determine-basal.js
  20. 4 4
      FreeAPS/Resources/sv.lproj/InfoPlist.strings
  21. 8 8
      FreeAPS/Sources/APS/CGM/CGMType.swift
  22. 4 3
      FreeAPS/Sources/APS/Storage/GlucoseStorage.swift
  23. 62 6
      FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings
  24. 1 1
      FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings
  25. 62 5
      FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings
  26. 62 6
      FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings
  27. 62 3
      FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings
  28. 62 6
      FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings
  29. 62 6
      FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings
  30. 62 6
      FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings
  31. 62 6
      FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings
  32. 64 8
      FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings
  33. 62 6
      FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings
  34. 64 8
      FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings
  35. 62 6
      FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings
  36. 62 6
      FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings
  37. 62 6
      FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings
  38. 62 6
      FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings
  39. 62 6
      FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings
  40. 73 17
      FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings
  41. 62 6
      FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings
  42. 62 6
      FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings
  43. 62 6
      FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings
  44. 12 0
      FreeAPS/Sources/Models/Suggestion.swift
  45. 46 4
      FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift
  46. 226 26
      FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift
  47. 1 1
      FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift
  48. 4 4
      FreeAPS/Sources/Modules/CGM/View/CGMSetupView.swift
  49. 46 0
      FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift
  50. 37 1
      FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift
  51. 9 24
      FreeAPS/Sources/Modules/Stat/View/ChartsView.swift
  52. 1 7
      FreeAPS/Sources/Modules/Stat/View/StatsView.swift
  53. 2 2
      FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift
  54. 8 2
      FreeAPS/Sources/Services/WatchManager/WatchManager.swift
  55. 43 39
      FreeAPSWatch WatchKit Extension/Views/BolusConfirmationView.swift

+ 1 - 1
Config.xcconfig

@@ -1,5 +1,5 @@
 APP_DISPLAY_NAME = iAPS
-APP_VERSION = 2.1.6
+APP_VERSION = 2.2.0
 APP_BUILD_NUMBER = 1
 COPYRIGHT_NOTICE =
 DEVELOPER_TEAM = ##TEAM_ID##

+ 2 - 1
Core_Data.xcdatamodeld/Core_Data.xcdatamodel/contents

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="21754" systemVersion="22E261" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
+<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="22158.8" systemVersion="22F66" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
     <entity name="BGaverages" representedClassName="BGaverages" syncable="YES" codeGenerationType="class">
         <attribute name="average" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
         <attribute name="average_1" optional="YES" attributeType="Decimal" defaultValueString="0.0"/>
@@ -92,6 +92,7 @@
     <entity name="Readings" representedClassName="Readings" syncable="YES" codeGenerationType="class">
         <attribute name="date" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
         <attribute name="glucose" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="YES"/>
+        <attribute name="id" optional="YES" attributeType="String"/>
     </entity>
     <entity name="StatsData" representedClassName="StatsData" syncable="YES" codeGenerationType="class">
         <attribute name="lastrun" attributeType="Date" defaultDateTimeInterval="704497620" usesScalarValueType="NO"/>

+ 2 - 2
Dependencies/CGMBLEKit/CGMBLEKit/sv.lproj/Localizable.strings

@@ -14,10 +14,10 @@
 "OK" = "OK";
 
 /* invlid config error description */
-"Peripheral command was invalid" = "Perifert kommando var ogiltigt";
+"Peripheral command was invalid" = "Enhetskommando var ogiltigt";
 
 /* Timeout error description */
-"Peripheral did not respond in time" = "Enhet svarade inte inom utsatt tid";
+"Peripheral did not respond in time" = "Enheten svarade inte inom utsatt tid";
 
 /* Not ready error description */
 "Peripheral isnʼt connected" = "Enheten är inte ansluten";

+ 1 - 1
Dependencies/CGMBLEKit/CGMBLEKitUI/it.lproj/Localizable.strings

@@ -1,5 +1,5 @@
 /* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/minuto";
+"%@/min" = "%@/min";
 
 /* Confirmation message for deleting a CGM */
 "Are you sure you want to delete this CGM?" = "Sei sicuro di voler eliminare questo CGM?";

+ 1 - 1
Dependencies/CGMBLEKit/CGMBLEKitUI/sv.lproj/Localizable.strings

@@ -51,7 +51,7 @@ Title text for the button to remove a CGM from Loop */
 "Transmitter Age" = "Ålder på sändare";
 
 /* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Sändari-ID";
+"Transmitter ID" = "Sändar-ID";
 
 /* Title describing glucose trend */
 "Trend" = "Trend";

+ 4 - 4
Dependencies/CGMBLEKit/CGMBLEKitUI/sv.lproj/TransmitterManagerSetup.strings

@@ -2,19 +2,19 @@
 "5oU-vK-JHQ.text" = "Inloggningsuppgifter";
 
 /* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Sändarinställning";
+"Dds-49-o7G.title" = "Sändarinställningar";
 
 /* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
 "GOT-KQ-cEh.text" = "Detalj";
 
 /* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "Sändar-ID kan hittas tryckt på baksidan av enheten, på sidan av lådan den kom in samt från inställningsmenyn för mottagaren och mobilappen.";
+"Qub-6B-0aB.footerTitle" = "Sändar-ID kan hittas tryckt på baksidan av enheten, på sidan av lådan den kom i, samt från inställningsmenyn för mottagaren och mobilappen.";
 
 /* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Sändari-ID";
+"Qub-6B-0aB.headerTitle" = "Sändar-ID";
 
 /* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Data kan laddas ned från Share (via Internet) om sändaranslutningen skulle misslyckas.";
+"k1N-Rg-XDy.footerTitle" = "Data kan laddas ned från Dexcom Share (via Internet) om sändaranslutningen skulle misslyckas.";
 
 /* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
 "k1N-Rg-XDy.headerTitle" = "Dexcom Share";

+ 17 - 17
Dependencies/G7SensorKit/sv.lproj/Localizable.strings

@@ -2,7 +2,7 @@
 "Dexcom G7" = "Dexcom G7";
 
 /* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan läsa G7 CGM - värden, men du måste alltjämt använda Dexcom G7 - appen för parkoppling, kalibrering och hantering av sensor.";
+"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan läsa G7 CGM-värden, men du måste alltjämt använda Dexcom G7-appen för parkoppling, kalibrering samt hantering av sensorn.";
 
 /* Button title for starting setup */
 "Continue" = "Fortsätt";
@@ -11,31 +11,31 @@
 "Cancel" = "Avbryt";
 
 /* Error description for unreliable state */
-"Glucose data is unavailable" = "Inga blodsockerdata tillgängliga";
+"Glucose data is unavailable" = "Inga blodglukosdata tillgängliga";
 
 /* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor är OK";
+"Sensor is OK" = "Sensorn är OK";
 
 /* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor har stoppats";
+"Sensor is stopped" = "Sensorn har stoppats";
 
 /* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor värms upp";
+"Sensor is warming up" = "Sensorn värms upp";
 
 /* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensors livslängd är slut";
+"Sensor expired" = "Sensorns livslängd är slut";
 
 /* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor misslyckades";
+"Sensor failed" = "Sensorn är felaktig";
 
 /* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensorstatus okönd %1$d";
+"Sensor is in unknown state %1$d" = "Sensorstatus okänd %1$d";
 
 /* title for g7 settings row showing sensor start time */
 "Sensor Start" = "Sensorstart";
 
 /* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Utgångsdatum";
+"Sensor Expiration" = "Sensorns utgångsdatum";
 
 /* title for g7 settings row showing sensor grace period end time */
 "Grace Period End" = "Slut av livslängd";
@@ -49,13 +49,13 @@
 
 "Trend" = "Trend";
 
-"Bluetooth" = "Blåtand";
+"Bluetooth" = "Bluetooth";
 
 /* title for g7 settings row showing BLE Name */
 "Name" = "Namn";
 
 /* title for g7 settings connection status when scanning */
-"Scanning" = "Scannar";
+"Scanning" = "Skannar";
 
 /* title for g7 settings connection status when connected */
 "Connected" = "Ansluten";
@@ -70,10 +70,10 @@
 "Configuration" = "Konfiguration";
 
 /* title for g7 config settings to upload readings */
-"Upload Readings" = "Ladda upp blodsocker";
+"Upload Readings" = "Ladda upp blodglukos";
 
 /* Button */
-"Scan for new sensor" = "Scanna efter ny sensor";
+"Scan for new sensor" = "Skanna efter ny sensor";
 
 /* Button label for removing CGM */
 "Delete CGM" = "Radera CGM";
@@ -87,13 +87,13 @@
 "HIGH" = "HÖGT";
 
 /* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@ min";
+"%@/min" = "%@/min";
 
 /* G7 Progress bar label when searching for sensor */
 "Searching for sensor" = "Söker efter sensor";
 
 /* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensors livslängd är slut";
+"Sensor expired" = "Sensorns livslängd är slut";
 
 /* G7 Progress bar label when sensor in warmup */
 "Warmup completes" = "Uppvärming av sensor";
@@ -102,10 +102,10 @@
 "Warmup completes" = "Uppvärming av sensor";
 
 /* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor misslyckades";
+"Sensor failed" = "Sensorn är felaktig";
 
 /* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor går ut";
+"Sensor expires" = "Sensorn går ut";
 
 /* G7 Progress bar label when sensor grace period progress showing */
 "Grace period remaining" = "Tid kvar av sensors livslängd";

+ 3 - 2
Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/LibreTransmitterMetadata.swift

@@ -80,6 +80,7 @@ public enum SensorType: String, CustomStringConvertible {
     case libre1    = "DF"
     case libre1A2 =  "A2"
     case libre2    = "9D"
+    case libre2C5 = "C5"
     case libreUS14day   = "E5"
     case libreUS14dayE6 = "E6"
     case libreProH = "70"
@@ -90,7 +91,7 @@ public enum SensorType: String, CustomStringConvertible {
             return "Libre 1"
         case .libre1A2:
             return "Libre 1 A2"
-        case .libre2:
+        case .libre2, .libre2C5:
             return "Libre 2"
         case .libreUS14day, .libreUS14dayE6:
             return "Libre US"
@@ -106,7 +107,7 @@ public extension SensorType {
 
         let start = patchInfo[0..<2].uppercased()
 
-        let choices: [String: SensorType] = ["DF": .libre1, "A2": .libre1A2, "9D": .libre2, "E5": .libreUS14day, "E6": .libreUS14dayE6, "70": .libreProH]
+        let choices: [String: SensorType] = ["DF": .libre1, "A2": .libre1A2, "9D": .libre2, "C5": .libre2, "E5": .libreUS14day, "E6": .libreUS14dayE6, "70": .libreProH]
 
         if let res = choices[start] {
             self = res

+ 2 - 2
Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/PreLibre2.swift

@@ -9,7 +9,7 @@ public enum Libre2 {
     ///   - data: Encrypted FRAM data
     /// - Returns: Decrypted FRAM data
     static public func decryptFRAM(type: SensorType, id: [UInt8], info: [UInt8], data: [UInt8]) throws -> [UInt8] {
-        guard type == .libre2 || type == .libreUS14day || type == .libreUS14dayE6 else {
+        guard type == .libre2 || type == .libre2C5 || type == .libreUS14day || type == .libreUS14dayE6 else {
             struct DecryptFRAMError: Error {
                 let errorDescription = "Unsupported sensor type"
             }
@@ -24,7 +24,7 @@ public enum Libre2 {
                     return 0xcadc
                 }
                 return UInt16(info[5], info[4])
-            case .libre2:
+            case .libre2, .libre2C5:
                 return UInt16(info[5], info[4]) ^ 0x44
             default: fatalError("Unsupported sensor type")
             }

+ 2 - 2
Dependencies/MinimedKit/MinimedKit/Resources/sv.lproj/Localizable.strings

@@ -1,5 +1,5 @@
 /* Communications error for a bolus currently running */
-"A bolus is already in progress" = "En bolusdos ges redan";
+"A bolus is already in progress" = "En bolusdos pågår redan";
 
 /* The description of AlarmClockReminderPumpEvent */
 "AlarmClockReminder" = "AlarmClockReminder";
@@ -74,7 +74,7 @@
 "Reservoir" = "Reservoar";
 
 /* Error description */
-"RileyLink radio tune failed" = "RileyLink radiosignal misslyckad";
+"RileyLink radio tune failed" = "RileyLinks radiojustering misslyckades";
 
 /* The format string description of a TempBasalPumpEvent. (1: The rate of the temp basal in minutes) */
 "Temporary Basal: %1$.3f U/hour" = "Temporär basal: %1$.3f E/timme";

File diff suppressed because it is too large
+ 7 - 7
Dependencies/MinimedKit/MinimedKitUI/Resources/sv.lproj/Localizable.strings


+ 15 - 15
Dependencies/OmniBLE/Localizations/sv.lproj/Localizable.strings

@@ -24,25 +24,25 @@
 "Resume Insulin" = "Återuppta insulintillförsel";
 
 /* Alert content title for finishSetupReminder pod alert */
-"Pod Pairing Incomplete" = "Parkoppling inte färdig";
+"Pod Pairing Incomplete" = "Parkoppling inte klar";
 
 /* Alert content title for timeOffsetChangeDetected pod alert */
-"Time Change Detected" = "Tidsändring upptäckt";
+"Time Change Detected" = "Tidsjustering upptäckt";
 
 /* Alert content body for multiCommand pod alert */
 "Multiple Command Alert" = "Multipla kommandoaviseringar";
 
 /* Format string for alert content body for userPodExpiration pod alert. (1: time until expiration) */
-"Pod expires in %1$@." = "Podd går ut om %1$@.";
+"Pod expires in %1$@." = "Podden går ut om %1$@.";
 
 /* Alert content body for podExpiring pod alert */
-"Change Pod now. Pod has been active for 72 hours." = "Byt podd nu. Podd har använts i 72 timmar.";
+"Change Pod now. Pod has been active for 72 hours." = "Byt podd nu. Podden har använts i 72 timmar.";
 
 /* Alert content body for podExpireImminent pod alert */
-"Change Pod now. Insulin delivery will stop in 1 hour." = "Byt podd nu. Insulintillförsel stoppas om 1 timme.";
+"Change Pod now. Insulin delivery will stop in 1 hour." = "Byt podd nu. Insulintillförseln stoppas om 1 timme.";
 
 /* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */
-"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin eller mindre kvar i podd. Byt podd snart.";
+"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin eller mindre kvar i podd. Överväg att byta podd snart.";
 
 /* Alert content body for suspendInProgress pod alert */
 "Suspend In Progress Reminder" = "Påminnelse om pausad pump";
@@ -51,7 +51,7 @@
 "The insulin suspension period has ended.\n\nYou can resume delivery from the banner on the home screen or from your pump settings screen. You will be reminded again in 15 minutes." = "Planerad period av paus av pump är slut.\n\nDu kan återuppta insulintillförsel i pumpinställningar. Du kommer bli påmind igen om 15 minuter.";
 
 /* Alert content body for finishSetupReminder pod alert */
-"Please finish pairing your pod." = "Vänligen avsluta parkopplingen av din podd.";
+"Please finish pairing your pod." = "Du behöver göra färdigt parkopplingen av din podd.";
 
 /* Alert content body for timeOffsetChangeDetected pod alert */
 "The time on your pump is different from the current time. You can review the pump time and and sync to current time in settings." = "Tiden på din pump skiljer sig från den aktuella tiden. Du kan granska pumpens tid och synkronisera till aktuell tid i pumpinställningar.";
@@ -63,7 +63,7 @@
 "Ok" = "OK";
 
 /* Label for pod life state when pod not fully activated */
-"Unfinished Activation" = "Aktivering inte färdig";
+"Unfinished Activation" = "Har inte blivit färdigaktiverad";
 
 /* Label for pod life state when time remaining */
 "Pod expires in" = "Podd går ut om";
@@ -84,10 +84,10 @@
 "Suspend Insulin Delivery" = "Pausa insulintillförsel";
 
 /* Label for pod life state when within pod expiration window */
-"Pod expired" = "Podd har utgått";
+"Pod expired" = "Podden har gått ut";
 
 /* Label for pod life state when pod not fully deactivated */
-"Unfinished deactivation" = "Inaktivering inte färdig";
+"Unfinished deactivation" = "Inaktivering inte färdigställd";
 
 /* Label for pod life state when no pod paired */
 "No Pod" = "Ingen podd";
@@ -102,10 +102,10 @@
 "Pairing." = "Parkopplar.";
 
 /* Pairing action button accessibility label while priming */
-"Priming. Please wait." = "Fyller podd. Vänligen vänta.";
+"Priming. Please wait." = "Fyller podden. Vänligen vänta.";
 
 /* Pairing action button accessibility label when pairing succeeded */
-"Pod paired successfully. Continue." = "Podd har parkopplats. Fortsätt.";
+"Pod paired successfully. Continue." = "Podden har parkopplats. Fortsätt.";
 
 /* Settings page link description when next lifecycle action is to finish deactivation */
 "Finish deactivation" = "Avsluta inaktivering";
@@ -159,16 +159,16 @@
 "Replace Pod" = "Byt podd";
 
 /* Label for pod life state when pod not fully activated */
-"Unfinished Activation" = "Aktivering inte färdig";
+"Unfinished Activation" = "Har inte blivit färdigaktiverad";
 
 /* Label for pod life state when time remaining */
 "Pod expires in" = "Podd går ut om";
 
 /* Label for pod life state when within pod expiration window */
-"Pod expired" = "Podd har utgått";
+"Pod expired" = "Podden har gått ut";
 
 /* Label for pod life state when pod not fully deactivated */
-"Unfinished deactivation" = "Inaktivering inte färdig";
+"Unfinished deactivation" = "Inaktivering inte färdigställd";
 
 /* Label for pod life state when no pod paired */
 "No Pod" = "Ingen podd";

+ 10 - 10
Dependencies/OmniKit/OmniKit/Resources/sv.lproj/Localizable.strings

@@ -2,13 +2,13 @@
 " (inactive)" = " (inaktiv)";
 
 /* Format string for low battery alert body for RileyLink. (1: device name) */
-"\"%1$@\" has a low battery" = "\"%1$@\" har ett lågt batteri";
+"\"%1$@\" has a low battery" = "\"%1$@\" har låg batterinivå";
 
 /* Unit format string for an RSSI value in decibles */
 "%@ dB" = "%@ dB";
 
 /* Format string for alert content body for lowReservoir pod alert. (1: reminder value) */
-"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin eller mindre kvar i podd. Byt podd snart.";
+"%1$@ insulin or less remaining in Pod. Change Pod soon." = "%1$@ insulin eller mindre kvar i podden. Byt podd snart.";
 
 /* Format string for activation time exceeded
    Pod state when activation not completed in the time allowed */
@@ -51,13 +51,13 @@
 "Change Pod now. Insulin delivery will stop in 1 hour." = "Byt podd nu. Insulintillförsel stoppas om 1 timme.";
 
 /* Alert content body for podExpiring pod alert */
-"Change Pod now. Pod has been active for 72 hours." = "Byt podd nu. Podd har använts i 72 timmar.";
+"Change Pod now. Pod has been active for 72 hours." = "Byt podd nu. Podden har använts i 72 timmar.";
 
 /* Format string for invalid message error code (1: error code number) */
 "Command error %1$u" = "Kommandofel %1$u";
 
 /* Status highlight that delivery is uncertain. */
-"Comms Issue" = "Kommandoproblem";
+"Comms Issue" = "Kommunikationsproblem";
 
 /* Error message when command is rejected because an unacknowledged command is pending. */
 "Communication issue: Unacknowledged command pending." = "Kommunikationsproblem: Obekräftat kommando väntar.";
@@ -72,7 +72,7 @@
 "Critical Pod Error" = "Kritiskt poddfel";
 
 /* Recovery suggestion when unexpected address received */
-"Crosstalk possible. Please move to a new location" = "Möjlig överhörning. Pröva att flytta dig till ett annat rum/annan plats";
+"Crosstalk possible. Please move to a new location" = "Potentiell radiostörning. Pröva att flytta dig till ett annat rum/annan plats";
 
 /* Pod state when pod has been deactivated */
 "Deactivated" = "Inaktiverad";
@@ -81,10 +81,10 @@
 "Disabled" = "Av";
 
 /* Description for Empty reservoir pod fault */
-"Empty reservoir" = "Podfel, tom reservoarl";
+"Empty reservoir" = "Poddfel; tom reservoar";
 
 /* Error message shown when empty response from pod was received */
-"Empty response from pod" = "Inget svar från pod";
+"Empty response from pod" = "Inget svar från podden";
 
 /* Pod state error event logged shutting down */
 "Error event logged, shutting down" = "Felhändelse loggad, stänger ned";
@@ -117,13 +117,13 @@
 "Finish setup reminder" = "Påminnelse om att slutföra inställning";
 
 /* Pod inititialized */
-"Initialized" = "Pod initialiserad";
+"Initialized" = "Podd initialiserad";
 
 /* Pod state when inserting cannula */
 "Inserting cannula" = "Kanyl förs in";
 
 /* The default notification body for AlarmCodes */
-"Insulin delivery stopped. Change Pod now." = "Insulintilförsel stoppad. Byt podd nu.";
+"Insulin delivery stopped. Change Pod now." = "Insulintillförsel stoppad. Byt podd nu.";
 
 /* Status highlight that insulin delivery was suspended. */
 "Insulin Suspended" = "Insulintillförsel pausad";
@@ -132,7 +132,7 @@
 "Insulin type not configured" = "Du måste välja typ av insulin";
 
 /* The format string for Internal pod fault (1: The fault code value) */
-"Internal pod fault %1$03d" = "Internt podfel %1$03d";
+"Internal pod fault %1$03d" = "Internt poddfel %1$03d";
 
 /* The format string describing a bolus that was interrupted. (1: The amount delivered)(2: The amount scheduled)(3: Start time of the dose)(4: duration)(5: scheduled certainty) */
 "InterruptedBolus: %1$@ U (%2$@ U scheduled) %3$@ %4$@ %5$@" = "AvbrutenBolus:  %1$@ E (%2$@ E schemalagd) %3$@ %4$@ %5$@";

+ 2 - 2
Dependencies/OmniKit/OmniKit/Resources/uk.lproj/Localizable.strings

@@ -48,10 +48,10 @@
 "Certain" = "Безперечно";
 
 /* Alert content body for podExpireImminent pod alert */
-"Change Pod now. Insulin delivery will stop in 1 hour." = "Змінити Pod зараз. Подачу інсуліну буде зупинено через 1 годину.";
+"Change Pod now. Insulin delivery will stop in 1 hour." = "Замінити Pod зараз. Подачу інсуліну буде зупинено через 1 годину.";
 
 /* Alert content body for podExpiring pod alert */
-"Change Pod now. Pod has been active for 72 hours." = "Змінити Pod зараз. Pod був активним протягом 72 годин.";
+"Change Pod now. Pod has been active for 72 hours." = "Замінити Pod зараз. Pod був активним протягом 72 годин.";
 
 /* Format string for invalid message error code (1: error code number) */
 "Command error %1$u" = "Помилка команди %1$u";

File diff suppressed because it is too large
+ 5 - 5
Dependencies/OmniKit/OmniKitUI/Resources/sv.lproj/Localizable.strings


File diff suppressed because it is too large
+ 80 - 80
Dependencies/OmniKit/OmniKitUI/Resources/uk.lproj/Localizable.strings


+ 1 - 1
Dependencies/rileylink_ios/RileyLinkKitUI/sv.lproj/Localizable.strings

@@ -5,7 +5,7 @@
 "%@%%" = "%@%%";
 
 /* The title of the section for alerts */
-"Alert" = "Varning";
+"Alert" = "Larm";
 
 /* Text indicating LED Mode is auto */
 "Auto" = "Auto";

+ 1 - 1
Dependencies/rileylink_ios/RileyLinkKitUI/uk.lproj/Localizable.strings

@@ -81,7 +81,7 @@
 "On" = "On";
 
 /* RileyLink setup description */
-"RileyLink allows for communication with the pump over Bluetooth Low Energy." = "RileyLink дозволяє зв'язуватися з насосом через Bluetooth Low Energy.";
+"RileyLink allows for communication with the pump over Bluetooth Low Energy." = "RileyLink дозволяє зв'язуватися з помпою через Bluetooth Low Energy.";
 
 /* The title of the cell showing BLE signal strength (RSSI) */
 "Signal Strength" = "Рівень сигналу";

File diff suppressed because it is too large
+ 1 - 2
FreeAPS/Resources/javascript/bundle/determine-basal.js


+ 4 - 4
FreeAPS/Resources/sv.lproj/InfoPlist.strings

@@ -1,11 +1,11 @@
 /* Privacy - NFC Scan Usage Description */
-"NFCReaderUsageDescription" = "NFC behövs för att skanna Libre-sensorn vid uppstart.";
+"NFCReaderUsageDescription" = "NFC används för att skanna Libre-sensorn vid uppstart.";
 
 /* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Bluetooth används för att kommunicera med insulinpumpen och kontinuerlig glukosmätare";
+"NSBluetoothAlwaysUsageDescription" = "Bluetooth används för att kommunicera med pump och kontinuerlig glukosmätare";
 
 /* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Bluetooth används för att kommunicera med insulinpumpen och kontinuerlig glukosmätare";
+"NSBluetoothPeripheralUsageDescription" = "Bluetooth används för att kommunicera med insulinpumpen och kontinuerliga glukosmätare";
 
 /* Privacy - Face ID Usage Description */
 "NSFaceIDUsageDescription" = "För auktoriserad åtkomst till bolus";
@@ -14,7 +14,7 @@
 "NSCalendarsUsageDescription" = "Kalendern används för att skapa kalenderhändelser för glukosvärden.";
 
 /* Privacy - Health Update Usage Description */
-"NSHealthUpdateUsageDescription" = "Appen Hälsa används för att lagra blodsockervärden, insulin och kolhydrater.";
+"NSHealthUpdateUsageDescription" = "Appen Hälsa används för att lagra blodglukosvärden, insulin samt kolhydrater";
 
 /* Privacy - Health Share Usage Description */
 "NSHealthShareUsageDescription" = "Appen Hälsa används för att lagra blodsockervärden, insulin och kolhydrater.";

+ 8 - 8
FreeAPS/Sources/APS/CGM/CGMType.swift

@@ -5,8 +5,8 @@ enum CGMType: String, JSON, CaseIterable, Identifiable {
 
     case nightscout
     case xdrip
-    case dexcomG6
     case dexcomG5
+    case dexcomG6
     case dexcomG7
     case simulator
     case libreTransmitter
@@ -18,13 +18,13 @@ enum CGMType: String, JSON, CaseIterable, Identifiable {
         case .nightscout:
             return "Nightscout"
         case .xdrip:
-            return "xDrip"
+            return "xDrip4iOS"
         case .glucoseDirect:
             return "Glucose Direct"
-        case .dexcomG6:
-            return "Dexcom G6"
         case .dexcomG5:
             return "Dexcom G5"
+        case .dexcomG6:
+            return "Dexcom G6"
         case .dexcomG7:
             return "Dexcom G7"
         case .simulator:
@@ -45,12 +45,12 @@ enum CGMType: String, JSON, CaseIterable, Identifiable {
             return URL(string: "xdripswift://")!
         case .glucoseDirect:
             return URL(string: "libredirect://")!
+        case .dexcomG5:
+            return URL(string: "dexcomgcgm://")!
         case .dexcomG6:
             return URL(string: "dexcomg6://")!
         case .dexcomG7:
             return URL(string: "dexcomg7://")!
-        case .dexcomG5:
-            return URL(string: "dexcomgcgm://")!
         case .simulator:
             return nil
         case .libreTransmitter:
@@ -77,10 +77,10 @@ enum CGMType: String, JSON, CaseIterable, Identifiable {
                 "Using shared app group with external CGM app xDrip4iOS",
                 comment: "Shared app group xDrip4iOS"
             )
-        case .dexcomG6:
-            return NSLocalizedString("Dexcom G6 app", comment: "Dexcom G6 app")
         case .dexcomG5:
             return NSLocalizedString("Native G5 app", comment: "Native G5 app")
+        case .dexcomG6:
+            return NSLocalizedString("Dexcom G6 app", comment: "Dexcom G6 app")
         case .dexcomG7:
             return NSLocalizedString("Dexcom G7 app", comment: "Dexcom G76 app")
         case .simulator:

+ 4 - 3
FreeAPS/Sources/APS/Storage/GlucoseStorage.swift

@@ -56,23 +56,24 @@ final class BaseGlucoseStorage: GlucoseStorage, Injectable {
                     }
                 }
 
-                // MARK: Save to CoreData. TEST
+                // MARK: Save to CoreData.
 
                 var bg_ = 0
                 var bgDate = Date()
+                var id = ""
 
                 if glucose.isNotEmpty {
                     bg_ = glucose[0].glucose ?? 0
                     bgDate = glucose[0].dateString
+                    id = glucose[0].id
                 }
 
                 if bg_ != 0 {
                     self.coredataContext.perform {
                         let dataForForStats = Readings(context: self.coredataContext)
-
                         dataForForStats.date = bgDate
                         dataForForStats.glucose = Int16(bg_)
-
+                        dataForForStats.id = id
                         try? self.coredataContext.save()
                     }
                 }

+ 62 - 6
FreeAPS/Sources/Localizations/Main/ar.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Save";
 
 /*  */
-"Save as preset" = "Save as preset";
+"Save as Preset" = "Save as Preset";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Delete Preset";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Manual Temp Basal";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Allow uploads";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Normal ";
 
 /* */
-"Currently no Override active" = "Currently no Override active";
-
-/* */
 "Total Insulin Adjustment" = "Total Insulin Adjustment";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Save as Preset";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configuration CGM";
+"CGM Configuration" = "CGM Configuration";
 
 "Heartbeat" = "Heartbeat";
 

+ 1 - 1
FreeAPS/Sources/Localizations/Main/ca.lproj/Localizable.strings

@@ -1557,7 +1557,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configuration CGM";
+"CGM Configuration" = "CGM Configuration";
 
 "Heartbeat" = "Heartbeat";
 

+ 62 - 5
FreeAPS/Sources/Localizations/Main/da.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Save";
 
 /*  */
-"Save as preset" = "Save as preset";
+"Save as Preset" = "Save as Preset";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Delete Preset";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Manual Temp Basal";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Allow uploads";
 
 /* API secret in NS */
@@ -1164,8 +1164,6 @@ Enact a temp Basal or a temp target */
 /* */
 "Normal " = "Normal ";
 
-/* */
-"Currently no Override active" = "Currently no Override active";
 
 /* */
 "Total Insulin Adjustment" = "Total Insulin Adjustment";
@@ -1278,6 +1276,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Save as Preset";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1617,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configuration CGM";
+"CGM Configuration" = "CGM Configuration";
 
 "Heartbeat" = "Heartbeat";
 

+ 62 - 6
FreeAPS/Sources/Localizations/Main/de.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Speichern";
 
 /*  */
-"Save as preset" = "Als Vorlage speichern";
+"Save as Preset" = "Speichern als Voreinstellung";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Voreinstellung löschen";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Manuelle Temporäre Basalrate";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Erlaube Uploads der Daten";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "im Zielbereich ";
 
 /* */
-"Currently no Override active" = "Derzeit keine Überschreibung aktiv";
-
-/* */
 "Total Insulin Adjustment" = "Gesamte Insulinanpassung";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Speichern als Voreinstellung";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warnung!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTippen Sie auf 'Hinzufügen', um mit dem ausgewählten Betrag fortzufahren.";
+
+/* */
+"Eventual Glucose" = "Prognostizierte Glukose";
+
+/* */
+"Target Glucose" = "Ziel Glukose";
+
+/* */
+"Percentage setting" = "Prozentuale Einstellung";
+
+/* */
+"Insulin Sensitivity" = "Insulin Empfindlichkeit";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Kohlenhydrate und vorheriges Insulin sind in der Glukose-Vorhersage enthalten aber wenn das Endergebnis niedriger als das Target-Glukose ist, wird ein Bolus nicht empfohlen.";
+
+/* Hide pop-up */
+"Hide" = "Ausblenden";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "CGM Einstellungen";
+"CGM Configuration" = "CGM Einstellungen";
 
 "Heartbeat" = "Herzschlag";
 

+ 62 - 3
FreeAPS/Sources/Localizations/Main/en.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Save";
 
 /*  */
-"Save as preset" = "Save as preset";
+"Save as Preset" = "Save as Preset";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Delete Preset";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Manual Temp Basal";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Allow uploads";
 
 /* API secret in NS */
@@ -1278,6 +1278,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Save as Preset";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+
+/* Warning about bolus recommendation. Title */
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " =  "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1562,7 +1621,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configuration CGM";
+"CGM Configuration" = "CGM Configuration";
 
 "Heartbeat" = "Heartbeat";
 

+ 62 - 6
FreeAPS/Sources/Localizations/Main/es.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Guardar";
 
 /*  */
-"Save as preset" = "Guardar como preestablecido";
+"Save as Preset" = "Save as Preset";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Delete Preset";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Basal temporal manual";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Permitir subida de datos";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Normal ";
 
 /* */
-"Currently no Override active" = "Currently no Override active";
-
-/* */
 "Total Insulin Adjustment" = "Total Insulin Adjustment";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Save as Preset";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configuration CGM";
+"CGM Configuration" = "CGM Configuration";
 
 "Heartbeat" = "Heartbeat";
 

+ 62 - 6
FreeAPS/Sources/Localizations/Main/fi.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Save";
 
 /*  */
-"Save as preset" = "Save as preset";
+"Save as Preset" = "Save as Preset";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Delete Preset";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Manual Temp Basal";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Allow uploads";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Normal ";
 
 /* */
-"Currently no Override active" = "Currently no Override active";
-
-/* */
 "Total Insulin Adjustment" = "Total Insulin Adjustment";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Save as Preset";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configuration CGM";
+"CGM Configuration" = "CGM Configuration";
 
 "Heartbeat" = "Heartbeat";
 

+ 62 - 6
FreeAPS/Sources/Localizations/Main/fr.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Sauvegarder";
 
 /*  */
-"Save as preset" = "Sauvegarder comme pré-réglage";
+"Save as Preset" = "Save as Preset";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Delete Preset";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Basal temporaire manuel";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Autoriser les uploads";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Normal ";
 
 /* */
-"Currently no Override active" = "Currently no Override active";
-
-/* */
 "Total Insulin Adjustment" = "Total Insulin Adjustment";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Save as Preset";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configuration CGM";
+"CGM Configuration" = "CGM Configuration";
 
 "Heartbeat" = "Heartbeat";
 

+ 62 - 6
FreeAPS/Sources/Localizations/Main/he.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Save";
 
 /*  */
-"Save as preset" = "Save as preset";
+"Save as Preset" = "Save as Preset";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Delete Preset";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Manual Temp Basal";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Allow uploads";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Normal ";
 
 /* */
-"Currently no Override active" = "Currently no Override active";
-
-/* */
 "Total Insulin Adjustment" = "Total Insulin Adjustment";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Save as Preset";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configuration CGM";
+"CGM Configuration" = "CGM Configuration";
 
 "Heartbeat" = "Heartbeat";
 

+ 64 - 8
FreeAPS/Sources/Localizations/Main/it.lproj/Localizable.strings

@@ -113,7 +113,7 @@
 "Enact Temp Target" = "Target Temporaneo";
 
 /* */
-"Target" = "Obiettivo";
+"Target" = "Target";
 
 /* */
 "Basal Insulin and Sensitivity ratio" = "Rapporto basale insulina e sensibilità";
@@ -143,7 +143,7 @@
 "Save" = "Salva";
 
 /*  */
-"Save as preset" = "Salva come predefinito";
+"Save as Preset" = "Salva come Predefinito";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Cancella predefinito";
@@ -558,7 +558,7 @@ Enact a temp Basal or a temp target */
 "Meter glucose" = "Inserisci glicemia";
 
 /* */
-"Info" = "Informazioni";
+"Info" = "Info";
 
 /*v*/
 "Slope" = "Pendenza";
@@ -1091,7 +1091,7 @@ Enact a temp Basal or a temp target */
 
 /* New ALerts ------------------------- */
 /* Info title */
-"Info" = "Informazioni";
+"Info" = "Info";
 
 /* Warning title */
 "Warning" = "Avvertimento";
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Normale ";
 
 /* */
-"Currently no Override active" = "Attualmente nessuna regolazione attiva";
-
-/* */
 "Total Insulin Adjustment" = "Regolazione Insulina Totale";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Salva come Predefinito";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configurazione CGM";
+"CGM Configuration" = "Configurazione CGM";
 
 "Heartbeat" = "Battito Cardiaco";
 

+ 62 - 6
FreeAPS/Sources/Localizations/Main/nb.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Lagre";
 
 /*  */
-"Save as preset" = "Lagre som forhåndsinnstilling";
+"Save as Preset" = "Lagre som forvalg";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Slette forvalg";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Manuell basal";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Tillat opplastinger";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Normal ";
 
 /* */
-"Currently no Override active" = "Ingen aktiv overstyring";
-
-/* */
 "Total Insulin Adjustment" = "Total justering av insulin";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Lagre som forvalg";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Advarsel!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTrykk 'Legg til' for å fortsette med den anbefalte mengden.";
+
+/* */
+"Eventual Glucose" = "Beregnet blodsukker";
+
+/* */
+"Target Glucose" = "Blodsukkermål";
+
+/* */
+"Percentage setting" = "Prosent-innstilling";
+
+/* */
+"Insulin Sensitivity" = "Insulinfølsomhet";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Beregnet blodsukker - Blodsukkermål) / ISF";
+
+/* */
+"Formula =" = "Formel =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Karbohydrater og tidligere insulin er inkludert i blodsukkerprognosen, men hvis Beregnet Blodsukker er lavere enn Blodsukkermål, anbefales det ikke en bolusdose.";
+
+/* Hide pop-up */
+"Hide" = "Skjul";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Beregnet blodsukker > blodsukkermål, men blodsukkeret er først beregnet å falle til ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "som er under terskelen din (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Beregnet blodsukker > Blodsukkermål, men blodsukkeret stiger saktere enn forventet. Forventet: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Stiger: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Beregnet blodsukker > Blodsukkermål, men blodsukkeret synker raskere enn forventet. Forventet: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Synker: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Beregnet blodsukker > Blodsukkermål, men blodsukkeret endres raskere enn forventet. Forventet: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Endring: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " uten bolus";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "CGM-innstillinger";
+"CGM Configuration" = "CGM-innstillinger";
 
 "Heartbeat" = "Puls";
 

+ 64 - 8
FreeAPS/Sources/Localizations/Main/nl.lproj/Localizable.strings

@@ -35,7 +35,7 @@
 "Clear" = "Wissen";
 
 /* Button */
-"Done" = "Bevestig";
+"Done" = "Gereed";
 
 /*  */
 "Wait please" = "Wachten";
@@ -143,7 +143,7 @@
 "Save" = "Opslaan";
 
 /*  */
-"Save as preset" = "Opslaan als tijdelijk programma";
+"Save as Preset" = "Bewaar als voorinstelling";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Verwijder voorinstelling";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Handmatige tijdelijke basaal";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Uploaden toestaan";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Normaal ";
 
 /* */
-"Currently no Override active" = "Op dit moment geen 'Overschrijving' actief";
-
-/* */
 "Total Insulin Adjustment" = "Totale insuline aanpassing";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Bewaar als voorinstelling";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Waarschuwing!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTik op 'Toevoegen' om door te gaan met het geselecteerde aantal.";
+
+/* */
+"Eventual Glucose" = "Voorspelde glucose";
+
+/* */
+"Target Glucose" = "Doel glucose";
+
+/* */
+"Percentage setting" = "Percentage instelling";
+
+/* */
+"Insulin Sensitivity" = "Insuline gevoeligheid";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Koolhydraten en vorige insuline zijn opgenomen in de glucosevoorspelling, maar als de uiteindelijke glucose lager is dan het doelglucose, wordt een bolus niet aangeraden.";
+
+/* Hide pop-up */
+"Hide" = "Verbergen";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1469,7 +1525,7 @@ Enact a temp Basal or a temp target */
 "Hours X-Axis (6 default)" = "Uren X-as (standaard 6)";
 
 /* Average BG = */
-"Average" = "Gem.";
+"Average" = "Gemiddeld";
 
 /* Median BG */
 "Median" = "Mediaan";
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "CGM configuratie";
+"CGM Configuration" = "CGM configuratie";
 
 "Heartbeat" = "Hartslag";
 

+ 62 - 6
FreeAPS/Sources/Localizations/Main/pl.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Zapisz";
 
 /*  */
-"Save as preset" = "Zapisz jako profil";
+"Save as Preset" = "Save as Preset";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Delete Preset";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Manual Temp Basal";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Allow uploads";
 
 /* API secret in NS */
@@ -1167,9 +1167,6 @@ Połączono z Nightscout!";
 "Normal " = "Normal ";
 
 /* */
-"Currently no Override active" = "Currently no Override active";
-
-/* */
 "Total Insulin Adjustment" = "Total Insulin Adjustment";
 
 /* */
@@ -1280,6 +1277,65 @@ Połączono z Nightscout!";
 /* */
 "Save as Preset" = "Save as Preset";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1562,7 +1618,7 @@ Połączono z Nightscout!";
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configuration CGM";
+"CGM Configuration" = "CGM Configuration";
 
 "Heartbeat" = "Heartbeat";
 

+ 62 - 6
FreeAPS/Sources/Localizations/Main/pt-BR.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Salvar";
 
 /*  */
-"Save as preset" = "Salvar como predefinido";
+"Save as Preset" = "Save as Preset";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Delete Preset";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Basal Temporária Manual";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Permitir uploads";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Normal ";
 
 /* */
-"Currently no Override active" = "Currently no Override active";
-
-/* */
 "Total Insulin Adjustment" = "Total Insulin Adjustment";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Save as Preset";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configuration CGM";
+"CGM Configuration" = "CGM Configuration";
 
 "Heartbeat" = "Heartbeat";
 

+ 62 - 6
FreeAPS/Sources/Localizations/Main/pt-PT.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Salvar";
 
 /*  */
-"Save as preset" = "Salvar como predefinido";
+"Save as Preset" = "Save as Preset";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Delete Preset";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Basal Temporária Manual";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Permitir uploads";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Normal ";
 
 /* */
-"Currently no Override active" = "Currently no Override active";
-
-/* */
 "Total Insulin Adjustment" = "Total Insulin Adjustment";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Save as Preset";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configuration CGM";
+"CGM Configuration" = "CGM Configuration";
 
 "Heartbeat" = "Heartbeat";
 

+ 62 - 6
FreeAPS/Sources/Localizations/Main/ru.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Сохранить";
 
 /*  */
-"Save as preset" = "Сохранить как шаблон";
+"Save as Preset" = "Сохранить как шаблон";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Удалить шаблон";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Ручная ВБС";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Разрешить выгрузку";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Нормальный ";
 
 /* */
-"Currently no Override active" = "В данный момент профиль не переопределен";
-
-/* */
 "Total Insulin Adjustment" = "Регулировка потребности в инсулине";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Сохранить как шаблон";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Конфигурация CGM";
+"CGM Configuration" = "Конфигурация CGM";
 
 "Heartbeat" = "Heartbeat";
 

+ 62 - 6
FreeAPS/Sources/Localizations/Main/sk.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Save";
 
 /*  */
-"Save as preset" = "Save as preset";
+"Save as Preset" = "Save as Preset";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Delete Preset";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Manual Temp Basal";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Allow uploads";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Normal ";
 
 /* */
-"Currently no Override active" = "Currently no Override active";
-
-/* */
 "Total Insulin Adjustment" = "Total Insulin Adjustment";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Save as Preset";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configuration CGM";
+"CGM Configuration" = "CGM Configuration";
 
 "Heartbeat" = "Heartbeat";
 

+ 73 - 17
FreeAPS/Sources/Localizations/Main/sv.lproj/Localizable.strings

@@ -47,10 +47,10 @@
 "Enacted at" = "Utfört klockan";
 
 /* Headline in suggested pop up (at: at what time) */
-"Suggested at" = "Föreslaget klockan";
+"Suggested at" = "Föreslaget vid";
 
 /* Headline in enacted pop up (at: at what time) */
-"Error at" = "Fel klockan";
+"Error at" = "Fel vid";
 
 /* Home title */
 "Home" = "Hem";
@@ -143,10 +143,10 @@
 "Save" = "Spara";
 
 /*  */
-"Save as preset" = "Spara som förval";
+"Save as Preset" = "Spara som förval";
 
 /* Delete Meal Preset */
-"Delete Preset" = "Radera Förval";
+"Delete Preset" = "Radera förval";
 
 /* Confirm Deletion */
 "Delete preset '%@'?" = "Radera förval '%@'?";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Manuell temporär basal";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Tillåt uppladdning";
 
 /* API secret in NS */
@@ -348,25 +348,25 @@ Enact a temp Basal or a temp target */
 "U/hr" = "IE/h";
 
 /* Unit in number of units delivered (keep the space character!) */
-" U" = " IE";
+" U" = " E";
 
 /* /Insulin unit */
-"/U" = "/IE";
+"/U" = "/E";
 
 /* Insulin unit */
-"U" = "IE";
+"U" = "E";
 
 /* Unit per hour with space */
-" U/hr" = " IE/h";
+" U/hr" = " E/h";
 
 /* Number of units per hour*/
-"%@ U/hr" = "%@ IE/h";
+"%@ U/hr" = "%@ E/h";
 
 /* Number of units insulin delivered */
-"%@ U" = "%@ IE";
+"%@ U" = "%@ E";
 
 /*Carb ratio unit */
-"g/U" = "g/IE";
+"g/U" = "g/E";
 
 /* grams */
 " g" = " g";
@@ -375,7 +375,7 @@ Enact a temp Basal or a temp target */
 "g" = "g";
 
 /* when 0 U/hr */
-"0 U/hr" = "0 IE/h";
+"0 U/hr" = "0 E/h";
 
 /* abbreviation for days */
 "d" = "d";
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Normal ";
 
 /* */
-"Currently no Override active" = "Inget undantag aktivt";
-
-/* */
 "Total Insulin Adjustment" = "Total justering av ditt insulinbehov";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Spara som förval";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Varning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTryck 'Lägg till' för att fylla i bolusmängd.";
+
+/* */
+"Eventual Glucose" = "Blodsockerprognos";
+
+/* */
+"Target Glucose" = "Målvärde";
+
+/* */
+"Percentage setting" = "Bolusprocentinställning";
+
+/* */
+"Insulin Sensitivity" = "Insulinkänslighet";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Blodsockerprognos - Målvärde) / ISF";
+
+/* */
+"Formula =" = "Formel =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Kolhydrater och tidigare insulin ingår i prognos, men om prognos är lägre än målvärde kommer ingen bolus att föreslås.";
+
+/* Hide pop-up */
+"Hide" = "Göm";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Blodsockerprognos är över målvärde, men ditt blodsocker väntas först sjunka ner till ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "vilket är lägre än ditt tröskelvärde (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Prognos > Målvärde, men ditt blodsocker stiger långsammare än väntat. Förväntat: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Stiger: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Prognos > målvärde, men blodsocker sjunker snabbare än väntat. Förväntat: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Sjunker: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Prognos > målvärde, men blodsocker ändras snabbare än väntat. Förväntat: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Ändras: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " utan att ge insulin";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Inställning av CGM";
+"CGM Configuration" = "Inställning av CGM";
 
 "Heartbeat" = "Hjärtslag";
 

+ 62 - 6
FreeAPS/Sources/Localizations/Main/tr.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Kaydet";
 
 /*  */
-"Save as preset" = "Ön ayar olarak kaydet";
+"Save as Preset" = "Save as Preset";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Delete Preset";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Manuel Geçici Bazal";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Veri yüklemeye izin ver";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Normal ";
 
 /* */
-"Currently no Override active" = "Currently no Override active";
-
-/* */
 "Total Insulin Adjustment" = "Total Insulin Adjustment";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Save as Preset";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configuration CGM";
+"CGM Configuration" = "CGM Configuration";
 
 "Heartbeat" = "Heartbeat";
 

+ 62 - 6
FreeAPS/Sources/Localizations/Main/uk.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "Зберегти";
 
 /*  */
-"Save as preset" = "Зберегти як шаблон";
+"Save as Preset" = "Зберегти як шаблон";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Видалити шаблон";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "Ручна тимчасова базальна швидкість (ТБШ)";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "Дозволити вивантаження";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Нормальний ";
 
 /* */
-"Currently no Override active" = "Наразі жодне перевизначення не активне";
-
-/* */
 "Total Insulin Adjustment" = "Повне коригування інсуліну";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Зберегти як шаблон";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Увага!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nНатисніть «Додати», щоб продовжити з вибраним значенням.";
+
+/* */
+"Eventual Glucose" = "Можлива глюкоза";
+
+/* */
+"Target Glucose" = "Цільова глюкоза";
+
+/* */
+"Percentage setting" = "Відсоткове налаштування";
+
+/* */
+"Insulin Sensitivity" = "Чутливість до інсуліну";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Вуглеводи та попередній інсулін включені в прогноз рівня глюкози, але якщо кінцевий рівень глюкози нижчий за цільовий рівень глюкози, болюс не буде рекомендовано.";
+
+/* Hide pop-up */
+"Hide" = "Приховати";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Конфігурація CGM";
+"CGM Configuration" = "Конфігурація CGM";
 
 "Heartbeat" = "Серцебиття";
 

+ 62 - 6
FreeAPS/Sources/Localizations/Main/zh-Hans.lproj/Localizable.strings

@@ -143,7 +143,7 @@
 "Save" = "保存​​";
 
 /*  */
-"Save as preset" = "保存为预设";
+"Save as Preset" = "Save as Preset";
 
 /* Delete Meal Preset */
 "Delete Preset" = "Delete Preset";
@@ -260,7 +260,7 @@ Enact a temp Basal or a temp target */
 /* */
 "Manual Temp Basal" = "手动设置临时基础";
 
-/* Allow uploads tp NS */
+/* Allow uploads to different services */
 "Allow uploads" = "允许上传";
 
 /* API secret in NS */
@@ -1165,9 +1165,6 @@ Enact a temp Basal or a temp target */
 "Normal " = "Normal ";
 
 /* */
-"Currently no Override active" = "Currently no Override active";
-
-/* */
 "Total Insulin Adjustment" = "Total Insulin Adjustment";
 
 /* */
@@ -1278,6 +1275,65 @@ Enact a temp Basal or a temp target */
 /* */
 "Save as Preset" = "Save as Preset";
 
+/* ----------------------- New Bolus Calculator ---------------------------*/
+/* Warning about bolus recommendation. Title */
+
+"Warning!" = "Warning!";
+
+/* Alert to confirm bolus amount to add */
+"\n\nTap 'Add' to continue with selected amount." = "\n\nTap 'Add' to continue with selected amount.";
+
+/* */
+"Eventual Glucose" = "Eventual Glucose";
+
+/* */
+"Target Glucose" = "Target Glucose";
+
+/* */
+"Percentage setting" = "Percentage setting";
+
+/* */
+"Insulin Sensitivity" = "Insulin Sensitivity";
+
+/* Formula displayed in Bolus info pop-up. Make translation short! */
+"(Eventual Glucose - Target) / ISF" = "(Eventual Glucose - Target) / ISF";
+
+/* */
+"Formula =" = "Formula =";
+
+/* Bolus pop-up footer */
+"Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended." = "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended.";
+
+/* Hide pop-up */
+"Hide" = "Hide";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is predicted to drop down to " = "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"which is below your Threshold (" = "which is below your Threshold (";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ";
+
+//* Bolus pop-up / Alert string. Make translations concise! */
+". Climbing: " = ". Climbing: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Falling: " = ". Falling: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+"Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: " = "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ";
+
+/* Bolus pop-up / Alert string. Make translations concise! */
+". Changing: " = ". Changing: ";
+
+/* Add insulin without bolusing alert */
+" without bolusing" = " without bolusing";
+
 /* -------------------------------------------------------------------------------------------
   DASH strings
 */
@@ -1560,7 +1616,7 @@ Enact a temp Basal or a temp target */
 
 /* --------------------------------------------------------  Dexcom G7 --------------------------------------*/
 
-"Configuration CGM" = "Configuration CGM";
+"CGM Configuration" = "CGM Configuration";
 
 "Heartbeat" = "Heartbeat";
 

+ 12 - 0
FreeAPS/Sources/Models/Suggestion.swift

@@ -22,6 +22,12 @@ struct Suggestion: JSON, Equatable {
     let tdd: Decimal?
     let insulin: Insulin?
     let current_target: Decimal?
+    let insulinForManualBolus: Decimal?
+    let manualBolusErrorString: Decimal?
+    let minDelta: Decimal?
+    let expectedDelta: Decimal?
+    let minGuardBG: Decimal?
+    let minPredBG: Decimal?
 }
 
 struct Predictions: JSON, Equatable {
@@ -61,6 +67,12 @@ extension Suggestion {
         case tdd = "TDD"
         case insulin
         case current_target
+        case insulinForManualBolus
+        case manualBolusErrorString
+        case minDelta
+        case expectedDelta
+        case minGuardBG
+        case minPredBG
     }
 }
 

+ 46 - 4
FreeAPS/Sources/Modules/Bolus/BolusStateModel.swift

@@ -7,15 +7,34 @@ extension Bolus {
         @Injected() var apsManager: APSManager!
         @Injected() var broadcaster: Broadcaster!
         @Injected() var pumpHistoryStorage: PumpHistoryStorage!
+
         @Published var amount: Decimal = 0
         @Published var insulinRecommended: Decimal = 0
         @Published var insulinRequired: Decimal = 0
         @Published var waitForSuggestion: Bool = false
+        @Published var error: Bool = false
+        @Published var errorString: Decimal = 0
+        @Published var evBG: Int = 0
+        @Published var insulin: Decimal = 0
+        @Published var target: Decimal = 0
+        @Published var isf: Decimal = 0
+        @Published var percentage: Decimal = 0
+        @Published var threshold: Decimal = 0
+        @Published var minGuardBG: Decimal = 0
+        @Published var minDelta: Decimal = 0
+        @Published var expectedDelta: Decimal = 0
+        @Published var minPredBG: Decimal = 0
+        @Published var units: GlucoseUnits = .mmolL
+
         var waitForSuggestionInitial: Bool = false
 
         override func subscribe() {
             setupInsulinRequired()
             broadcaster.register(SuggestionObserver.self, observer: self)
+            units = settingsManager.settings.units
+            percentage = settingsManager.settings.insulinReqPercentage
+            threshold = units == .mmolL ? settingsManager.preferences.threshold_setting.asMmolL : settingsManager.preferences
+                .threshold_setting
 
             if waitForSuggestionInitial {
                 apsManager.determineBasal()
@@ -75,11 +94,34 @@ extension Bolus {
         func setupInsulinRequired() {
             DispatchQueue.main.async {
                 self.insulinRequired = self.provider.suggestion?.insulinReq ?? 0
+
+                // Manual Bolus recommendation (normally) yields a higher amount than the insulin reqiured amount computed for SMBs (auto boluses). A manual bolus threfore now (test) uses the Eventual BG for glucose prediction, whereas the insulinReg for SMBs uses the minPredBG for glucose prediction (typically lower than Eventual BG).
+
+                var conversion: Decimal = 1.0
+                if self.units == .mmolL {
+                    conversion = 0.0555
+                }
+
+                self.evBG = self.provider.suggestion?.eventualBG ?? 0
+                self.insulin = self.provider.suggestion?.insulinForManualBolus ?? 0
+                self.target = self.provider.suggestion?.current_target ?? 0
+                self.isf = self.provider.suggestion?.isf ?? 0
+
+                if self.settingsManager.settings.insulinReqPercentage != 100 {
+                    self.insulinRecommended = self.insulin * (self.settingsManager.settings.insulinReqPercentage / 100)
+                } else { self.insulinRecommended = self.insulin }
+
+                self.errorString = self.provider.suggestion?.manualBolusErrorString ?? 0
+                if self.errorString != 0 {
+                    self.error = true
+                    self.minGuardBG = (self.provider.suggestion?.minGuardBG ?? 0) * conversion
+                    self.minDelta = (self.provider.suggestion?.minDelta ?? 0) * conversion
+                    self.expectedDelta = (self.provider.suggestion?.expectedDelta ?? 0) * conversion
+                    self.minPredBG = (self.provider.suggestion?.minPredBG ?? 0) * conversion
+                } else { self.error = false }
+
                 self.insulinRecommended = self.apsManager
-                    .roundBolus(amount: max(
-                        self.insulinRequired * (self.settingsManager.settings.insulinReqPercentage / 100) * 2,
-                        0
-                    ))
+                    .roundBolus(amount: max(self.insulinRecommended, 0))
             }
         }
     }

+ 226 - 26
FreeAPS/Sources/Modules/Bolus/View/BolusRootView.swift

@@ -6,7 +6,12 @@ extension Bolus {
         let resolver: Resolver
         let waitForSuggestion: Bool
         @StateObject var state = StateModel()
+
         @State private var isAddInsulinAlertPresented = false
+        @State private var presentInfo = false
+        @State private var displayError = false
+
+        @Environment(\.colorScheme) var colorScheme
 
         private var formatter: NumberFormatter {
             let formatter = NumberFormatter()
@@ -15,9 +20,15 @@ extension Bolus {
             return formatter
         }
 
+        private var fractionDigits: Int {
+            if state.units == .mmolL {
+                return 1
+            } else { return 0 }
+        }
+
         var body: some View {
             Form {
-                Section(header: Text("Recommendation")) {
+                Section {
                     if state.waitForSuggestion {
                         HStack {
                             Text("Wait please").foregroundColor(.secondary)
@@ -26,34 +37,31 @@ extension Bolus {
                         }
                     } else {
                         HStack {
-                            Text("Insulin required").foregroundColor(.secondary)
-                            Spacer()
-                            Text(
-                                formatter
-                                    .string(from: state.insulinRequired as NSNumber)! +
-                                    NSLocalizedString(" U", comment: "Insulin unit")
-                            ).foregroundColor(.secondary)
-                        }.contentShape(Rectangle())
-                            .onTapGesture {
-                                state.amount = state.insulinRequired
-                            }
-                        HStack {
                             Text("Insulin recommended")
                             Spacer()
                             Text(
                                 formatter
                                     .string(from: state.insulinRecommended as NSNumber)! +
                                     NSLocalizedString(" U", comment: "Insulin unit")
-                            ).foregroundColor(.secondary)
+                            ).foregroundColor((state.error && state.insulinRecommended > 0) ? .red : .secondary)
                         }.contentShape(Rectangle())
                             .onTapGesture {
-                                state.amount = state.insulinRecommended
+                                if state.error, state.insulinRecommended > 0 { displayError = true }
+                                else { state.amount = state.insulinRecommended }
                             }
+                        HStack {
+                            Image(systemName: "info.bubble").symbolRenderingMode(.palette).foregroundStyle(
+                                .primary, .blue
+                            )
+                        }.onTapGesture {
+                            presentInfo.toggle()
+                        }
                     }
                 }
+                header: { Text("Recommendation") }
 
                 if !state.waitForSuggestion {
-                    Section(header: Text("Bolus")) {
+                    Section {
                         HStack {
                             Text("Amount")
                             Spacer()
@@ -67,13 +75,12 @@ extension Bolus {
                             Text("U").foregroundColor(.secondary)
                         }
                     }
-
+                    header: { Text("Bolus") }
                     Section {
                         Button { state.add() }
                         label: { Text("Enact bolus") }
                             .disabled(state.amount <= 0)
                     }
-
                     Section {
                         if waitForSuggestion {
                             Button { state.showModal(for: nil) }
@@ -84,17 +91,56 @@ extension Bolus {
                                 .disabled(state.amount <= 0)
                         }
                     }
+                    .alert(isPresented: $isAddInsulinAlertPresented) {
+                        Alert(
+                            title: Text("Are you sure?"),
+                            message: Text(
+                                NSLocalizedString("Add", comment: "Add insulin without bolusing alert") + " " + formatter
+                                    .string(from: state.amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit") +
+                                    NSLocalizedString(" without bolusing", comment: "Add insulin without bolusing alert")
+                            ),
+                            primaryButton: .destructive(
+                                Text("Add"),
+                                action: {
+                                    state.addWithoutBolus()
+                                    isAddInsulinAlertPresented = false
+                                }
+                            ),
+                            secondaryButton: .cancel()
+                        )
+                    }
                 }
             }
-            .alert(isPresented: $isAddInsulinAlertPresented) {
-                let amount = formatter
-                    .string(from: state.amount as NSNumber)! + NSLocalizedString(" U", comment: "Insulin unit")
-                return Alert(
-                    title: Text("Are you sure?"),
-                    message: Text("Add \(amount) without bolusing"),
+            .alert(isPresented: $displayError) {
+                Alert(
+                    title: Text("Warning!"),
+                    message: Text("\n" + alertString() + NSLocalizedString(
+                        "\n\nTap 'Add' to continue with selected amount.",
+                        comment: "Alert text to confirm bolus amount to add"
+                    )),
+                    primaryButton: .destructive(
+                        Text("Add"),
+                        action: {
+                            state.amount = state.insulinRecommended
+                            displayError = false
+                        }
+                    ),
+                    secondaryButton: .cancel()
+                )
+            }
+            .alert(isPresented: $displayError) {
+                Alert(
+                    title: Text("Warning!"),
+                    message: Text("\n" + alertString() + NSLocalizedString(
+                        "\n\nTap 'Add' to continue with selected amount.",
+                        comment: "Alert text to confirm bolus amount to add"
+                    )),
                     primaryButton: .destructive(
                         Text("Add"),
-                        action: { state.addWithoutBolus() }
+                        action: {
+                            state.amount = state.insulinRecommended
+                            displayError = false
+                        }
                     ),
                     secondaryButton: .cancel()
                 )
@@ -108,11 +154,165 @@ extension Bolus {
             .navigationTitle("Enact Bolus")
             .navigationBarTitleDisplayMode(.automatic)
             .navigationBarItems(leading: Button("Close", action: state.hideModal))
+            .popup(isPresented: presentInfo, alignment: .center, direction: .bottom) {
+                bolusInfo
+            }
+        }
+
+        var bolusInfo: some View {
+            VStack {
+                // Variables
+                VStack(spacing: 3) {
+                    HStack {
+                        Text("Eventual Glucose").foregroundColor(.secondary)
+                        let evg = state.units == .mmolL ? Decimal(state.evBG).asMmolL : Decimal(state.evBG)
+                        Text(evg.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))))
+                        Text(state.units.rawValue).foregroundColor(.secondary)
+                    }
+                    HStack {
+                        Text("Target Glucose").foregroundColor(.secondary)
+                        let target = state.units == .mmolL ? state.target.asMmolL : state.target
+                        Text(target.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))))
+                        Text(state.units.rawValue).foregroundColor(.secondary)
+                    }
+                    HStack {
+                        Text("ISF").foregroundColor(.secondary)
+                        let isf = state.isf
+                        Text(isf.formatted())
+                        Text(state.units.rawValue + NSLocalizedString("/U", comment: "/Insulin unit"))
+                            .foregroundColor(.secondary)
+                    }
+                    HStack {
+                        Text("ISF:")
+                        Text("Insulin Sensitivity")
+                    }.foregroundColor(.secondary).italic()
+                    if state.percentage != 100 {
+                        HStack {
+                            Text("Percentage setting").foregroundColor(.secondary)
+                            let percentage = state.percentage
+                            Text(percentage.formatted())
+                            Text("%").foregroundColor(.secondary)
+                        }
+                    }
+                    HStack {
+                        Text("Formula =")
+                        Text("(Eventual Glucose - Target) / ISF")
+                    }.foregroundColor(.secondary).italic().padding(.top, 5)
+                }
+                .font(.footnote)
+                .padding(.top, 10)
+                Divider()
+                // Formula
+                VStack(spacing: 5) {
+                    let unit = NSLocalizedString(
+                        " U",
+                        comment: "Unit in number of units delivered (keep the space character!)"
+                    )
+                    let color: Color = (state.percentage != 100 && state.insulin > 0) ? .secondary : .blue
+                    let fontWeight: Font.Weight = (state.percentage != 100 && state.insulin > 0) ? .regular : .bold
+                    HStack {
+                        Text(NSLocalizedString("Insulin recommended", comment: "") + ":").font(.callout)
+                        Text(state.insulin.formatted() + unit).font(.callout).foregroundColor(color).fontWeight(fontWeight)
+                    }
+                    if state.percentage != 100, state.insulin > 0 {
+                        Divider()
+                        HStack { Text(state.percentage.formatted() + " % ->").font(.callout).foregroundColor(.secondary)
+                            Text(
+                                state.insulinRecommended.formatted() + unit
+                            ).font(.callout).foregroundColor(.blue).bold()
+                        }
+                    }
+                }
+                // Warning
+                if state.error, state.insulinRecommended > 0 {
+                    VStack(spacing: 5) {
+                        Divider()
+                        Text("Warning!").font(.callout).bold().foregroundColor(.orange)
+                        Text(alertString()).font(.footnote)
+                        Divider()
+                    }.padding(.horizontal, 10)
+                }
+                // Footer
+                if !(state.error && state.insulinRecommended > 0) {
+                    VStack {
+                        Text(
+                            "Carbs and previous insulin are included in the glucose prediction, but if the Eventual Glucose is lower than the Target Glucose, a bolus will not be recommended."
+                        ).font(.caption2).foregroundColor(.secondary)
+                    }.padding(20)
+                }
+                // Hide button
+                VStack {
+                    Button { presentInfo = false }
+                    label: { Text("Hide") }.frame(maxWidth: .infinity, alignment: .center).font(.callout)
+                        .foregroundColor(.blue)
+                }.padding(.bottom, 10)
+            }
+            .background(
+                RoundedRectangle(cornerRadius: 8, style: .continuous)
+                    .fill(Color(colorScheme == .dark ? UIColor.systemGray4 : UIColor.systemGray4))
+                // .fill(Color(.systemGray).gradient)  // A more prominent pop-up, but harder to read
+            )
+        }
+
+        // Localize the Oref0 error/warning strings. The default should never be returned
+        private func alertString() -> String {
+            switch state.errorString {
+            case 1,
+                 2:
+                return NSLocalizedString(
+                    "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ",
+                    comment: "Bolus pop-up / Alert string. Make translations concise!"
+                ) + state.minGuardBG
+                    .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + " " + state.units
+                    .rawValue + ", " +
+                    NSLocalizedString(
+                        "which is below your Threshold (",
+                        comment: "Bolus pop-up / Alert string. Make translations concise!"
+                    ) + state
+                    .threshold.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + ")"
+            case 3:
+                return NSLocalizedString(
+                    "Eventual Glucose > Target Glucose, but glucose is climbing slower than expected. Expected: ",
+                    comment: "Bolus pop-up / Alert string. Make translations concise!"
+                ) +
+                    state.expectedDelta
+                    .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) +
+                    NSLocalizedString(". Climbing: ", comment: "Bolus pop-up / Alert string. Make translatons concise!") + state
+                    .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))
+            case 4:
+                return NSLocalizedString(
+                    "Eventual Glucose > Target Glucose, but glucose is falling faster than expected. Expected: ",
+                    comment: "Bolus pop-up / Alert string. Make translations concise!"
+                ) +
+                    state.expectedDelta
+                    .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) +
+                    NSLocalizedString(". Falling: ", comment: "Bolus pop-up / Alert string. Make translations concise!") + state
+                    .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))
+            case 5:
+                return NSLocalizedString(
+                    "Eventual Glucose > Target Glucose, but glucose is changing faster than expected. Expected: ",
+                    comment: "Bolus pop-up / Alert string. Make translations concise!"
+                ) +
+                    state.expectedDelta
+                    .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) +
+                    NSLocalizedString(". Changing: ", comment: "Bolus pop-up / Alert string. Make translations concise!") + state
+                    .minDelta.formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits)))
+            case 6:
+                return NSLocalizedString(
+                    "Eventual Glucose > Target Glucose, but glucose is predicted to first drop down to ",
+                    comment: "Bolus pop-up / Alert string. Make translations concise!"
+                ) + state
+                    .minPredBG
+                    .formatted(.number.grouping(.never).rounded().precision(.fractionLength(fractionDigits))) + " " + state
+                    .units
+                    .rawValue
+            default:
+                return "Ignore Warning..."
+            }
         }
     }
 }
 
-// fix iOS 15 bug
 struct ActivityIndicator: UIViewRepresentable {
     @Binding var isAnimating: Bool
     let style: UIActivityIndicatorView.Style

+ 1 - 1
FreeAPS/Sources/Modules/CGM/View/CGMRootView.swift

@@ -30,7 +30,7 @@ extension CGM {
                     }
                     if [.dexcomG5, .dexcomG6, .dexcomG7].contains(state.cgm) {
                         Section {
-                            Button("Configuration CGM") {
+                            Button("CGM Configuration") {
                                 setupCGM.toggle()
                             }
                         }

+ 4 - 4
FreeAPS/Sources/Modules/CGM/View/CGMSetupView.swift

@@ -30,15 +30,15 @@ extension CGM {
             }
 
             switch CGMType {
-            case .dexcomG6:
-                setupViewController = G6CGMManager.setupViewController(
+            case .dexcomG5:
+                setupViewController = G5CGMManager.setupViewController(
                     bluetoothProvider: bluetoothManager,
                     displayGlucoseUnitObservable: displayGlucoseUnitObservable,
                     colorPalette: .default,
                     allowDebugFeatures: false
                 )
-            case .dexcomG5:
-                setupViewController = G5CGMManager.setupViewController(
+            case .dexcomG6:
+                setupViewController = G6CGMManager.setupViewController(
                     bluetoothProvider: bluetoothManager,
                     displayGlucoseUnitObservable: displayGlucoseUnitObservable,
                     colorPalette: .default,

+ 46 - 0
FreeAPS/Sources/Modules/DataTable/DataTableStateModel.swift

@@ -1,13 +1,19 @@
+import CoreData
 import SwiftUI
 
 extension DataTable {
     final class StateModel: BaseStateModel<Provider> {
         @Injected() var broadcaster: Broadcaster!
         @Injected() var unlockmanager: UnlockManager!
+        @Injected() private var storage: FileStorage!
+
+        let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
 
         @Published var mode: Mode = .treatments
         @Published var treatments: [Treatment] = []
         @Published var glucose: [Glucose] = []
+        @Published var manualGlcuose: Decimal = 0
+
         var units: GlucoseUnits = .mmolL
 
         override func subscribe() {
@@ -132,6 +138,46 @@ extension DataTable {
         func deleteGlucose(at index: Int) {
             let id = glucose[index].id
             provider.deleteGlucose(id: id)
+
+            let fetchRequest: NSFetchRequest<NSFetchRequestResult>
+            fetchRequest = NSFetchRequest(entityName: "Readings")
+            fetchRequest.predicate = NSPredicate(format: "id == %@", id)
+            let deleteRequest = NSBatchDeleteRequest(
+                fetchRequest: fetchRequest
+            )
+            deleteRequest.resultType = .resultTypeObjectIDs
+            do {
+                let deleteResult = try coredataContext.execute(deleteRequest) as? NSBatchDeleteResult
+                if let objectIDs = deleteResult?.result as? [NSManagedObjectID] {
+                    NSManagedObjectContext.mergeChanges(
+                        fromRemoteContextSave: [NSDeletedObjectsKey: objectIDs],
+                        into: [coredataContext]
+                    )
+                }
+            } catch {
+                // To do: handle any thrown errors.
+            }
+            // try? coredataContext.save()
+        }
+
+        func addManualGlucose() {
+            let glucose = units == .mmolL ? manualGlcuose.asMgdL : manualGlcuose
+            let now = Date()
+            let id = UUID().uuidString
+
+            let saveToJSON = BloodGlucose(
+                _id: id,
+                direction: nil,
+                date: Decimal(now.timeIntervalSince1970) * 1000,
+                dateString: now,
+                unfiltered: nil,
+                filtered: nil,
+                noise: nil,
+                glucose: Int(glucose),
+                type: "Manual"
+            )
+            provider.glucoseStorage.storeGlucose([saveToJSON])
+            debug(.default, "Manual Glucose saved to glucose.json")
         }
     }
 }

+ 37 - 1
FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift

@@ -1,3 +1,4 @@
+import CoreData
 import SwiftUI
 import Swinject
 
@@ -8,9 +9,11 @@ extension DataTable {
 
         @State private var isRemoveCarbsAlertPresented = false
         @State private var removeCarbsAlert: Alert?
-
         @State private var isRemoveInsulinAlertPresented = false
         @State private var removeInsulinAlert: Alert?
+        @State private var newGlucose = false
+
+        @Environment(\.colorScheme) var colorScheme
 
         private var glucoseFormatter: NumberFormatter {
             let formatter = NumberFormatter()
@@ -54,6 +57,35 @@ extension DataTable {
                 leading: Button("Close", action: state.hideModal),
                 trailing: state.mode == .glucose ? EditButton().asAny() : EmptyView().asAny()
             )
+            .popup(isPresented: newGlucose, alignment: .top, direction: .bottom) {
+                VStack(spacing: 20) {
+                    HStack {
+                        Text("New Glucose")
+                        DecimalTextField(" ... ", value: $state.manualGlcuose, formatter: glucoseFormatter)
+                        Text(state.units.rawValue)
+                    }.padding(.horizontal, 20)
+                    HStack {
+                        let limitLow: Decimal = state.units == .mmolL ? 2.2 : 40
+                        let limitHigh: Decimal = state.units == .mmolL ? 21 : 380
+                        Button { newGlucose = false }
+                        label: { Text("Cancel") }.frame(maxWidth: .infinity, alignment: .leading)
+
+                        Button {
+                            state.addManualGlucose()
+                            newGlucose = false
+                        }
+                        label: { Text("Save") }
+                            .frame(maxWidth: .infinity, alignment: .trailing)
+                            .disabled(state.manualGlcuose < limitLow || state.manualGlcuose > limitHigh)
+
+                    }.padding(20)
+                }
+                .frame(maxHeight: 140)
+                .background(
+                    RoundedRectangle(cornerRadius: 8, style: .continuous)
+                        .fill(Color(colorScheme == .dark ? UIColor.systemGray2 : UIColor.systemGray6))
+                )
+            }
         }
 
         private var treatmentsList: some View {
@@ -66,6 +98,10 @@ extension DataTable {
 
         private var glucoseList: some View {
             List {
+                Button { newGlucose = true }
+                label: { Text("Add") }.frame(maxWidth: .infinity, alignment: .trailing)
+                    .padding(.trailing, 20)
+
                 ForEach(state.glucose) { item in
                     glucoseView(item)
                 }.onDelete(perform: deleteGlucose)

+ 9 - 24
FreeAPS/Sources/Modules/Stat/View/ChartsView.swift

@@ -1,9 +1,3 @@
-//
-//  FilteredLoopsView.swift
-//  FreeAPS
-//
-//  Created by Jon Mårtensson on 2023-05-29.
-//
 import Charts
 import CoreData
 import SwiftDate
@@ -256,41 +250,32 @@ struct ChartsView: View {
             let mapGlucose = glucose.compactMap({ each in each.glucose })
             if !mapGlucose.isEmpty {
                 let mapGlucoseLow = mapGlucose.filter({ $0 < Int16(3.3 / 0.0555) })
-                let mapGlucoseAcuteLow = mapGlucose.filter({ $0 < Int16(2.6 / 0.0555) })
-
-                let mapGlucoseHigh = mapGlucose.filter({ $0 > Int(7.8 / 0.0555) })
+                let mapGlucoseNormal = mapGlucose.filter({ $0 > Int16(3.8 / 0.0555) && $0 < Int16(7.9 / 0.0555) })
                 let mapGlucoseAcuteHigh = mapGlucose.filter({ $0 > Int16(11 / 0.0555) })
 
                 HStack {
-                    let value = Double(mapGlucoseAcuteLow.count * 100 / mapGlucose.count)
-                    if value != 0 {
-                        Text(units == .mmolL ? "< 2.6" : "< 47").font(.caption2).foregroundColor(.secondary)
-                        Text(value.formatted()).font(.caption).foregroundColor(value == 0 ? .green : .red)
-                        Text("%").font(.caption)
-                    }
-                }.padding(.horizontal, 10)
-                HStack {
                     let value = Double(mapGlucoseLow.count * 100 / mapGlucose.count)
                     if value != 0 {
                         Text(units == .mmolL ? "< 3.3" : "< 59").font(.caption2).foregroundColor(.secondary)
-                        Text(value.formatted()).font(.caption).foregroundColor(value == 0 ? .green : .orange)
+                        Text(value.formatted()).font(.caption).foregroundColor(value == 0 ? .green : .red)
                         Text("%").font(.caption)
                     }
                 }
                 Spacer()
                 HStack {
-                    let value = Double(mapGlucoseHigh.count * 100 / mapGlucose.count)
+                    let value = Double(mapGlucoseNormal.count * 100 / mapGlucose.count)
                     if value != 0 {
-                        Text(units == .mmolL ? "> 7.8" : "> 140").font(.caption).foregroundColor(.secondary)
-                        Text(value.formatted()).font(.caption).foregroundColor(value == 0 ? .green : .orange)
-                        Text("%").font(.caption)
+                        Text(units == .mmolL ? "3.9-7.8" : "70-140").foregroundColor(.secondary)
+                        Text(value.formatted()).foregroundColor(.green)
+                        Text("%").foregroundColor(.secondary)
                     }
-                }.padding(.horizontal, 10)
+                }.font(.caption)
+                Spacer()
                 HStack {
                     let value = Double(mapGlucoseAcuteHigh.count * 100 / mapGlucose.count)
                     if value != 0 {
                         Text(units == .mmolL ? "> 11.0" : "> 216").font(.caption).foregroundColor(.secondary)
-                        Text(value.formatted()).font(.caption).foregroundColor(value == 0 ? .green : .red)
+                        Text(value.formatted()).font(.caption).foregroundColor(value == 0 ? .green : .orange)
                         Text("%").font(.caption)
                     }
                 }

+ 1 - 7
FreeAPS/Sources/Modules/Stat/View/StatsView.swift

@@ -1,9 +1,3 @@
-//
-//  FilteredLoopsView.swift
-//  FreeAPS
-//
-//  Created by Jon Mårtensson on 2023-05-29.
-//
 import CoreData
 import SwiftDate
 import SwiftUI
@@ -95,7 +89,7 @@ struct StatsView: View {
                     )
                 }
                 VStack(spacing: 5) {
-                    Text("Sucess").font(.subheadline).foregroundColor(headline)
+                    Text("Success").font(.subheadline).foregroundColor(headline)
                     Text(
                         ((successRate ?? 100) / 100)
                             .formatted(.percent.grouping(.never).rounded().precision(.fractionLength(1)))

+ 2 - 2
FreeAPS/Sources/Modules/StatConfig/StatConfigStateModel.swift

@@ -26,7 +26,7 @@ extension StatConfig {
             subscribeSetting(\.oneDimensionalGraph, on: $oneDimensionalGraph) { oneDimensionalGraph = $0 }
 
             subscribeSetting(\.low, on: $low, initial: {
-                let value = max(min($0, 120), 40)
+                let value = max(min($0, 90), 40)
                 low = units == .mmolL ? value.asMmolL : value
             }, map: {
                 guard units == .mmolL else { return $0 }
@@ -34,7 +34,7 @@ extension StatConfig {
             })
 
             subscribeSetting(\.high, on: $high, initial: {
-                let value = max(min($0, 270), 130)
+                let value = max(min($0, 270), 110)
                 high = units == .mmolL ? value.asMmolL : value
             }, map: {
                 guard units == .mmolL else { return $0 }

+ 8 - 2
FreeAPS/Sources/Services/WatchManager/WatchManager.swift

@@ -75,9 +75,15 @@ final class BaseWatchManager: NSObject, WatchManager, Injectable {
             self.state.maxBolus = self.settingsManager.pumpSettings.maxBolus
             self.state.carbsRequired = self.suggestion?.carbsReq
 
-            let insulinRequired = self.suggestion?.insulinReq ?? 0
+            var insulinRequired = self.suggestion?.insulinReq ?? 0
+            var double: Decimal = 2
+            if (self.suggestion?.cob ?? 0) > 0 {
+                insulinRequired = self.suggestion?.insulinForManualBolus ?? 0
+                double = 1
+            }
+
             self.state.bolusRecommended = self.apsManager
-                .roundBolus(amount: max(insulinRequired * (self.settingsManager.settings.insulinReqPercentage / 100) * 2, 0))
+                .roundBolus(amount: max(insulinRequired * (self.settingsManager.settings.insulinReqPercentage / 100) * double, 0))
 
             self.state.iob = self.suggestion?.iob
             self.state.cob = self.suggestion?.cob

+ 43 - 39
FreeAPSWatch WatchKit Extension/Views/BolusConfirmationView.swift

@@ -4,6 +4,7 @@ import SwiftUI
 struct BolusConfirmationView: View {
     @EnvironmentObject var state: WatchStateModel
 
+    @State var isCrownLeftOriented = WKInterfaceDevice.current().crownOrientation == .left
     @State var crownProgress: CGFloat = 100.0
     @State var progress: CGFloat = 0
 
@@ -16,54 +17,57 @@ struct BolusConfirmationView: View {
     var body: some View {
         VStack {
             GeometryReader { geo in
-                ZStack(alignment: .top) {
-                    RoundedRectangle(cornerRadius: elementSize / 2, style: .circular)
-                        .fill(.secondary)
-                        .frame(width: elementSize, height: geo.size.height)
-                        .opacity(0.2)
+                HStack(alignment: .top) {
+                    Spacer().frame(width: elementSize / 2)
+                    ZStack(alignment: .top) {
+                        RoundedRectangle(cornerRadius: elementSize / 2, style: .circular)
+                            .fill(.secondary)
+                            .frame(width: elementSize, height: geo.size.height)
+                            .opacity(0.2)
 
-                    RoundedRectangle(cornerRadius: elementSize / 2, style: .circular)
-                        .fill(Color.insulin)
-                        .frame(width: elementSize, height: elementSize + (geo.size.height - elementSize) * progress / 100)
-                        .opacity(0.2)
+                        RoundedRectangle(cornerRadius: elementSize / 2, style: .circular)
+                            .fill(Color.insulin)
+                            .frame(width: elementSize, height: elementSize + (geo.size.height - elementSize) * progress / 100)
+                            .opacity(0.2)
 
-                    Image(systemName: "arrow.right")
-                        .resizable()
-                        .frame(width: elementSize / 2, height: elementSize / 2)
-                        .foregroundColor(.primary)
-                        .position(x: geo.size.width - elementSize / 4, y: elementSize / 2)
-                        .transition(.opacity)
-
-                    if done {
-                        Image(systemName: "checkmark.circle.fill")
+                        Image(systemName: done == true ? "checkmark.circle.fill" : "arrow.down.circle.fill")
                             .resizable()
-                            .foregroundColor(.loopGreen)
+                            .foregroundColor(done == true ? .loopGreen : .insulin)
                             .frame(width: elementSize, height: elementSize)
-                            .position(
-                                x: geo.size.width / 2,
-                                y: elementSize / 2 + ((geo.size.height - elementSize) * progress / 100)
-                            )
+                            .offset(y: (geo.size.height - elementSize) * progress / 100)
+
+                    }.frame(maxWidth: .infinity, alignment: .center)
+                    if isCrownLeftOriented {
+                        Spacer().frame(width: elementSize / 2)
                     } else {
-                        Image(systemName: "arrow.down.circle.fill")
+                        Image(systemName: "arrow.down")
                             .resizable()
-                            .foregroundColor(.insulin)
-                            .frame(width: elementSize, height: elementSize)
-                            .position(
-                                x: geo.size.width / 2,
-                                y: elementSize / 2 + ((geo.size.height - elementSize) * progress / 100)
-                            )
+                            .frame(width: elementSize / 2, height: elementSize / 2)
+                            .foregroundColor(.primary)
+                            .transition(.opacity)
                     }
-                }
-                .frame(maxWidth: .infinity, maxHeight: .infinity)
+                }.frame(maxWidth: .infinity, maxHeight: .infinity)
             }
             .padding()
-            Button {
-                WKInterfaceDevice.current().play(.click)
-                state.pendingBolus = nil
-                state.isConfirmationBolusViewActive = false
-            }
-            label: {
-                Text("Cancel")
+            HStack(spacing: 16) {
+                if isCrownLeftOriented {
+                    Image(systemName: "arrow.down")
+                        .resizable()
+                        .frame(width: elementSize / 2, height: elementSize / 2)
+                        .foregroundColor(.primary)
+                        .transition(.opacity)
+                }
+                Button {
+                    WKInterfaceDevice.current().play(.click)
+                    state.pendingBolus = nil
+                    state.isConfirmationBolusViewActive = false
+                }
+                label: {
+                    Text("Cancel")
+                }
+                if isCrownLeftOriented {
+                    Spacer().frame(width: elementSize / 2)
+                }
             }
         }
         .focusable(true)